saltstack自动化工具
一、saltstack自动化工具
SaltStack是一个功能强大、灵活且高效的自动化运维工具。它基于Python开发,采用零配置通信和事件驱动的架构,能够帮助系统管理员和开发人员轻松管理成千上万台服务器,实现配置管理、远程执行、云管理等核心任务
1、核心概念
1、master和minion
-
master: saltstack的主服务器,负责管理和控制多个minion,master发送命令,收集数据并进行协调
-
minion 被管理的节点,接收master命令并执行
2、state
-
state: 描述系统应该处于的状态,通常用yaml格式编写,安装某个软件包,配置某个服务
-
state file 存储state文件,通常以.sls结尾
3、pillar(动态变量/数据)
-
存储敏感数据和配置信息,密码,密钥,是master特定的,在master上面定义
-
存储被控节点的密码,或者配置管理需要读取的一些变量
4、grains(静态变量/数据)
-
在被控节点收集主机信息,类似于ansible的facts变量,同时支持自定义的grains的变量,grains的所有变量和信息都在被管理节点上定义
-
描述minion的特性,ip地址,内存等
5、modules
- 功能单元,用于执行特定的任务,saltstack提供了丰富的内置模块,执行命令,管理软件包,用户等
6、runner
- 在master上执行的任务,用于进行一些复杂的管理操作,管理批量任务,监控等
7、reactor
- 事件响应系统,根据触发的事件自动执行预定义的操作

