学一学:dtstat   一个可以取代vmstat,iostat,netstat和ifstat这些命令的多功能产品

yum install dstat   (sudo apt-get install dstat)                 --- 小 Q

---------------------------------------------------------------------------------------------------

三种工作方式: 本地, c/s, 基于ssh(不用安装agent)
三个大功能   :  远程命令执行,配置管理(服务,文件,cron,用户,组),云管理
支持的系统   : 大多数都支持,windows上不支持安装master

【准备工作】

首先至少准备两台机器如果可以三台虚拟机是很好的

10.0.18.92 服务端
10.0.18.91 客户端
两台机器关闭selinux清空iptables规则并保存设置hostname

编辑/etc/sysconfig/network  定义hostname

92上hostname   master.teng.com

91上hostname   client.teng.com

server上:
yum install -y epel-release
yum install -y salt-master  salt-minion
启动
/etc/init.d/salt-master start
/etc/init.d/salt-minion start

client上:
yum install -y epel-release
yum install -y salt-minionclient上:
vim  /etc/salt/minion          //指定server的ip,大概是16行,修改或增加

master: 10.0.18.92
id: client          //注意冒号后有空格

注:这个id不定义也没有关系,如果不定义,那么master会以客户端的hostname来显示,若定义了就按id定义的名字来显示了,这个id可以不和hostname一致,但定义了id后,也应该在/etc/hosts里面定义记录

/etc/init.d/salt-minion start

【证书认证】

server:

添加证书认证 salt-key -a  client.teng.com

删除证书认证 salt-key -d  client.teng.com

签名所有证书 salt-key  -A

查看签名证书 salt-key

wKioL1gAQ1eQ1SbbAAAiBItXonc223.png

客户端证书:/etc/salt/pki/minion/minion.pub

服务端证书:/etc/salt/pki/master/master.pub

服务端认证的客户端证书:/etc/salt/pki/master/minions/10.0.18.91

客户端认证的服务端证书:/etc/salt/pki/minion/minion_master.pub

如果总是无法认证证书,可以在这方向查一查。

注:如果更改id,需要重启客户端才可生效。

【配置管理】

server上:
vim  /etc/salt/master    //搜索找到 file_roots,入口文件和配置文件路径

file_roots:           //打开如下内容的注释
  base:
    - /srv/salt      // - 后要有空格
mkdir  /srv/salt
cd /srv/salt

vim /srv/salt/top.sls    //加入如下内容,入口文件,必须要有的

base:
  '*':             //*  代表所有认证过的客户端
    - apache

意思是,在所有的客户端上执行 apache模块,这种模块和puppet类似

vim  /srv/salt/apache.sls  //加入如下内容,这个就是apache模块的内容

apache-service:          //自定义的id名字             
   pkg.installed:       // 包安装函数
       - names:        //这里如果只有一个服务,那么就可以写成 –name: httpd 不用再换一行了。
      - httpd      
      - httpd-devel  
  service.running:       //启动运行的函数      
      - name: httpd    
      - enable: True    //表示开机启动

执行: salt  '*'  state.highstate

【远程执行命令】

示例1: salt '*' test.ping    //这里的*表示所以已经签名的客户端,也可以指定其中一个
示例2: salt '*' cmd.run   'df -h'    //对所有认证过的客户端执行 df  -h

注:此部分支持通配列表和正则,比如两台客户端web10 web11,可写成 salt 'web*' 或salt 'web1[02]' 

salt 命令使用','时 :salt -L 'web10,web11' 

salt 命令使用正则时:salt -E 'web(10|11)

salt 命令使用gains :salt -G  ........

salt 命令使用pillar: salt  -l   .........     (后面会介绍)

【grains】

grains是在minion启动时收集到的一些信息,比如操作系统类型、网卡ip等。

salt 'client.teng.com' grains.ls 列出所有的grains项目名字
salt 'client.teng.com' grains.items 列出所有grains项目以及值
grains的信息并不是动态的,并不会时时变更,它只是在minion启动时收集到的。

grains可以用收集到的一些信息,做配置管理工作。
grains支持自定义信息,有两种方式客户端配置和服务端配置,如下

客户端:

a.  配置文件中打开 default_include: minion.d/*.conf 在此目录下建.conf结尾文件,写入如下格式:

                  grains:  #必须标明是grains

                  items:10

                  .......

b.  cd  /etc/salt 目录下,命名文件grains的文件写入如下格式  vim grains

                   role: nginx

                   env:  teng

重启minion服务

服务端:

在/srv/salt/ 创建_grains目录,编写grains文件,需要返回一个字典,例如:

cd  /srv/salt/_grains/

cat nginx.py 
  def nginx(): 
   nginx={} 
   nginx['nginx']='1.5.5' 
   return nginx

执行同步:salt ‘id或IP’ state.highstate

命令:

获取客户端全部的item值  :salt  '*'  grains.items

获取item为role和env的值: salt  '*'  grains.item   role env

在有role规则输出为nginx的客户端上执行命令:salt -G role:nginx cmd.run 'hostname'

【pillar】

pillar和grains不一样,它是在master上定义的,并针对minion定义的一些信息。像一些比较重要的数据(密码)可以存在pillar里,还可以定义变量等。

查看指定minion的pillar值(一般都为空):salt  'client.teng.com'  pillar.items

配置自定义pillar:  vim  /etc/salt/master
找到如下配置  : 去掉前面的警号

pillar_roots:
  base:
    - /srv/pillar

mkdir /srv/pillar
vi  /srv/pillar/test.sls   //内容如下

conf: /etc/123.conf

vi  /srv/pillar/top.sls   //内容如下,入口文件

base:
  'client.teng.com':     //客户主机名
    - test               //入口文件找当期那目录下的test.sls文件

重启master :/etc/init.d/salt-master restart

或刷新pillar :salt  '*'   saltutil.refresh_pillar

验证: salt  '*' pillar.itme test

或者: salt  -I 'conf:/etc/123.conf'  test.ping

【目录文件拷贝】

首先搭建一个小的开发环境:

环境: base, dev(开发环境), test(测试环境), prod(生产环境)

vim  /etc/salt/master
file_roots:
  base:
    - /srv/salt/
  dev:
    - /srv/salt/dev
  test:
    - /srv/salt/test
  prod:
    - /srv/salt/prod

mkdir   /srv/salt/{dev,test,prod}

vi  /srv/salt/top.sls

base:
  '*':
    -  file

vim /srv/salt/file.sls

file_test:                // 相当于puppet的类吧
    file.managed:       //文件用的模块   
        - name: /tmp/2.com   
        - source: salt://test/123/1.txt  
       - user: root   
       - group: root    
       - mode: 644
file_dir:  
    file.recurse:                   //文件使用file.managed  
      - name: /tmp/123            //复制到客户端后的地址 
      - source: salt://test/123   // salt://===/srv/salt   
      - user: root      
      - group: root   
      - file_mode: 644   
      - dir_mode: 755            // 拷贝到客户端后的权限  
      - mkdir: True   
       - clean: True           //加上它之后,源删除文件或目录,目标也会跟着删除,否则不会删除
      - include_empty: True

saltstack 文件操作 state有多种方法,最典型的file.managed、file.recurse、file.append等手法;

https://docs.saltstack.com/en/latest/ref/states/all/salt.states.file.html 

【远程命令】

cat /srv/salt/ex.sls
cmd_test:
  cmd.run:
    - names:
    - touch /tmp/111.txt
    - mkdir /tmp/1233
    - user: root

cat /srv/salt/top.sls

base:
  '*':
    - ex

扩展一:将所有的命令写道master的一个文件中,然后依次执行(类似脚本):

cat /srv/salt/test/exe.sls

cmd_test:
  cmd.script:     //脚本要指定script
    - source: salt://test/1.sh
    - user: root
cat /srv/salt/test/1.sh
#!/bin/bash
touch /tmp/111.txt
if [ -d /tmp/1233 ]
then
rm -rf /tmp/1233
fi

cat /srv/salt/top.sls

base:
  '*':
    - test.exe      //格式目录.文件

扩展二:条件语句onlyif,unless,前者如果条件成立执行下面命令,后者与其相反。

cmd_test:
  cmd.run:
    - unless: test -d /tmp/1233    //如果这个目录不存在,执行下面命令
    - name: mkdir /tmp/1233
    - user: root

或者:

cmd_test:
  cmd.run:
    - name: touch /tmp/111.txt
    - onlyif: test -f /tmp/111.txt    //如果这个文件存在,创建文件

执行:salt ‘id或IP’ state.highstate

【任务计划】

cat /srv/salt/top.sls

base:
  '*':
    - test.exe
cmd_test:  
    cmd.run:   
     - unless: test -d /tmp/1233   
     - name: mkdir /tmp/1233   
     - user: root
 cron_test:
  cron.present:
    - name: /bin/touch /tmp/111.txt
    - user: root
    - minute: '*'
    - hoinur: 20
    - daymonth: '*'
    - month: '*'
    - dayweek: '*'
//  删除cron
//  cron.absent:
//    - name: /bin/touch /tmp/111.txt
//   两者不能共存,要想删除一个cron,那之前的present就得删除掉。

注:‘*’需要用单引号引起来。
当然我们还可以使用file.managed模块来管理cron,因为系统的cron都是以配置文件的形式存在的。

【常用命令】

salt '*' cp.get_file salt://test/1.txt   /tmp/123.txt    //拷贝master上的文件到客户端

salt '*' cp.get_dir salt://test/conf  /tmp/           // 拷贝目录

注:会自动在客户端创建conf目录,所以后面不要加conf,如果写成 /tmp/conf/  则会在/tmp/conf/目录下又创建conf

salt '*' cmd.script salt://test/1.sh        //执行shell脚本

salt-run manage.up               //显示存活的minion:
----------------------------------------------------------------------------------------------------

salt编译安装nginx  http://blog.cunss.com/?p=272
参考文档 :http://blog.cunss.com/?p=255
http://www.iyunv.com/forum-142-1.html