Saltstack 简单入门

  1. 云栖社区>
  2. 博客>
  3. 正文

Saltstack 简单入门

技术小胖子 2017-11-17 15:52:00 浏览737
展开阅读全文

saltstack (http://www.saltstack.com) 是一个服务器基础架构集中化管理平台,开始于2011年的一个项目,具备配置和管理、远程执行、监控等功能,一般可以理解成简化版puppet(http://puppetlabs.com)和加强版的func(https://fedorahosted.org/func)。saltstack基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCrypto、Pyjinja2、python-msgpack和PyYAML)等构建。Saltstack具备如下特点。

1、部署简单、方便

2、支持大部分UNIX/Linux及Windows

3、主从集中化管理

4、配置简单、功能强大、扩张性强

5、主控端(master)和被控端(minion)基于证书认证,安全可靠。

6、支持API及自定义模块、可通过Python轻松扩展。


通过部署Saltstack环境 我们可以在成千上万台服务器上做到批量执行名命令,根据不同的业务特性进行配置集中化管理、分发文件、采集服务器数据、操作系统基础及软件包管理等。因此 Saltstack是运维人员提高工作效率、规范业务配置与操作的利器。目前Saltstack已经趋向成熟。用户群及社区活跃度都不错,同事官方也开放了不少子项目,具体可访问https://github.com/saltstack 获得。


一 :Saltstack的安装

Saltstack的不同角色服务安装非常简单,建议采用yum源方式来实现部署。

      1.业务环境说明:

       为了方便理解,通过虚拟化环境部署了两组业务功能服务器进行演示。操作系统版本为CentOS release 6.4 自带Python2.6.6 相关服务器信息如下:(CPU核数及Nginx根目录的差异化是为方便生成动态配置的要求。)。

角色 ID  IP 组名 CPU核数 Nginx根目录
Master TEST-ID 192.168.137.7 - - -
minion NODE1 192.168.137.8 webserver 2 /www
minion NODE2 192.168.137.9 webserver 2 /data
minion NODE3 192.168.137.10 web2group 2 /www
minion NODE4 192.168.137.11 web2group 2 /www


    2.    安装EPEL

    由于目前RHEL官网yum源还没有Saltstack的安装包支持,因此现安装EPEL作为部署Saltstack的默认yum源。安装过程不在详述。

    

    3.开始安装。

        主控端安装。

1
2
3
yum install salt-master -y
chkconfig salt-master on
service salt-master start

       被控端安装

1
2
3
yum install salt-minion -y
chkconfig salt-minion on
service salt-minion start

    4.  Saltstack防火墙配置

    在主控端添加TCP 4505 4506的规则,而在被控端无需配置防火墙,原理是被控直接与主控的zeromq建立长连接,接受广播到的任务信息并执行,具体操作是添加两条iptables 规则:

1
2
iptables -A INPUT -m state --state new -m tcp -p tcp --dport 4505 -j ACCEPT
iptables -A INPUT -m state --state new -m tcp -p tcp --dport 4506 -j ACCEPT

  5. 更新Saltstack配置及安装测试

   Saltstack分两种角色,一种是master 主控端 另一种是minion 被控端 安装完毕后需要对两种角色的配置文件进行修改,具体如下:

   主控端配置:

【/etc/salt/master】

 

1
2
3
4
5
6
7
8
#绑定master通信IP
interface: 192.168.137.7
#自动认证,避免手动运行salt-key来确认证书信息
auto_accept: True
#指定Saltstack文件根目录位置
file_roots:
   base:
     /srv/salt

 重启Saltstack salt-master服务器使配置生效。具体如下:

1
service salt-master restart

    被控端配置:

 【/etc/salt/minion】

1
2
3
4
#指定master主机IP
master: 192.168.137.7
#修改被控端主机识别ID,建议使用操作系统名来配置
id: NODE1

重启Saltstack salt-minion服务器使配置生效。具体如下:

1
service salt-minion restart

   测试安装结果。

   通过test模块的ping方法 可以确认指定被控端设备与主控端是否建立信任关系,连通性是否正常,探测所有被控端采用 '*' 来代替ID 即可 具体如下:

1
2
3
4
5
6
7
8
9
[root@localhost ~]# salt 'NODE1' test.ping
NODE1:
    True
[root@localhost ~]# salt '*' test.ping
NODE1:
    True
NODE2:
    True
[root@localhost ~]#

   当/etc/salt/master没有配置auto_accept: True时,需要通过salt-key命令来进行证书认证,具体操作如下:

salt-key -L  显示已经或者未认证的被控端ID,Accepted Keys为已认证 Unaccepted Keys 为未认证。

salt-key -D 删除所有认证主机id证书

salt-key -d id, 删除单个id证书

salt-key -A 接受所有id证书请求

salt-key -a id 接受单个id证书请求。


二:利用Saltstack远程执行命令

    命令格式:salt '<操作目标>' <方法> [参数]

    示例:查看被控主机的内容使用情况

   salt '*' cmd.run 'free -m'

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~]# salt '*' cmd.run 'free -m'
NODE1:
                 total       used       free     shared    buffers     cached
    Mem:          1989        678       1311          0         74        276
    -/+ buffers/cache:        327       1662
    Swap:         2015          0       2015
NODE2:
                 total       used       free     shared    buffers     cached
    Mem:          1989        674       1315          0         74        276
    -/+ buffers/cache:        323       1666
    Swap:         2015          0       2015
[root@localhost ~]#

其中针对<操作目标>,Saltstack提供了多种方法对被控端主机(id)进行过滤。下面列举常用的具体参数。

  -E,--pcre,通过正则表达式进行匹配。示例:测试web字符开头的主机ID名是否连通 命令:  

1
2
3
4
5
6
7
salt -E '^WEB.*' test.ping 运行结果如下:
[root@localhost ~]# salt -E '^web.*' test.ping
web2:
    True
web1:
    True
[root@localhost ~]#

-L,--list  以主机id名列表的形式进行过滤,格式与Python列表相似。即不同主机id名称使用逗号分隔。示例: 获取主机id名为web1、web2;获取完整的操作系统发行版名称 命令如下:

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# salt -L 'web1,web2' grains.item osfullname
web1:
    ----------
    osfullname:
        CentOS
web2:
    ----------
    osfullname:
        CentOS
[root@localhost ~]#

-G,--grain  根据被控主机的grains(后面详述)信息匹配过滤格式为:

'<grainvalue>:<glob expression>'   例如:过滤内核为Linux的主机可以写成'kernel:Linux',如果同时需要正则表达式的支持可切换成--grain-pcre参数来执行。示例:获取主机发行版本号为6.8的Python版本号,命令:

1
2
3
4
5
6
[root@localhost ~]# salt -G 'osrelease:6.8' cmd.run 'python -V'
web1:
    Python 2.6.6
web2:
    Python 2.6.6
[root@localhost ~]#


-I,--pillar,根据被控主机的pillar(后面详述)信息进行匹配过滤,格式为"对象名称:对象值" 例如 过滤所有具备'apache:httpd' pillar值的主机。示例:探测具有"nginx:root: /data"信息的主机连通性 如下:

salt -I 'nginx:root:/data' test.ping

1
2
3
..........
...........
............

其中pillar属性配置文件如下:

1
2
nginx:
   root: /data


-N,--nodegroup 根据主控端master配置文件中的分组名称进行过滤(主机信息支持正则表达式、grain、条件运算符等)通常根据业务类型划分,不通业务具备相同的特点,包括部署环境,应用平台、配置文件等。举例分组配置信息如下:

【/etc/salt/master】

1
2
3
nodegroups:
   web1group: 'L@web1,web2'
   webserver: 'L@web1,web2'

其中 ,L@表示后面的主机id格式为列表,即主机id以逗号分隔;G@表示以grain格式描述, S@表示以IP子网或者地址格式描述。

     示例:探测webserver被控主机的连通性,如下:

1
2
3
4
5
6
[root@localhost ~]# salt -N webserver test.ping
web2:
    True
web1:
    True
[root@localhost ~]#


-C,--compound,根据条件运算符not、and、or去匹配不通规则的主机信息,示例 探测以we开头并且操作系统版本为CentOS的主机连通性。如下:

1
2
3
4
5
6
[root@localhost ~]# salt -C 'E@^we.* and G@os:CentOS' test.ping
web2:
    True
web1:
    True
[root@localhost ~]#

其中,not语句不能作为一个条件执行,不过可以通过以下方法来规避,示例:探测非SN开头的主机连通性,命令如下:

1
2
3
4
5
6
[root@localhost ~]# salt -C '* and not E@^SN.*' test.ping
web2:
    True
web1:
    True
[root@localhost ~]#

-S,--ipcidr,根据被控主机的IP地址或IP子网进行匹配。示例:

1
2
3
4
5
6
7
8
9
[root@localhost ~]# salt -S 192.168.0.0/16 test.ping
web1:
    True
web2:
    True
[root@localhost ~]# salt -S 192.168.137.9 test.ping
web2:
    True
[root@localhost ~]#


三:Saltstack常用模块及API

Saltstack提供了非常丰富的功能模块,涉及操作系统的基础功能,常用工具支持等,更多模块信息见官网模块介绍http://docs.saltstack.com/ref/modules/all/index.html。当然 也可以通过sys模块列出当前版本支持的模块 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
[root@localhost /]# salt 'web1' sys.list_modules
web1:
    - acl
    - aliases
    - alternatives
    - apache
    - archive
    - artifactory
    - at
    - blockdev
    - bridge
    - btrfs
    - buildout
    - cloud
    - cmd
    - composer
    - config
    - container_resource
    cp
    cron
    - data
    - defaults
    - devmap
    dig
    - disk
    - django
    - dnsmasq
    - dnsutil
    - drbd
    - elasticsearch
    - environ
    - etcd
    - event
    - extfs
    file
    - gem
    - genesis
    - git
    - grains
    - group
    - grub
    - hashutil
    - hg
    - hipchat
    - hosts
    - http
    - img
    - incron
    - ini
    - introspect
    - ip
    - iptables
    - jboss7
    - jboss7_cli
    - key
    - kmod
    - locale
    locate
    - logrotate
    - lowpkg
    - lvm
    - match
    - mine
    - modjk
    mount
    - network
    - nginx
    - openstack_config
    - pagerduty
    - partition
    - pillar
    - pip
    - pkg
    - pkg_resource
    - postfix
    ps
    - publish
    - pyenv
    quota
    - raid
    - random
    - random_org
    - rbenv
    - ret
    rsync
    - runit
    - rvm
    - s3
    - saltutil
    - schedule
    - scsi
    - sdb
    - seed
    - serverdensity_device
    - service
    - shadow
    - slack
    - smtp
    - sqlite3
    ssh
    - state
    - status
    - supervisord
    - svn
    - sys
    - sysctl
    - syslog_ng
    - system
    test
    - timezone
    - user
    - vbox_guest
    - virtualenv
    - webutil
    - xfs
[root@localhost /]#


接下来抽取常见的模块进行介绍,同时也会列举模块的API使用方法。API的原理是通过调用master client模块,实例化一个LocalClient对象,再调用cmd()方法来实现的,一下是API实现的test.ping的示例:

1
2
3
4
import salt.client
client = salt.client.LocalClient()
ret = client.cmd('web1','test.ping')
print ret

结果以一个标准的Python字典形式的字符串返回,可以通过eval()函数转换成Python的字典类型,方便后续的业务逻辑处理,程序运行结果如下

1
{'WEB1'True}


【1 Archive模块】

功能:实现系统层面的压缩包调用,支持gunzip gzip rar tar unrar unzip 等

示例:

采用gunzip解压/tmp/sourcefile.txt.gz包

1
salt '*' archive.gunzip /tmp/sourcefile.txt.gz

采用gzip压缩/tmp/sourcefile.txt文件

1
2
3
4
5
6
7
8
9
10
11
salt '*' archive.gzip /tmp/sourcefile.txt
#运行结果如下:
[root@localhost ~]# salt 'web1' archive.gzip /etc/nginx/nginx.conf
web1:
[root@localhost ~]#
 
#web1节点的/etc/nginx/目录如下:
[root@web1 nginx]# ls
conf.d          koi-utf  mime.types  nginx.conf.gz       scgi_params   win-utf
fastcgi_params  koi-win  modules     nginx.conf.rpmsave  uwsgi_params
[root@web1 nginx]#

API调用:

1
client.cmd('*','archive.gunzip',['/tmp/sourcefile.txt.gz'])


【2 cmd模块】

功能:实现远程的命令调用执行 默认具备root操作权限,使用时需要评估风险

示例:

获取所有被控主机的内存使用情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
salt '*' cmd.run "free -m"
#执行结果如下:
[root@localhost ~]# salt '*' cmd.run "df -H"
web2:
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/vg_serv-lv_root
                           19G   12G  6.0G  66% /
    tmpfs                 1.1G   13k  1.1G   1% /dev/shm
    /dev/sda1             500M   84M  386M  18% /boot
web1:
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/vg_serv-lv_root
                           19G   12G  6.0G  66% /
    tmpfs                 1.1G   13k  1.1G   1% /dev/shm
    /dev/sda1             500M   84M  386M  18% /boot
[root@localhost ~]#

在web1主机运行test.sh脚本,其中script/test.sh存放在file_roots指定的目录,该命令会做两个动作,首先同步test.sh到minion的cache目录(如同步到/var/cache/salt/minion/files/base/script/test.sh);运行脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
salt 'web1' cmd.script salt://script/test.sh
#创建 /srv/salt 目录,把调试好的 shell 脚本 test.sh 放到 /srv/salt 目录下
#执行结果如下:
[root@localhost ~]# salt '*' cmd.script salt://test.sh
web1:
    ----------
    pid:
        21592
    retcode:
        0
    stderr:
    stdout:
        OK...........................
web2:
    ----------
    pid:
        2663
    retcode:
        0
    stderr:
    stdout:
        OK...........................
[root@localhost ~]#

API调用

1
client.cmd('web1','cmd.run',['free -m'])


【3 cp模块】

功能:实现远程文件、目录的复制、以及下载URL文件等操作

示例:

将指定被控主机的/etc/hosts文件复制到被控主机本地的salt cache目录(/var/cache/salt/minion/localfiles)

1
salt '*' cp.cache_local_file /etc/hosts

将主服务器file_roots指定位置下的目录复制到被控机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
salt '*' cp.get_dir salt://path/to/dir /minion/dest
#本例复制一个名为nali的目录,先将目录复制到/srv/salt目录下:
#执行结果如下:
[root@localhost ~]# salt '*' cp.get_dir salt://nali /etc
web2:
    /etc/nali/INSTALL
    /etc/nali/LICENSE
    /etc/nali/Makefile
    /etc/nali/README
    /etc/nali/bin/nali
    /etc/nali/bin/nali-dig
    /etc/nali/bin/nali-nslookup
    /etc/nali/bin/nali-ping
    /etc/nali/bin/nali-tracepath
    /etc/nali/bin/nali-traceroute
    /etc/nali/bin/nali-update
    /etc/nali/bin/qqwrynali
    /etc/nali/config.h
    /etc/nali/config.mak
    /etc/nali/configure
    /etc/nali/libqqwry/qqwry.c
    /etc/nali/libqqwry/qqwry.h
    /etc/nali/nali.c
    /etc/nali/share/QQWry.Dat
    /etc/nali/share/nali.pl
    /etc/nali/share/nali.sh
web1:
    /etc/nali/INSTALL
    /etc/nali/LICENSE
    /etc/nali/Makefile
    /etc/nali/README
    /etc/nali/bin/nali
    /etc/nali/bin/nali-dig
    /etc/nali/bin/nali-nslookup
    /etc/nali/bin/nali-ping
    /etc/nali/bin/nali-tracepath
    /etc/nali/bin/nali-traceroute
    /etc/nali/bin/nali-update
    /etc/nali/bin/qqwrynali
    /etc/nali/config.h
    /etc/nali/config.mak
    /etc/nali/configure
    /etc/nali/libqqwry/qqwry.c
    /etc/nali/libqqwry/qqwry.h
    /etc/nali/nali.c
    /etc/nali/share/QQWry.Dat
    /etc/nali/share/nali.pl
    /etc/nali/share/nali.sh
[root@localhost ~]#

将主服务器file_roots指定位置下的文件复制到被控机

1
2
salt '*' cp.get_file salt://path/to/file /mini/dest
#文件和目录同理。

下载URL内容到被控机指定位置

1
2
3
4
5
6
7
8
salt '*' cp.get_url http://www.salshdot.org /tmp/index.html
#执行结果如下:
[root@localhost ~]# salt '*' cp.get_url http://www.baidu.com /tmp/index.html
web2:
    /tmp/index.html
web1:
    /tmp/index.html
[root@localhost ~]#

API调用

1
client.cmd('*','cp.get_file',[' salt://path/to/file ',' /minion/dest'])


【4 cron模块】

功能:实现被控主机的crontab清单.

示例:

查看指定被控主机 root用户的crontab清单

1
2
3
4
5
6
7
8
9
salt 'web1' cron.raw_cron root
#执行结果如下:
[root@localhost ~]# salt 'web1' cron.raw_cron root
web1:
    #Ansible: test_check
    * 5,2 * * * ls -l > /root/ll.txt
    #Ansible: test_checks
    * 5 * * * ls -l > /root/ll.txt
[root@localhost ~]#

为指定被控主机 root用户添加/usr/local/weekly任务作业

1
2
3
4
5
6
7
8
9
10
11
12
13
salt 'web1' cron.set_job root '*' '*' '*' '*' /usr/local/weekly
#运行结果如下:
[root@localhost ~]# salt 'web1' cron.set_job root '*/5' '*' '*' '*' '*' "/bin/bash /etc/viewcpu.sh" viewcpu
web1:
    new
[root@localhost ~]#
 
# web1任务如下:
[root@web1 ~]# crontab -l
# Lines below here are managed by Salt, do not edit
# viewcpu
*/5 * * * * /bin/bash /etc/viewcpu.sh
[root@web1 ~]#

删除指定的被控主机 root用户crontab的/usr/local/weekly任务作业

1
2
3
4
5
6
salt 'web1' cron.rm_job root /usr/local/weekly
#执行结果如下:
[root@localhost ~]# salt 'web1' cron.rm_job root "/bin/bash /etc/viewcpu.sh"
web1:
    removed
[root@localhost ~]#

API调用

1
client.cmd('web1','cron.set_job',['root','*','*','*','*' 1,'/usr/local/weekly'])


【5 dnsutil模块】

功能:实现被控主机通用DNS相关操作

示例

添加指定被控主机hosts的主机配置项

1
2
3
4
5
6
7
8
9
10
salt '*' dnsutil.hosts_append /etc/hosts 127.0.0.1 ad1.yuk.com,ad2.yuk.com
#运行结果如下:
[root@localhost ~]# salt '*' dnsutil.hosts_append /etc/hosts 127.0.0.1 www.a.com
web1:
    The following line was added to /etc/hosts:
    127.0.0.1 www.a.com
web2:
    The following line was added to /etc/hosts:
    127.0.0.1 www.a.com
[root@localhost ~]#

删除指定被控主机hosts的主机配置项

1
2
3
4
5
6
7
8
salt '*' dnsutil.hosts_remove /etc/hosts ad1.yuk.com
#运行结果如下:
[root@localhost ~]# salt '*' dnsutil.hosts_remove /etc/hosts www.a.com
web2:
    None
web1:
    None
[root@localhost ~]#

API调用

1
client.cmd('*','dnsutil.hosts_append',['/etc/hosts','127.0.0.1','ad1.yuk.com'])


【6 file模块】

功能:被控主机文件常见操作,包括文件读写、权限、查找、效验等。

示例:

效验所有被控主机/etc/fstab文件的MD5是否为XXXXXXXXXXXXXXXXXX,一致则返回True

1
salt '*' file.check_hash /etc/fstab md5=XXXXXXXXXXXXXXXXXXXXXX

效验所有被控主机文件的加密信息支持MD5  sha1 sha224 sha256 sha384 sha512如下:

1
salt '*' file.get_sum /etc/passwd md5

修改所后被控主机/etc/passwd文件的属组、用户权限、等价于 chown root:root /etc/passwd

1
salt '*' file.chown /etc/passwd root root

复制所有被控主机本地/path/to/src 文件到本地的

1
2
3
4
5
6
7
8
salt  '*' file.copy  /path/to/src /path/to/dest
#运行结果如下:
[root@localhost ~]# salt '*' file.copy /etc/fstab /tmp/fstab
web1:
    True
web2:
    True
[root@localhost ~]#

检查所有被控主机/etc目录是否存在,存在则返回True,检查文件是否存在使用file.file_exists方法

1
2
3
4
5
6
7
8
salt '*' file.directory_exists /etc
#执行结果如下:
[root@localhost ~]# salt '*' file.directory_exists /etc
web1:
    True
