系统环境:

Centos 6.x 

服务端(salt-master):10.1.2.11

客户端(salt-minion):10.1.2.10、10.1.2.11、10.1.2.12

安装:

rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm服务端:yum install salt-master 客户端:yum install salt-minion

服务端配置:

vim /etc/salt/master interface: 0.0.0.0pidfile: /var/run/salt-master.pidlog_file: /var/log/salt/masterkey_logfile: /var/log/salt/key

客户端配置:

vim  /etc/salt/minion master: 10.1.2.11pidfile: /var/run/salt-minion.pidid: centos12log_file: /var/log/salt/minionkey_logfile: /var/log/salt/key

如果一切顺利,请继续!

saltstack 主控端是依靠openssl证书来与受控端主机认证通讯的,受控端启动后会发送给主控端一个公钥证书文件,在主控端用 salt-key 命令来管理证书。

salt minion和master的认证过程:

minion在第一次启动时,会在/etc/salt/pki/minion/下自动生成minion.pem(private key), minion.pub(public key),然后将minion.pub发送给master

master在接收到minion的public key后,通过salt-key命令accept minion public key,这样在master的/etc/salt/pki/master/minions下的将会存放以minion id命名的public key, 然后master就能对minion发送指令了。

证书管理:

[root@localhost ~]# salt-key -LAccepted Keys:Unaccepted Keys:centos10centos11centos12Rejected Keys:[root@localhost ~]# salt-key -AThe following keys are going to be accepted:Unaccepted Keys:centos10centos11centos12Proceed? [n/Y] yKey for minion centos10 accepted.Key for minion centos11 accepted.Key for minion centos12 accepted.

通信测试:

[root@localhost salt]# salt '*' test.pingcentos10:    Truecentos12:    Truecentos11:    True

注意,通配符 *代表所有minion,假如你收到“True”,证明你已经成功安装和配置完成salt stack。

Salt远程执行及语法结构:

命令格式:salt '
 [arguments]

1. target:

target部分允许你指定那些minion应该运行执行. 默认的规则是使用glob匹配minion id. 例如:

salt '*' test.pingsalt '*.example.org' test.ping

Targets可以使用Grains系统来通过minion的系统信息进行过滤:

salt -G 'os:Ubuntu' test.ping

更多参见Grains系统: 

Targets也可以使用正则表达式:

salt -E 'virtmach[0-9]' test.ping

Targets也可以指定列表:

salt -L 'foo,bar,baz,quo' test.ping

或者在一个命令中混合使用多target类型:

salt -C 'G@os:Ubuntu and webser* or E@database.*' test.ping

2. function

funcation是module提供的功能. Salt内置了大量有效的functions. 列出minions上的所有有效functions:

salt '*' sys.doc

显示当前所有有效的minions:

salt '*' test.ping

运行一个任意的shell命令:

salt '*' cmd.run 'uname -a'

所有模块列表:http://docs.saltstack.cn/zh_CN/latest/ref/modules/all/index.html

3. arguments:

function通过空格来界定参数:

salt '*' cmd.exec_code python 'import sys; print sys.version'

可选的, 也支持keyword参数:

salt '*' pip.install salt timeout=5 upgrade=True

Salt配置管理:

很多最强大、最有用的工程解决方案都是基于简单原则建立起来的。Salt States 也竭尽全力做到那样:K.I.S.S.(Keep It Stupidly Simple 简单到愚蠢)

默认,Salt使用PyAMl语法() 作为它的模板文件的格式,但是其他很多模板语言在Salt中是可以使用的。一定要按照正确的格式书写YAML,比如它使用到两个空格代替tab。

一个典型的SLS 文件常常看起来像这样的YAML:

httpd:            #第一行是这一组数据的ID,被叫做ID 声明  pkg:            #第二行和第四行是状态声明的开始,所以分别使用了包和服务状态。    - installed   #第三行和第五行是要运行的函数。  service:    - running    - require:    #第六行,是关键词require.它叫做需求声明,它保证httpd服务仅在httpd包被成功安装后才会启动。      - pkg: httpd

SLS文件命名:

使用子目录来做组织是个很好的选择:

a.每个子目录描述一个资源;

b.webserver.dev 用来表示子目录 webserver/dev.sls

init.sls 在一个子目录里面表示引导文件,也就表示子目录本身, 所以webserver/init.sls就是表示webserver;

如果同时存在webserver.sls和 webserver/init.sls,则 webserver/init.sls 被过滤,webserver.sls将被用来表示 webserver.

启动配置管理:

打开master配置文件,找到file_roots行,取消如***释!

# vim /etc/salt/masterfile_roots:  base:    - /srv/salt

创建基础配置文件:

# vim /srv/salt/top.slsbase:  '*':    - servers

创建server.sls文件

# vim /srv/salt/server.sls   #或者vim /srv/salt/server/init.slshttpd:         pkg:      - installed   service:    - running    - watch:      - pkg: httpd      - file: /etc/httpd/conf/httpd.conf      - user: apache  user.present:    - uid: 87    - gid: 87    - home: /var/www/html    - shell: /sbin/nologin    - require:      - group: apache  group.present:    - gid: 87    - require:       - pkg: apache/etc/httpd/conf/httpd.conf:  file.managed:    - source: salt://apache/httpd.conf    - user: root    - group: root    - mode: 644

触发配置minion:

#所有的sls文件准备好以后,最后一步是告诉Salt配置远程机器。state.highstate 是触发这些同步的命令。使用先前的语法格式,目标位所有机器,键入以下格式的命令: salt '*' state.highstate

注:

文件被Salt管理2种方式:1.用`file.managed`状态声明;2.使用,`file`状态声明,然后加一个`managed`属性给那个状态声明。

/mnt/test.txt  file.managed:    - source: salt://src/test.txt    - user: root    - group:root    ........#OR/mnt/test.txt  file:    - managed    - source: salt://src/test.txt    .........

待续.....

案例:为每一个minion客户端部署zabbix-agent,并确保该进程正常启动。

zabbix_epel:  file.managed:    - name: /root/zabbix-release-2.2-1.el6.noarch.rpm    - source: salt://src/zabbix-release-2.2-1.el6.noarch.rpm    - user: root    - group: root  cmd.run:    - name: rpm -ivh /root/zabbix-release-2.2-1.el6.noarch.rpm    - unless: test -f /etc/yum.repos.d/zabbix.repo    - require:      - file: zabbix_epelzabbix-agent:  pkg:    - installed    - require:      - file: zabbix_epel  service:    - running    - watch:      - file: /etc/zabbix/zabbix_agentd.conf    - require:      - pkg: zabbix-agent/etc/zabbix/zabbix_agentd.conf:  file.managed:    - source: salt://src/zabbix_agentd.conf    - user: root    - group: root    - mode: 644

更多请参阅:

Saltstack知识库: 

Saltstack Doc目录: