SaltStack是一个开源的、新的基础平台管理工具,使用Python语言开发,同时提供Rest API方便二次开发以及和其他运维管理系统进行集成。相对于出道比较早的Puppet,SaltStack先天的优势就是简单、易用,可以非常快速的在团队中推广和使用,而且运行多平台。
SaltStack目前拥有四大主要功能
- 远程执行:就是在管理节点上实现在上百台、上千台机器上同时执行一个命令。
- 配置管理:也可以称之为状态管理,你可以描述一个状态。例如,某台机器要安装Nginx软件包、Nginx必须是启动的状态、Nginx有一个配置文件(内容和某个地方的一样)。你用一种描述语法描述出来后交给SaltStack,SaltStack就可以帮你实现,而不用你手动进行Nginx软件包的安装、配置文件的修改、启动等。
- 云管理:SaltStack有一个组件叫作salt-cloud,它可以帮你自动化的进行云主机的创建和管理,支持很多公有云或私有云,例如AWS、阿里云、HP云、OpenStack、CloudStack等。
- 事件驱动:事件驱动基础设施是SaltStack最强大也是最神秘的功能,前面的远程执行和配置管理是最基础的的,事件驱动是指SaltStack在日常运行中可以产生和捕捉事件,并根据捕捉到的事件触发对应的操作。
SaltStack的四种运行方式
- Local:在本地运行或者说单台使用SaltStack
- Minion/Master: 传统的客户端/服务器端(C/S)架构
- Syndic: 使用代理实现架构扩展,用于管理更多的节点
- Salt SSH: 无须安装客户端,直接通过SSH通信
目标机器匹配方法
SaltStack有以下几种方式来选择目标机器,灵活而又强大。大的来讲分为两大类:
1. 基于Minion ID
Minion ID是客户端(minion)的唯一标识符。可以在minion配置文件里面使用ID选项进行配置,如果不指定,其默认是主机的FQDN名。Minion ID是不能变动的,因为在进行key认证的时候,生成的文件名是以Minion ID命名的。如果Minion发生变动,就需要使用salt-key -d删除老的Minion ID,然后重新加入新的Minion ID。
- Globbing(通配符)
- regex(正则表达式)
- list(列表)
2. 不基于Minion ID
- 子网/IP地址
- Grains
- Grains PCRE
- Pillar
- Compound matchers(复合匹配)
- Node groups(节点组)
- Batching execution(批处理执行)
演示
指定Minion ID是最直接的选择目标的方法
查看所有minion节点
[root@salt ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
128.docker.itnotebooks.com
Rejected Keys:
授权minion节点
可以修改/etc/salt/master的配置auto_accept:True自动认证
[root@salt ~]# salt-key -a 128.docker.itnotebooks.com
The following keys are going to be accepted:
Unaccepted Keys:
128.docker.itnotebooks.com
Proceed? [n/Y] y
Key for minion 128.docker.itnotebooks.com accepted.
- salt-key -L: 显示已经或未认证的minion节点,Accepted Keys为已认证清单
- salt-key -D: 删除所有Minion节点的证书
- salt-key -d id: 删除单个minion节点的证书
- salt-key -A: 接受所有minion节点的请求
- salt-key -a id: 接受单个minion节点的请求
Globbing是指在Minion ID的基础上,通过通配符来定位Minion。SaltStack默认使用Shell风格通配符(如“” “?” “[]”)来匹配Minion ID。不过需要注意的是,使用salt命令时必须将’’放在单引号中,或是用’’转义,用来避免shell解析。
匹配所有itnotebooks.com域的所有minion
[root@salt ~]# salt '*.itnotebooks.com' test.ping
匹配docker后面单个任意字符的Minion
[root@salt ~]# salt 'docker?.itnotebooks.com' test.ping
匹配docker节点1到节点3的Minion
[root@salt ~]# salt 'docker[1-3].itnotebooks.com' test.ping
匹配docker不是节点1和节点3的Minion
[root@salt ~]# salt 'docker[!13].itnotebooks.com' test.ping
list和直接Minion ID都是最基本的模式,可以列出每一个Minion ID来指定多个目标机器,使用选项’-L’
[root@salt ~]# salt -L 'docker1.itnotebooks.com,docker2.itnotebooks.com' test.ping
Salt可以使用Perl风格的正则表达式来匹配Minion ID,使用选项-E
[root@salt ~]# salt -E 'linux-(node1|node2)*' test.ping
规范的Minion ID可以很好的反映出该服务器运行的相关服务及所在位置
redis-node1-redis03-idc04-soa.itnotebooks.com
- redis-node1:运行的服务是Redis,这是第一个节点
- redis03:说明这个redis是Redis集群编号03里面的节点
- idc04:这台服务器运行在编号04的IDC机房中
- soa:这台服务器是给SOA服务使用的
- itnotebooks.com:运行的服务器是itnotebooks.com业务
也可以使用IP地址或CIDR子网来指定目标,目前仅支持IPv4的地址
[root@salt ~]# salt -S '192.168.18.33' test.ping
[root@salt ~]# salt -S '192.168.18.0/24' test.ping
也可以使用Grains对Trageting进行匹配,使用选项’-G’
匹配所有CentOS系统的Minion
[root@salt ~]# salt -G 'os:CentOS' test.ping
通过Grain匹配非常灵活,如果你想进行更复杂的基于Grains的匹配,SaltStack提供了Grain PCRE,可以在Grains的基础上使用正则表达式
[root@salt ~]# salt --grain-pcre 'os_family:Red(Hat|Flag)' test.ping
Pillar的数据可以用来定位Minion,为定位Minions提供了灵活性和终极控制
[root@salt ~]# salt -I 'apache:httpd' test.ping
Compound matchers(混合匹配)可以使用布尔操作符连接多个目标条件。混合匹配可以用前面讨论的多种方式实现精确的匹配。混合配匹配默认使用Globbing,如果要使用其它匹配方式,需要加上类型前缀字母如下表所示。
复合匹配中也可以使用and、or、not操作符,例如要匹配主机名以及webserv开始且运行Debain系统的Minion,还能匹配主机名满足正则表达式web-dc1-srv.*的Minion
[root@salt ~]# salt -C 'webserv* and G@os:Debian or E@web-dc1-srv.*' test.ping
- G表示用shell通配符匹配Grains
- E表示用正则表达式匹配Minion ID
需要注意的是not不能用于第一个条件,需要用时可以像下面这样写:
[root@salt ~]# salt -C '* and not G@kernel:Darwin' test.ping
Node group是在Master中nodegroup用复合条件字义的一组Minion
[root@salt ~]# vim /etc/salt/master
nodegroups:
group1: '[email protected],linux-node2.itnotebooks.com'
[root@salt ~]# systemctl restart salt-master
[root@salt ~]# salt -N group1 test.ping
linux-node2.itnotebooks.com
True
linux-node1.itnotebooks.com
True
远程执行命令-查看内存使用
[root@salt ~]# salt 'linux-node1.itnotebooks.com' cmd.run 'free -m'
total used free shared buff/cache available
Mem: 1838 749 119 0 969 887
Swap: 0 0 0
远程执行命令-查看操作系统类型
[root@salt ~]# salt 'linux-node1.itnotebooks.com' grains.item osfullname
linux-node1.itnotebooks.com:
osfullname: CentOS
远程执行命令-查看指定发行版本号为6.4的主机的python版本
[root@salt ~]# salt -G 'osrelease:6.4' cmd.run 'python -V'
linux-node1.itnotebooks.com:
Python 2.6.6
远程执行命令-解压文件
[root@salt ~]# salt 'linux-node1.itnotebooks.com' archive.gunzip /tmp/jdk-8.1.0.gz
远程执行命令-压缩文件
[root@salt ~]# salt 'linux-node1.itnotebooks.com' archive.gzip /tmp/test.txt
除了上面所提到的外,其它类似的模块还有很多很多
如cp、cron、file、iptables、network、dnsuti、service、pkg等等,详细的自己用过就知道了,当然你也可以在cmd.run里面去完成这一切