web2:
    True
[root@localhost ~]#

获取所有被控主机/etc/passwd的stats信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
salt '*' file.stats /etc/passwd
#运行结果如下:
[root@localhost ~]# salt 'web1' file.stats /etc/passwd
web1:
    ----------
    atime:
        1469920681.98
    ctime:
        1469920663.82
    gid:
        0
    group:
        root
    inode:
        677190
    mode:
        0644
    mtime:
        1469461866.61
    size:
        1253
    target:
        /etc/passwd
    type:
        file
    uid:
        0
    user:
        root
[root@localhost ~]#

获取所有被控主机 /etc/passwd的权限mode,如 755 644

1
2
3
4
5
6
7
8
salt '*' file.get_mode /etc/passwd
#运行结果如下:
[root@localhost ~]# salt '*' file.get_mode /etc/passwd
web1:
    0644
web2:
    0644
[root@localhost ~]#

修改所有被控主机/etc/passwd的权限为0644

1
salt '*' file.set_mode /etc/passwd 0644

在所有被控主机创建/opt/test目录

1
2
3
4
5
6
7
8
salt '*' file.mkdir /opt/test
#执行结果如下:
[root@localhost ~]# salt '*' file.mkdir /opt/testfile
web2:
    None
web1:
    None
[root@localhost ~]#

将所有被控主机/etc/httpd/httpd.conf文件的LogLevel参数的warn值修改为info

1
salt '*' file.sed /etc/httpd/httpd.conf 'LogLevel warn' 'LogLevel info'

给所有被控主机的/tmp/test/test.conf文件追加内容"Maxclient 100"

1
salt '*' file.append /tmp/test/test.conf "maxclient 100"

删除所有被控主机的/tmp/foo文件

1
2
3
4
5
6
7
8
salt '*' file.remove /tmp/foo
#执行结果如下:
[root@localhost ~]# salt '*' file.remove /opt/test
web1:
    True
web2:
    True
[root@localhost ~]#

API调用

1
client.cmd('*''file.remove ',['/tmp/foo'])

【7 iptables模块】

功能:被控主机iptables支持

示例:

在所有被控制端主机追加(append)、插入(insert)iptables模块,其中INPUT为输入链,

1
2
3
4
5
6
7
8
9
salt '*' iptables.append filter INPUT rule='-m state --state RELATED,ESTABLISHE -j ACCEPT'
salt '*' iptables.insert filter INPUT position=3 rule='-m state --state RELATED,ESTABLISHED -j ACCEPT'
运行结果如下:
[root@localhost ~]# salt '*' iptables.append filter INPUT rule='-m state --state RELATED,ESTABLISHE -j ACCEPT'
web2:
    True
web1:
    True
[root@localhost ~]#


在所有被控端主机删除指定链编号为3(position=3)或指定存在的规则

1
2
salt '*' iptables.delete filter INPUT position=3
salt '*' iptables.delete filter INPUT rule='-m state --state RELATED,ESTABLISHED -j ACCETP'

保存所有被控端主机规则到本硬盘(/etc/sysconfig/iptables)

1
2
3
4
5
6
7
8
salt '*' iptables.save /etc/sysconfig/iptables
#运行结果如下:
[root@localhost ~]# salt '*' iptables.save /etc/sysconfig/iptables
web2:
    Wrote 1 lines to "/etc/sysconfig/iptables"
web1:
    Wrote 1 lines to "/etc/sysconfig/iptables"
[root@localhost ~]#

API调用:

1
client.cmd('web1','iptables.append',['filter','INPUT','rule=\'-p tcp --sport 80 -j ACCEPT\''])

【8 network模块】

功能:返回被控主机网络信息

示例:

在指定被控主机'web'获取dig、ping 、traceroute 目录域名信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
salt 'web1' network.dig www.qq.com
salt 'web1' network.ping www.qq.com
salt 'web1' network.traceroute 
#运行结果如下:
[root@localhost ~]# salt 'web1' network.dig www.qq.com
web1:
 
    ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6 <<>> www.qq.com
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4973
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
 
    ;; QUESTION SECTION:
    ;www.qq.com.                        IN      A
 
    ;; ANSWER SECTION:
    www.qq.com.         164     IN      A       59.37.96.63
    www.qq.com.         164     IN      A       14.17.32.211
    www.qq.com.         164     IN      A       14.17.42.40
 
    ;; Query time: 27 msec
    ;; SERVER: 114.114.114.114#53(114.114.114.114)
    ;; WHEN: Sun Jul 31 07:30:06 2016
    ;; MSG SIZE  rcvd: 76
     