2、saltstack工作流程
-
命令发送:管理员在master上发送命令
-
命令分发:master将命令分发给目标minion
-
命令执行:minion接收到命令后执行相应的操作
-
结果返回:minion将执行结果返回给master
-
结果汇总:master汇总并展示执行结果
-
saltstack工作原理
-
master和minion之间需要进行认证,所有角色都会产生2把密钥,一把公钥,一把私钥
-
当minion启动后会向master节点发送公钥,当master节点接收公钥后,就会向minion注册
-
当认证完成后,就会通过4505和4506来进行任务的发布和执行,由master发布任务,minion执行任务
-
3、安装saltstack
- 官网的地址 https://saltproject.io/
1、配置yum源
# 每个节点都需要配置
[root@server yum.repos.d]# curl -fsSL https://github.com/saltstack/salt-install-guide/releases/latest/download/salt.repo | sudo tee /etc/yum.repos.d/salt.repo
# 上面的地址是官网的,特别的慢,下面换成了阿里云的地址了,发现阿里云的地址没有维护了,还是使用官网的repo文件
master需要安装2个软件包
# 安装master控制节点程序
yum -y install salt-master
# 安装saltstack对ssh的插件的支持
yum -y install salt-ssh
minion节点只需要安装一个包
yum -y install salt-minion
2、配置域名解析
- 每个节点都需要配置
# 等会发送公钥的时候,就能识别到了
[root@node2 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.50.21 node1
192.168.50.22 node2
192.168.50.20 master
3、master节点配置
- 安装软件包后,查看生成的文件有哪些
[root@server salt]# rpm -qc salt-master
/etc/salt/master
[root@server salt]# rpm -qc salt-ssh
/etc/salt/roster
[root@server salt]# ls
master master.d pki roster
-
其中master是主要的配置文件,master.d里面是存放配置文件的
-
master是默认的配置文件,不需要动他,只需要在master.d里面配置即可
-
以.conf结尾
[root@server master.d]# cat master.conf
interface: 0.0.0.0 # master 监听所有网络接口上的请求
publish_port: 4505 # 使用4505发布消息,通信的端口
ret_port: 4506 # 4506接收minion返回的结果,定义认证,数据传输的端口
pki_dir: /etc/salt/pki/master # 定义收到minion(公钥)证书存放的位置
file_roots: # 定义状态配置文件,sls文件的目录
base: # base是通用的环境,默认的环境
- /srv/salt/
pillar_roots: # 定义pillar变量存储的位置
base:
- /srv/pillar/
- file_roots 定义状态配置的目录,如果定义了不同的目录,就相当于是定义不同的环境,运维,开发,测试等
# 创建目录
[root@server master.d]# mkdir /srv/salt /srv/pillar
[root@server master.d]# ls /srv/
pillar salt
# 启动salt-master服务
systemctl start salt-master
4、minion配置
[root@node1 minion.d]# cat minion.conf
master: 192.168.50.20 # 可以是是字符串,或者是ip地址,但必须被正常解析到才行,在生产中使用ip地址找到master
id: node1 # 指的是客户端的名称,必须被dns解析,因此之前的域名解析是必须要做的
[root@node2 minion.d]# cat minion.conf
master: 192.168.50.20
id: node2
# 启动服务
systemctl start salt-minion
5、配置master和minion之间的认证
- master接收minion发送的公钥
[root@server salt]# salt-key
Accepted Keys:
Denied Keys:
Unaccepted Keys: # 没有接受的公钥,发现有2个
node1
node2
Rejected Keys:
# 现在来接受一下
# -a 接受某个公钥
[root@server salt]# salt-key -a node1
The following keys are going to be accepted:
Unaccepted Keys:
node1
Proceed? [n/Y] y
Key for minion node1 accepted.
# -A 接受所有公钥
[root@server salt]# salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
node2
Proceed? [n/Y] y
Key for minion node2 accepted.
# 查看公钥状态
[root@server salt]# salt-key
Accepted Keys:
node1
node2
Denied Keys:
Unaccepted Keys:
Rejected Keys:
# 这个里面就是被控节点发送的密钥在主控节点上面了
[root@server minions]# ls
node1 node2
-
salt-key的用法 发现所有客户端发给控制节点的密钥
-
-a 指定接受某个公钥
-
-A 接受全部
-
-d 删除某一个公钥
-
-D 删除全部
-
-j 拒绝指定密钥
-
-L 列出全部密钥
-
-
如果salt-key 等待的时间很久的话,检查域名解析是否正常配置了,能否解析到控制节点和被控节点
6、测试一下,是否成功
# 返回了true,表示成功了
[root@server salt]# salt "*" test.ping
node1:
True
node2:
True
4、saltstack操作方法
1、saltstack执行任务
- 通过模块来执行任务
salt 选项 目标 函数 参数
# 选项 控制salt命令本身的行为,控制超时,等等信息(可选的),控制怎么定义主机,是以哪种方式来控制的主机
# 目标 指的定义目标的方式(通过哪种方式来定义主机)
# 函数 salt执行的具体动作,被组织在模块中
# 参数 指的是模块的参数
2、目标主机的选择方式
使用通配符来指定
[root@server ~]# salt "node*" test.ping
node2:
True
node1:
True
使用列表的方式
[root@server ~]# salt -L "node1,node2" test.ping
node1:
True
node2:
True
使用正则匹配主机
[root@server ~]# salt -E "^n" test.ping
node2:
True
node1:
True
通过pillar指定主机
# 需要定义pillar变量文件
[root@server pillar]# ls
test.sls top.sls
[root@server pillar]# cat test.sls
stacktest: openeuler
[root@server pillar]# cat top.sls
base:
'node1':
- test
# 哪些主机有这些变量,从而进行选择
[root@server master.d]# salt -I 'stacktest:openeuler' test.ping
node1:
True
通过grains指定主机
# 通过ip地址来选择node2主机
[root@server ~]# salt -G "ipv4:192.168.50.22" test.ping
node2:
True
混合方式指定主机
[root@server ~]# salt -C "G@ipv4:192.168.50.21 or node*" test.ping
node1:
True
node2:
True
通过网络信息指定主机
[root@server ~]# salt -S "192.168.50.0/24" test.ping
node1:
True
node2:
True
通过主机组的方式来指定主机
[root@server master.d]# cat nodegroups.conf
nodegroups: # 顶层写nodegroups
group1: # 主机组
node1
group2:
node2
# 上面只能定义主机组,里面不能写变量文件
[root@server master.d]# salt -N 'group1' test.ping
node1:
True
3、grains变量
- 存放minion主机的信息,也可以自定义变量
收集被控节点的静态数据
# grains这个关键字
[root@server master.d]# salt "node1" grains.items
# 有非常多的数据,类似ansible的facts变量
过滤指定的grains的数据
# 注意不需要items
# 过滤出磁盘信息
[root@server master.d]# salt "node1" grains.item disks
node1:
----------
disks:
- sr0
- sda
# 过滤出ip地址
[root@server master.d]# salt "node1" grains.item ipv4
node1:
----------
ipv4:
- 127.0.0.1
- 192.168.50.21
- 192.168.100.21
自定义grains变量
# 在被控节点上面创建grains变量
[root@node1 minion.d]# cat grains.conf
grains: # 必须以grains开头
webserver: nginx # key: value 键值对的方式
webversion: 1.0
# 重启salt-minion服务
systemctl restart salt-minion
# 搜索自定义grains变量
[root@server salt]# salt "node1" grains.item webserver
node1:
----------
webserver:
nginx
4、pillar变量
主要定义被控节点的敏感信息
# 在/srv/pillar下面创建文件
[root@server master.d]# ls /srv/pillar/
test.sls top.sls
# 自定义变量文件
[root@server master.d]# cat /srv/pillar/test.sls
stacktest: openeuler
# 定义这个变量在哪个环境下面使用,哪些主机能使用
[root@server master.d]# cat /srv/pillar/top.sls
base: # base这个环境下使用
'node1': # node1这个主机 * 表示任何主机
- test # 使用test.sls这个文件里面的变量
# 2个配置文件 就是说 在base这个环境下面,node1可以使用test.sls这个文件里面的变量
测试pillar变量
[root@server master.d]# salt "node1" pillar.items
node1:
----------
stacktest:
openeuler
刷新所有pillar变量信息
[root@server master.d]# salt "*" saltutil.refresh_pillar
node2:
True
node1:
True
5、模块的操作
查询被控端支持的所有模块
[root@server salt]# salt "node1" sys.list_modules
查询模块详细和帮助
# 一个模块里面有很多的函数
[root@server salt]# salt "node1" sys.doc pkg
# 里面有案例
查询模块中一个具体的函数用法
# 模块.函数名
[root@server salt]# salt "node1" sys.doc user.rename
查询某个模块所有的函数
[root@server pillar]# salt 'node1' sys.doc pkg| grep ^pkg
pkg.available_version:
pkg.clean_metadata:
pkg.del_repo:
pkg.diff:
pkg.download:
pkg.file_dict:
pkg.file_list:
pkg.get_locked_packages:
pkg.get_repo:
pkg.group_diff:
pkg.group_info:
pkg.group_install:
pkg.group_list:
pkg.groupinstall:
pkg.hold:
pkg.info_installed:
pkg.install:
pkg.latest_version:
pkg.list_downloaded:
pkg.list_holds:
pkg.list_installed_patches:
pkg.list_patches:
pkg.list_pkgs:
pkg.list_repo_pkgs:
pkg.list_repos:
pkg.list_updates:
pkg.list_upgrades:
pkg.mod_repo:
pkg.modified:
pkg.normalize_name:
pkg.owner:
pkg.parse_arch:
pkg.purge:
pkg.refresh_db:
pkg.remove:
pkg.services_need_restart:
pkg.unhold:
pkg.update:
pkg.upgrade:
pkg.upgrade_available:
pkg.verify:
pkg.version:
pkg.version_cmp:
在minion节点安装vsftpd
[root@server salt]# salt "*" pkg.install vsftpd
node2:
----------
vsftpd:
----------
new:
3.0.3-33.oe2203sp3
old:
node1:
----------
vsftpd:
----------
new:
3.0.3-33.oe2203sp3
old:
5、常见的模块
1、pkg模块
- 无论是rpm还是deb的包,都可以安装
2、network模块
- 测试网络的
3、service模块
4、cmd模块
- cmd.run shell命令
5、file模块
6、state模块
- 状态管理模块
[root@server ~]# salt "node1" status.meminfo
6、批量配置管理
state模块,通过state模块的配置文件,sls状态配置文件,在这个文件定义多个任务实现配置的批量管理
-
top.sls 是全局的环境管理配置文件,用来决定那套环境,哪些主机使用sls的配置文件
-
test.sls 用来定义具体的功能实现,也就是模块要执行的任务都在这个文件定义
案例1
# 非常的麻烦,因为这个模块的参数需要查询,,查询帮助命令里面又没有,需要看其他的文档,或者问ai,这个yaml格式没有ansible方便
[root@server base]# cat test.sls
install_httpd: # 任务的描述信息
pkg.installed:
- name: httpd
start_service:
service.running:
- name: httpd
modify_index_html:
file.managed:
- name: /var/www/html/index.html
- contents: "hello openeuler"
# salt 主机 state.sls 文件名,不需要.sls结尾
[root@server base]# salt "*" state.sls test
Summary for node1
------------
Succeeded: 3 (changed=2) # 成功了
Failed: 0
------------
Total states run: 3
Total run time: 244.840 ms
如果又多个sls文件的话
[root@server base]# ls
euler.sls test.sls top.sls
[root@server base]# cat top.sls
base:
"*":
- test
- euler
# 会自动的去base目录下面站这2个文件
[root@server base]# salt "*" state.apply
# 或者 state.highstate 跟上面一样的效果
- 多套环境下指定salt * state.apply saltenv=base(环境名)
总结
- 有点麻烦,yaml文件的模块参数需要自己去找,没有ansible-doc方便

浙公网安备 33010602011771号