SaltStack部署与应用基础
在当今数字化时代,大规模 IT 系统的管理已经成为一个复杂而繁琐的任务。为了提高系统管理的效率和准确性,自动化工具成为各企业不可或缺的一部分。Saltstack 作为一款强大的自动化和配置管理工具,在业界得到了广泛的应用和认可。本文将介绍Saltstack的基本概念和特点,以及其在实际应用场景中的优势。
一、Saltstack 基础
在生产环境中,服务器往往不只是一台,有可能是成千上万台。对于运维人员来说,如果单独的对每台服务器进行管理,工作难度比较大。这时部署自动化运维就可以尽可能安全、高效的完成这些工作。
一般,会把自动化运维工具划分为两类:一类是需要使用代理工具的,也就是基于专用的 Agent 程序来完成管理功能,如:Saltstack、Puppet、Func、Zabbix 等;另外一类是不需要配置代理工具的,可以直接基于 SSH 服务来完成管理功能,如:Ansible、Fabric 等。本章将主要介绍自动化运维工具Saltstack 是如何实现自动化运维部署的。下面是几款功能类似的自动化运维工具。
- Saltstack:是一个服务器基础设施管理工具,它具有配置管理、远程执行、监控等功能。Saltstack由 Python 语言编写,是非常简单易用和轻量级的管理工具。
- Ansible:是基于 Python 开发的,集合了众多优秀运维工具的优点,实现了批量运行命令、部署程序、配置系统等功能的自动化运维管理工具。默认通过 SSH 协议进行远程命令执行或下发配置,无需部署任何客户端代理软件,从而使得自动化环境部署变得更加简单。可同时支持多台主机并行管理,使得管理主机更加 便捷。
- Puppet:是基于 Ruby 开发的,支持 Linux、unix、windows 平台的自动化运维管理工具,可以针对用户、系统服务、配置文件、软件包等进行管理,有很强的扩展性,但远程执行命令相对较弱。
针对这几款自动化运维工具比较如下表所示:
通过部署 Saltstack 环境,可以在成千上万台服务器上批量执行命令,对于不同的业务进行集中管理、分发文件、采集数据、软件包管理等。有利于运维人员提高工作效率、规范业务配置和操作。
二、saltstack 原理
Saltstack 由 Master 和 Minion 构成,Master 是服务器端,表示一台服务器,Minion 是客户服务器端,表示多台服务器。
在 Master 上发送命令给符合条件的 Minion,Minion 就会执行相应的命令。Master 和 Minion 之间是通过 ZeroMQ(消息队列)进行通信。
Saltstack 的 Master 端监听 4505 与 4506 端口,4505 为 Saltstack 的消息发布端口,4506为 Saltstack 客户端与服务端通信的端口。Saltstack 客户端程序并不监听端口,当客户端启动后,会主动连接 Master 端注册,然后一直保持该 TCP 连接,而 Master 通过这条TCP 连接对客户端进行控制。如果连接断开,Master 对客户端将不能进行控制。但是,当客户端检查到连接断开后,会定期的向Master 端请求注册连接。
三、SaltStack部署
1.设置系统基本环境
按下列表格设置各个主机的主机名和hosts文件
2.关闭防火墙
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl enable firewalld
[root@localhost ~]# vim /etc/selinux/config
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
3.安装Master
将所需rpm包拷贝到服务器
[root@master ~]# rpm -ivh salt-3006.4-0.x86_64.rpm
警告:salt-3006.4-0.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 73d76b3f: NOKEY
准备中... ################################# [100%]
正在升级/安装...1:salt-3006.4-0 ################################# [100%]
[root@master ~]# rpm -ivh salt-master-3006.4-0.x86_64.rpm
警告:salt-master-3006.4-0.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 73d76b3f: NOKEY
准备中... ################################# [100%]
正在升级/安装...1:salt-master-3006.4-0 ################################# [100%]
备注:
以下软件包为扩展 saltstack 的可选组件。
salt-ssh:主要作用是不需要安装 minion,只要 ssh 协议开放,即可远程执行命令,可用作拿到一批新机器,批量配置时使用,也可以直接通过 salt-ssh 不安装 minion 进行管理。
salt-syndic:通过 syndic,可以建立多层级的 Salt拓扑,Syndic下的 Minions 即可通过 Syndic所在的 Master 进行管理,也可以通过 MasterOfMaster 及更高层级的 Master 进行管理,架构变得异常灵活.
salt-cloud:Salt cloud 目前已经提供了对腾讯云平台的管理支持,一些常见的云平台管理功能管理操作已经都可以做到通过 Saltcloud 集成到自有的技术平台上做统一的资源管理了
salt-api:salt-api 是我们通过 restfu1-api 调用 salt-master 的接口,且调用的时候必须通过认证才能调用,认证的用户为系统用户
4.安装 Minion
将所需 rpm 包拷贝到服务器
[root@minion01 ~]# rpm -ivh salt-3006.4-0.x86_64.rpm
警告:salt-3006.4-0.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 73d76b3f: NOKEY
准备中... ################################# [100%]
正在升级/安装...1:salt-3006.4-0 ################################# [100%]
[root@minion01 ~]# rpm -ivh salt-minion-3006.4-0.x86_64.rpm
警告:salt-minion-3006.4-0.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 73d76b3f: NOKEY
准备中... ################################# [100%]
正在升级/安装...1:salt-minion-3006.4-0 ################################# [100%]
5.配置Mastet
修改Master的配置文件
[root@master ~]# vim /etc/salt/masterinterface: 192.168.10.101
auto_accept: Truefile_roots:base:- /srv/saltnodegroups:group1: 'web01'group2: 'web02'pillar_opts: True
pillar_roots:base:- /srv/pillar
备注:
file roots:
base:
- /srv/sale
#开启 saltstack 文件根目录位置,注意这个目录默认没有创建,需要自己手动创建。
pillar opts: True
#开启 pillar 功能,同步文件功能
pillar roots:
base:
- /srv/pillar
#pillar 的主目录,需要自己创建
注意:
在设置主机组的时候可以同时写多个主机。
group1:'web01'组中有多个成员就用逗号隔开-->group1:'web01,web03'
修改后可以启动 Master,具体操作如下所示。
[root@master ~]# mkdir /srv/salt
[root@master ~]# mkdir /srv/pillar
[root@master ~]# systemctl start salt-master
[root@master ~]# systemctl enable salt-master
Created symlink from /etc/systemd/system/multi-user.target.wants/salt-master.service to /usr/lib/systemd/system/salt-master.service.
6.配置 Minion
修改 Minion 的配置文件,具体操作如下所示。
[root@minion01 ~]# vim /etc/salt/minionmaster: 192.168.10.101
id: web01
注意:
如果修改了 minion 端的 id, minion 会重新注册,向 master 发送新的 key,老的注册信息就失效了,但此时 master 仍然会连接老的 minion,于是就会报错,
解决方法:可以删除掉老的 minion 注册信息,目录/etc/salt/pki/master/minions,默认会使用minion 端的 ip 地址作为 key 名称。将以前注册的 ID 删掉,即可。
7.修改后可以启动 Minion
[root@minion02 ~]# systemctl start salt-minion
[root@minion02 ~]# systemctl enable salt-minion
当 Minion 启动后,会自动生成公钥私钥,并将公钥发送到 Master 端。Minion 不监听端口,全靠和 Master 保持长连接,可通过 netstat -an | grep Es 命令査看是否连接成功。至此 Saltstack 安装完成。
8.master 端查看minion 秘钥
在 minion 启动后,会连接master,并且会请求 master 为其签发证书,待证书签发完成后,代表master 可以信任该 minion,并且 minion 和 master 端的通信是经过加密的。我们可以通过 salt-key命令管理 minion 秘钥。
(1)master 端查看接受的 minion 端
[root@master ~]# salt-key -L
Accepted Keys:
web01
web02
Denied Keys:
Unaccepted Keys:
Rejected Keys:
(2)获取minion端指纹码
[root@master ~]# salt-key -f web01
Accepted Keys:
web01: b8:63:f1:70:d2:fd:7a:92:2e:7f:f2:80:6f:f0:ca:07:1d:a7:6c:d2:b5:0b:9e:5f:ca:2c:e0:7c:82:2e:72:79
(3)前往minion端验证此指纹码
[root@minion01 ~]# salt-call --local key.finger
local:b8:63:f1:70:d2:fd:7a:92:2e:7f:f2:80:6f:f0:ca:07:1d:a7:6c:d2:b5:0b:9e:5f:ca:2c:e0:7c:82:2e:72:79
四、 saltstack 基本命令使用
1.salt 命令格式
(1)使用帮助
[root@master ~]# salt --help
通过帮助信息我们可以发现,salt远程执行命令由五个部分组成:
- salt 命令本身
- 命令行选项
- 目标定位字符串
- salt 模块、函数
- 远程执行函数的参数
(2)下列命令展示了一个完成的 salt 命令格式:
[root@master ~]# salt --summary "*" cmd.run 'uptime'
web01:09:32:29 up 10 min, 1 user, load average: 0.00, 0.01, 0.00
web02:09:32:29 up 10 min, 1 user, load average: 0.00, 0.00, 0.00-------------------------------------------
Summary
-------------------------------------------
# of minions targeted: 2
# of minions returned: 2
# of minions that did not return: 0
# of minions with errors: 0
-------------------------------------------
备注:
--summary:显示命令的摘要信息
其他常用选项:
-v or --verbose:显示命令的详细描述信息
--out:可控制 salt 执行后的输出结果格式,例如--out=json|raw|nestedlquiet 等
2.在 Master 端测试 Minion
(1)测试模块--test
在 saltstack 中,有很多模块为运维人员提供了各种功能,其中用户环境测试的有个 test 模块,该模块提供了一系列专用的测试函数,利用这些测试函数,我们可以快速的对运维环境进行各项测试任务。
[root@master ~]# salt '*' test.ping
web01:True
web02:True
在上述命令中,test 指的是模块名,ping是该模块中的一个命令(函数)。这是一个很简单的探测主机是否存活的命令。通过该命令,我们发送了一条消息给一个或多个 minion,并高速它们运行 salt 内置的一个模块中的一个命令(函数)。在这个指令中,minion 端返回 true,代表此主机是存活的。
也可以利用 test.echo 函数用来在 minion 执行 echo 指令,并把结果回显到 master 终端。
[root@master ~]# salt web01 test.echo 'hello,web01'
web01:hello,web01
test 模块实际上还包含许多其他有用的函数,如何知道这些函数,就需要 sys 模块的list_functions 函数来实现了,sys.list_functions 用来査看指定模块所有的函数,其他函数的用法此处不在多做介绍,大家可以自行学习。
[root@master ~]# salt web01 sys.list_functions test
web01:- test.arg- test.arg_clean- test.arg_repr- test.arg_type- test.assertion- test.attr_call- test.collatz- test.conf_test- test.cross_test- test.deprecation_warning- test.echo- test.exception- test.false- test.fib- test.get_opts- test.kwarg- test.module_report- test.not_loaded- test.opts_pkg- test.outputter- test.ping- test.provider- test.providers- test.raise_exception- test.rand_sleep- test.rand_str- test.random_hash- test.retcode- test.sleep- test.stack- test.true- test.try- test.tty- test.version- test.versions- test.versions_information- test.versions_report
4.目标定位
在前面的例子中,对远程主机进行控制时,我们可以用主机的名字定位远程 minion 主机。但是在实际环境中,通常我们控制着成百上千的 minion 端主机,那么在不确定远程主机的准确名称的时候,或者要批量对多台主机进行控制时,又该如何灵活的定位所需的服务器呢?这里就可以使用全局匹配和正则匹配的方法。
(1)全局匹配
全局匹配指的是用通配符代表一批主机,在前面的命令中,我们已经使用过“*”。
在全局匹配中,除了“*”之外,还有“?”和“[ ]”。
- *:代表任意字符串,也可以是空字符串。
- ?:代表一个字符,但不可以代表空。
- [ ]:字符集合,例如[a~z]代表任意一个小写字母。
全局匹配的几个例子如下:
[root@master ~]# salt '*' test.ping
web02:True
web01:True
[root@master ~]# salt 'web*' test.ping
web01:True
web02:True
[root@master ~]# salt 'web??' test.ping
web01:True
web02:True
[root@master ~]# salt '[a-z]eb??' test.ping
web02:True
web01:True
(2)正则表达式匹配
如果需要执行更为复杂的匹配,我们可以使用正则表达式。salt 使用 Python 的 re 正则表达式模块。可以解析正则表达式(PCRE),正则表达式匹配需要配合命令行选项-E或-pcre。
常用的正则表达式的含义如下列各表所示。
元字符:
正则表达式中使用了很多元字符,用来表示一些特殊的含义或功能。
转义字符:
如果一些特殊功能的字符、元字符,不希望它有特定功能,而就是希望使用这个字符的话,可以采用在前面加斜杠"\"进行转义的方法。
特定字符集
正则表达式中的一些表示方法,可以同时匹配某个预定义字符集中的任意一个字符。
下面通过几个里展示一下 salt 正则表示是匹配方式。
完全匹配:
[root@master ~]# salt -E "web01" test.ping
web01:True
全局匹配
[root@master ~]# salt -E ".*" test.ping
web01:True
web02:True
以特定字符开头或结尾的匹配
[root@master ~]# salt -E "^web.*" test.ping
web01:True
web02:True
(3)列表匹配
有时候,我们只想匹配一个指定列表里面的主机并进行远程操作,这时可能全局匹配和正则匹配的方式都无法很好的完成任务,这种情况我们可以直接使用-L选项进行列表匹配
如果需要以组为单位控制整个主机组所有的主机,可以使用选项-N
[root@master ~]# salt -N group1 test.ping
web01:True
注意:
这里的 group1 是我们在 master 配置文件中指定的主机组的名称:
nodegroups:
group1:'webo1'
group2:'weba2'
5.salt-cp 批量拷贝文件
salt-cp 命令实现文件的拷贝。
[root@master ~]# salt-cp '*' /etc/hosts /opt
web01:----------/opt/hosts:True
web02:----------/opt/hosts:True
五、远程执行模块和函数
远程执行命令的最后一部分是我们需要运行的模块以及相关函数和对应的执行参数。模块可以认为是函数的逻辑分组,一系列的函数可以组合在一起构成一个模块。接下来列举一些常见的模块的基本用法。以体验 saltstak 的强大功能。
1.模块和函数的查询
(1)列出 minion 可用模块
模块为运维人员提供了很多功能,那么 minion 都可以使用哪些模块呢,我们可以使用sys.list modules”对模块进行查询。
[root@master ~]# salt "web01" sys.list_modules
web01:- acl- aliases- alternatives- archive- artifactory- baredoc
(2)列出某一模块的可用函数
不同的模块,他们的用法也各有区别,具体的用法体现在模块中的函数,那么某一个模块又有哪些函数构成,就可以使用“sys.list functions”进行查询。
[root@master ~]# salt "web01" sys.list_functions cmd
web01:- cmd.exec_code- cmd.exec_code_all- cmd.has_exec- cmd.powershell- cmd.powershell_all- cmd.retcode- cmd.run- cmd.run_all- cmd.run_bg- cmd.run_chroot- cmd.run_stderr- cmd.run_stdout- cmd.script- cmd.script_retcode- cmd.shell- cmd.shell_info- cmd.shells- cmd.tty- cmd.which- cmd.which_bin
(3)列出某一函数的具体用法
如此多的函数,到底大家怎么使用,我们就可以是“sys.doc”说明文档进行査看,以获取详细的帮助功能。
[root@master ~]# salt web01 sys.doc cmd.run
2.远程命令执行模块--cmd
(1)如需到多台主机上同时执行一条相同的命令:cmd.run
[root@master ~]# salt "*" cmd.run "ps aux | wc -l"
web01:168
web02:167
(2)显示更详细的执行信息的函数:cmd.run_all
[root@master ~]# salt "*" cmd.run_all "ps aux | wc -l"
web01:----------pid:1644retcode:0stderr:stdout:169
web02:----------pid:1636retcode:0stderr:stdout:167
(4)查看所有主机的磁盘信息,并设置该命令执行的超时控制
[root@master ~]# salt '*' cmd.run 'df -h' -t 5
web01:Filesystem Size Used Avail Use% Mounted ondevtmpfs 960M 0 960M 0% /devtmpfs 974M 8.0K 974M 1% /dev/shmtmpfs 974M 8.8M 965M 1% /runtmpfs 974M 0 974M 0% /sys/fs/cgroup/dev/mapper/centos-root 195G 2.1G 193G 2% //dev/sr0 4.4G 4.4G 0 100% /media/cdrom/dev/sda2 1014M 191M 824M 19% /boottmpfs 195M 0 195M 0% /run/user/0
web02:Filesystem Size Used Avail Use% Mounted ondevtmpfs 960M 0 960M 0% /devtmpfs 974M 8.0K 974M 1% /dev/shmtmpfs 974M 8.8M 965M 1% /runtmpfs 974M 0 974M 0% /sys/fs/cgroup/dev/mapper/centos-root 195G 2.1G 193G 2% //dev/sda2 1014M 191M 824M 19% /boot/dev/sr0 4.4G 4.4G 0 100% /media/cdromtmpfs 195M 0 195M 0% /run/user/0
(5)查看所有主机的磁盘信息,cmd.run执行单个命令
[root@master ~]# salt '*' cmd.run 'df -h'
web01:Filesystem Size Used Avail Use% Mounted ondevtmpfs 960M 0 960M 0% /devtmpfs 974M 8.0K 974M 1% /dev/shmtmpfs 974M 8.8M 965M 1% /runtmpfs 974M 0 974M 0% /sys/fs/cgroup/dev/mapper/centos-root 195G 2.1G 193G 2% //dev/sr0 4.4G 4.4G 0 100% /media/cdrom/dev/sda2 1014M 191M 824M 19% /boottmpfs 195M 0 195M 0% /run/user/0
web02:Filesystem Size Used Avail Use% Mounted ondevtmpfs 960M 0 960M 0% /devtmpfs 974M 8.0K 974M 1% /dev/shmtmpfs 974M 8.8M 965M 1% /runtmpfs 974M 0 974M 0% /sys/fs/cgroup/dev/mapper/centos-root 195G 2.1G 193G 2% //dev/sda2 1014M 191M 824M 19% /boot/dev/sr0 4.4G 4.4G 0 100% /media/cdromtmpfs 195M 0 195M 0% /run/user/0
(6)将本地脚本在远程主机上执行
[root@master ~]# echo "cat /etc/passwd">/srv/salt/test1.sh
[root@master ~]# salt '*' cmd.script salt://test1.sh
[root@master ~]# echo "ls $1" > /srv/salt/test2.sh
[root@master ~]# salt '*' cmd.script salt://test2.sh /opt
3.软件包管理模块--pkg
(1)安装一个软件包
[root@master ~]# salt "*" pkg.install "httpd"
(2)查看已安装的软件包
[root@master ~]# salt "*" pkg.version "httpd"
web01:2.4.6-95.el7.centos
web02:2.4.6-95.el7.centos
(3)卸载已经安装的软件包
[root@master ~]# salt "*" pkg.remove "httpd"
web02:----------httpd:----------new:old:2.4.6-95.el7.centos
web01:----------httpd:----------new:old:2.4.6-95.el7.centos
4. 服务管理模块--service
服务管理也是系统管理员需要维护的一项重要任务,通过 salt 管理 minion 上的服务将会变得很简单。我们使用 service 模块,该模块包含了 service,start、service,status、seryice,stop 等。如果 service.status 远程执行模块函数输出 True 的结果,则表示该服务正在运行;如果输出的是 False,
则表示该服务停止。启动或停止一个服务时,True的结果意味着命令执行成功。
(1)启动一个服务
[root@master ~]# salt "*" pkg.install "httpd"
[root@master ~]# salt "*" service.start httpd
web02:True
web01:True
(2)查看服务运行状态
[root@master ~]# salt "*" service.status httpd
web02:True
web01:True
(3)关闭一个服务
[root@master ~]# salt "*" service.stop httpd
web01:True
web02:True
(4)重启一个服务
[root@master ~]# salt "*" service.restart httpd
web01:True
web02:True
(5)重载服务
[root@master ~]# salt "*" service.reload httpd
web01:True
web02:True
5.文件管理模块--file
对于文件管理,salt 提供了 file 模块。
关于 file 模块的使用方式,可以使用命令“salt weba1 sys.list functions file”进行查看。这里举几个例子。
(1)文件信息的查询
[root@master ~]# salt "web01" file.stats /etc/passwd
web01:----------atime:1726711638.6467552ctime:1726711638.6407552gid:0group:rootinode:134631590mode:0644mtime:1726711638.639755size:953target:/etc/passwdtype:fileuid:0user:root
(2)创建文件
[root@master ~]# salt "*" file.touch /opt/test01.txt
web01:True
web02:True
(3)创建目录
[root@master ~]# salt "*" file.mkdir /opt/doc
web02:True
web01:True
(4)修改文件属主和属组
[root@master ~]# salt "*" file.chown /opt/doc root root
web01:None
web02:None
(5)删除目录
[root@master ~]# salt "web01" file.rmdir /opt/doc
web01:True
或
[root@master ~]# salt "web02" file.remove /opt/test.txt
web02:False
注意:
file.remove 既可以删除目录,也可删除文件,删除目录时为递归删除。
六、grains 的使用
Grains 是 Saltstack 的一个组件,其存放着 minion 启动时收集到的信息。用于査询 minion 端的IP、FQDN 等信息。
Grains 是 Saltstack 组件中非常重要的组件之一,存放在 Saltstack 的 minion 端。grains 是由minion 返回给 master 的数据,这些数据是 minion 端的,并且是以键值对的形式存储的。我们在做配置部署的过程中会经常使用它,Grains 是 Saltstack 记录 minion 的一些静态信息的组件。可简单理解为Grains 记录着每台 minion 的一些常用属性,比如 CPU、内存、磁盘、网络信息等。我们可以通过grains.items 查看某台 minion 的所有 Grains 信息。
当 salt-minion 启动时会把收集到的数据静态存放在 Grains 当中,只有当 minion 重启时才会进行数据的更新。由于 grains 是静态数据,因此不推荐经常去修改它。
应用场景:
信息查询,可用作 CMDB。
在 target 中使用,匹配 minion。
在 state 系统中使用,配置管理模块。
(1)列出minion 主机上的 grains 项
[root@master ~]# salt "web01" grains.ls
web01:- biosreleasedate- biosvendor- biosversion- boardname- cpu_flags- cpu_model
(2)grains 基本用法
通过下面的命令可以査看被控机 web01 主机的 grains 值
[root@master ~]# salt "web01" grains.items
[root@master ~]# salt "web01" grains.item ipv4
web01:----------ipv4:- 127.0.0.1- 192.168.10.102
[root@master ~]# salt "web01" grains.item os
web01:----------os:CentOS
[root@master ~]# salt "web01" grains.item num_cpus
web01:----------num_cpus:2
[root@master ~]# salt "web01" grains.item nodename
web01:----------nodename:minion01
(3)自定义 grains 键值
对于 minion 端没有的 grains 数据,用户也可以自定义 minion 端的 grains 键值,如下所示:
[root@master ~]# salt "web01" grains.set name zhangsan
web01:----------changes:----------name:zhangsancomment:result:True
[root@master ~]# salt "web01" grains.item name
web01:----------name:zhangsan
也可以使用JSON格式同时定义多个值:
root@master ~]# salt "web01" grains.set cpu_info '["intel","xeon","2"]'
web01:----------changes:----------cpu_info:- intel- xeon- 2comment:result:True
[root@master ~]# salt "web01" grains.item cpu_info
web01:----------cpu_info:- intel- xeon- 2
也可以使用 grains.setval 的方法创建键值,与 grains.set 不同的是,grains.set 是定义任意值grains.setval 定义的是 key 值,grains.setval 的用法如下所示:
也可以同时设置多个 key:value,
可以为一个 key 同时指若干个子 key:value
(4)在minion 端创建 grains 信息
grains 数据也可以直接在 minion 端创建
[root@minion01 ~]# cd /etc/salt/
[root@minion01 salt]# vim grainsid: admin
pass: pwd123
[root@master ~]# salt 'web01' grains.item id pass
web01:----------id:adminpass:pwd123
七、pillar 的使用
Pillar 在 salt 中是非常重要的组成部分,利用它可以完成很强大的功能,它可以指定一些信息到指定的 minion 上,不像 grains 一样是分发到所有 Minion 上的,它保存的数据可以是动态的,Pi1lar 以s1s 来写的,格式是键值对。与 grains 不同的是,pillar 的数据是存储在 master 端的。每个minion只能看到自己的 pillar 信息,grains 可以看做是主机的 matedata(元数据),例如 CPU 的数量;而pillar 则是主机所需的数据(例如数据库的密码)。
总之,一个 minion 可以告诉 master 该 minion 的 grains 数据,而 minion 需要从 master 端索要pillar 数据。
适用情景:
- 比较敏感的数据,比如密码,key 等
- 特殊数据到特定 Minion 上
- 动态的内容
- 其他数据类型
1.列出 minion 上的 pillar 详细信息
[root@master ~]# salt 'web01' pillar.items
2.自定义 pillar 数据
(1)为每一个 minion 编写对应的 sls 文件
[root@master ~]# cd /srv/pillar/
[root@master pillar]# vim test1.slsname: zhangsan
pass: pwd123
[root@master pillar]# vim test2.slsname: lisi
pass: pwd123
[root@master pillar]# vim top.slsbase:'web01':- test1'web02':- test2
sls 代表 SaLtstack 文件,是一种 yam1 格式的描述文件,SLS 描述了系统的目标状态,由格式简单的数据构成。这经常被称作配置管理,top.s1s 是配置管理的入口文件,一切都是从这里开始,在 master主机上,默认存放在/srv/salt/目录,如果是自定义 pillar 数据,需要放置在/srv/pillar 目录下。top.sls 默认从 base 标签开始解析执行,下一级是操作的目标,可以通过正则,grain 模块,或分组名,来进行匹配,再下一级是要执行的 state 文件,不包换扩展名。
(2)更新 pillar 数据
[root@master pillar]# salt '*' saltutil.refresh_pillar
web01:True
web02:True
(3)列出所有的 pillar
[root@master pillar]# salt '*' pillar.ls
web02:- name- pass- master
web01:- name- pass- master
(4)查看自定义pillar对应的信息
[root@master pillar]# salt '*' pillar.item name
web02:----------name:zhangsan
web01:----------name:lisi
[root@master pillar]# salt '*' pillar.item pass
web01:----------pass:pwd123
web02:----------pass:pwd123
八、saltstack 目录与文件同步
在进行自动化运维过程中,我们经常会将某一个文件或整个目录中所有的文件同步到远程主机,这个需求我们可以通过各种方式实现,比如rsync,scp等。在 saltstack 中,我们也可以借助它的同步功能。帮助我们灵活的实现这种同步需求。
1.Saltstack 同步方式
可以在 master 端执行 salt'*'state.highstate 手动推送。
可以在 minion 端执行 salt-call state.highstate 手动拉取。
也可以将 salt-call state.highstate 命令放在 Minion 端的定时任务中,来进行自动请求同步。
也可以将 salt'*'state.highstate 命令放在 Master 端的定时任务中,来进行自动推送到所有机器。
Saltstack有两种同步对象:
同步目录
同步文件
2.目录同步
(1)创建Saltstack分发目录
[root@master ~]# vim /srv/salt/top.slsbase:"web*":- zabbix.zabbix
创建出需要同步的目录:
[root@master ~]# mkdir -p /srv/salt/zabbix/zabbix_scripts
备注:
在 top.sls 文件中指定 web 开头主机访问 zabbix.sls 文件里面定义的内容。
-zabbix.zabbix 代表/srv/salt/日录下有个子目录 zabbix,这个子日录下有个 zabbix.sls 文件。
(2)创建 sls 文件
/usr/local/zabbix/scripts:file.recurse:- source: salt://zabbix/zabbix_scripts- dir_mode: 755- file_mode: 744
备注:
/usr/local/zabbix/scripts:指定 Minion 端同步后生成的目录
file.recurse:
-source:salt://zabbix/zabbixscripts 指定要 Master 端同步的原始目录
-dir mode: 755 用 dir mode 设置目录的权限
-file mode: 744 用 file mode 来设置文件的权限
file 字段的其他写法:
file.managed 保证文件存在,并且为对应的状态
file.recurse 保证目录存在,并且为对应状态
file.absent 确保文件不存在,如果存在则删除
(3)同步数据
在 master 端推送
[root@master ~]# salt '*' state.highstate
也可以在minion端拉取
[root@minion01 ~]# salt-call state.highstate
2.saltstack 文件同步
当需要传送文件时,匹配 web 开头的主机,将文件同步到这些 Minion 上,并设置为对应的文件权限,示例如下。
(1)编写入口文件
[root@minion01 ~]# vim /srv/salt/top.slsbase:"web*":- zabbix.zabbix
(2)编写同步参数
[root@master zabbix]# vim zabbix.sls /usr/local/zabbix/scripts:file.recurse:- source: salt://zabbix/zabbix_scripts- dir_mode: 755- file_mode: 744#追加以下内容
/opt/nginx.conf:file.managed:- source: salt://zabbix/nginx.conf- backup: minion- mode: 644- user: root- group: root
- backup: minion 此字段设置备份功能。
当文件发生变化时,会把原文件备份,备份文件目录: /var/cache/salt/minion/
[root@master ~]# touch /srv/salt/zabbix//nginx.conf
[root@master ~]# salt '*' state.highstate