[root@localhost ~]# salt 'web1' network.ping www.qq.com
web1:
    PING www.qq.com (14.17.42.40) 56(84) bytes of data.
    64 bytes from 14.17.42.40: icmp_seq=1 ttl=53 time=3.94 ms
    64 bytes from 14.17.42.40: icmp_seq=2 ttl=53 time=4.06 ms
    64 bytes from 14.17.42.40: icmp_seq=3 ttl=53 time=7.13 ms
    64 bytes from 14.17.42.40: icmp_seq=4 ttl=53 time=4.76 ms
 
    --- www.qq.com ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 3011ms
    rtt min/avg/max/mdev = 3.941/4.976/7.132/1.284 ms


获取指定被控主机'web1'的MAC地址

1
2
3
4
5
salt 'web1' network.hwaddr eth1
#运行结果如下:
[root@localhost ~]# salt 'web1' network.hwaddr eth1
web1:
    00:0c:29:7a:59:6d

检查指定被控主机'web1'是否属于10.0.0.0/16子网范围 属于则返回True

1
2
3
4
5
6
7
8
salt 'web1' network.in_subnet 10.0.0.0/16
#执行结果如下:
[root@localhost ~]# salt 'web1' network.in_subnet 10.0.0.0/16
web1:
    False
[root@localhost ~]# salt 'web1' network.in_subnet 192.168.0.0/16
web1:
    True

获取指定被控主机'web1'的网卡配置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
salt 'web1' network.interfaces
#执行结果如下:
[root@localhost ~]# salt 'web1' network.interfaces
web1:
    ----------
    eth1:
        ----------
        hwaddr:
            00:0c:29:7a:59:6d
        inet:
            |_
              ----------
              address:
                  192.168.137.8
              broadcast:
                  192.168.137.255
              label:
                  eth1
              netmask:
                  255.255.255.0
        inet6:
            |_
              ----------
              address:
                  fe80::20c:29ff:fe7a:596d
              prefixlen:
                  64
              scope:
                  link
        up:
            True
    lo:
        ----------
        hwaddr:
            00:00:00:00:00:00
        inet:
            |_
              ----------
              address:
                  127.0.0.1
              broadcast:
                  None
              label:
                  lo
              netmask:
                  255.0.0.0
        inet6:
            |_
              ----------
              address:
                  ::1
              prefixlen:
                  128
              scope:
                  host
        up:
            True
[root@localhost ~]#

获取指定被控主机'web1' 的IP地址配置信息

1
2
3
4
5
6
salt 'web1' network.ip_addrs
#运行结果如下:
[root@localhost ~]# salt 'web1' network.ip_addrs
web1:
    - 192.168.137.8
[root@localhost ~]#

获取指定别空主机'web1'的子网信息

1
2
3
4
5
salt 'web1' network.subnets
#运行结果如下:
[root@localhost ~]# salt 'web1' network.subnets
web1:
    - 192.168.137.0/24

API调用

1
client.cmd('web1','network.ip_addrs')

【9 pkg包管理模块】

功能:被控主机程序包管理如 yum.apt-get等。

示例:

为所有被控主机安装PHP环境,根据不同系统发行版调用不同安装工具进行部署,如REDHAT平台的yum,等价于yum -y install php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
salt '*' pkg.install php
#运行结果如下:
[root@weizhongke ~]# salt '*' pkg.install gd-devel
web1:
    ----------
    fontconfig-devel:
        ----------
        new:
            2.8.0-5.el6
        old:
    freetype-devel:
        ----------
        new:
            2.3.11-17.el6
        old:
    gd-devel:
        ----------
        new:
            2.0.35-11.el6
        old:
    libX11-devel:
        ----------
        new:
            1.6.3-2.el6
        old:
    libXau-devel:
        ----------
        new:
            1.0.6-4.el6
        old:
    libXpm-devel:
        ----------
        new:
            3.5.10-2.el6
        old:
    libjpeg-turbo-devel:
        ----------
        new:
            1.2.1-3.el6_5
        old:
    libpng-devel:
        ----------
        new:
            2:1.2.49-2.el6_7
        old:
    libxcb-devel:
        ----------
        new:
            1.11-2.el6
        old:
    xorg-x11-proto-devel:
        ----------
        new:
            7.7-13.el6
        old:
...........................

卸载所有被控主机的PHP环境

1
2
3
4
5
6
7
salt '*' pkg.remove php
#运行结果如下:
[root@localhost ~]# salt '*' pkg.remove php
web2:
    ----------
web1:
    ----------

升级所有被控主机的软件包

1
salt '*' pkg.upgrade

API调用

1
client.cmd('*','pkg.remove',['php'])

【10 Service服务模块】

功能:被控主机程序包服务管理

示例:

开启(enable)、禁用(disable) nginx开机自启动服务

1
2
salt '*' service.enable nginx
salt '*' service.disable nginx

针对nginx服务的reload、restart、start、stop、status操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
salt '*' service.reload nginx
salt '*' service.restart nginx
salt '*' service.start nginx
salt '*' service.stop nginx
salt '*' service.status nginx
 
#运行结果如下:
[root@localhost ~]# salt '*' service.enable httpd
web1:
    True
web2:
    True
[root@localhost ~]# salt '*' service.disable httpd
web1:
    True
web2:
    True
[root@localhost ~]# salt '*' service.start httpd
web1:
    True
web2:
    True
[root@localhost ~]# salt '*' service.stop httpd
web1:
    True
web2:
    True
[root@localhost ~]# salt '*' service.status httpd
web2:
    False
web1:
    False
[root@localhost ~]#

API调用

1
client.cmd('*','service.stop',['nginx'])

【11其他模块】

通过上面的10个模块,基本上已经覆盖日常运维操作.Saltstack还提供了user(系统用户模块)、group(系统组模块)、partition(系统分区模块)、puppet(puppet管理模块)、system(系统重启关机模块)、timezone(时区管理模块)、nginx(Nginx管理模块)、mount(文件系统挂在模块)、等等,更多内容见官网介绍:http://docs.saltstack.com/ref/modules/all/index.html#all-salt-modules。当然,我们也可以通过Python扩展功能来满足要求。


【grains】组件

grains是Saltstack最重要的组件之一,grains的作用是收集被控主机的基本信息,这些信息通常都是一些静态的数据,包括CPU、内核、操作系统、虚拟化等,在服务器端可以根据这些信息进行灵活定制,管理管可以利用这些信息对不通业务进行个性化配置。官网提供的用来区分不同操作系统的示例如下:(采用jinja模板)

1
2
3
4
5
{% if grains['os'] == 'Ubuntu' %}
host: {{ grains['host'] }}
{% elif grains['os'] == 'CentOS' %}
host: {{ grains['fqdn'] }}
{% endif %}

示例中CentOS发行版主机将被" host:{{ grains['fqdn'] }}" 匹配,以主机web1(CentOS 6.4)为例,最终得到 " host:web1".同时,命令行的匹配操作系统发行版本为CentOS的被控端可以通过-G 参数来过滤,如

salt -G 'os:CentOS' test.ping。

【grains常用操作命令】

匹配内核版本为4.6.3的主机:

salt -G 'kernelrelease:4.6.3' cmd.run 'uname -a'

运行结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost ~]# salt -G 'kernelrelease:4.6.3' cmd.run 'uname -a'
web2:
    Linux web2 4.6.3 #1 SMP Wed Jun 29 06:29:23 CST 2016 x86_64 x86_64 x86_64 GNU/Linux
web1:
    Linux web1 4.6.3 #1 SMP Wed Jun 29 06:29:23 CST 2016 x86_64 x86_64 x86_64 GNU/Linux
 
# 过滤OS版本为x86_64位的系统
[root@localhost ~]# salt -G 'osarch:x86_64' cmd.run 'uname -a'
web2:
    Linux web2 4.6.3 #1 SMP Wed Jun 29 06:29:23 CST 2016 x86_64 x86_64 x86_64 GNU/Linux
web1:
    Linux web1 4.6.3 #1 SMP Wed Jun 29 06:29:23 CST 2016 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]#

获取指定主机或者所有主机的grains信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57