环境:
server11:192.168.1.21
server12:192.168.1.22
server13:192.168.1.23
master:server11
minion:server12、server13
所有主机firewalld、selinux均关闭
一、saltstack简介
- saltstack是一个配置管理系统,能够维护预定义状态的远程节点
- saltstack是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据
- saltstack是运维人员提高工作效率、规范业务配置与操作的利器
1. Salt的核心功能
- 使命令发送到远程系统是并行的而不是串行的
- 使用安全加密的协议
- 使用最小最快的网络载荷
- 提供简单的编程接口
2. salt基本原理
- SaltStack 采用 C/S模式,server端就是salt的master,client端就是minion,minion与master之间通过ZeroMQ消息队列通信,默认监听4505端口
- minion上线后先与master端通信,将pub key发过去,此时master端通过salt-key -L命令可以查看minion的key,通过salt-key -a添加连接
二、saltstack安装
官网:https://www.saltstack.com/
配置YUM仓库(需要安装的主机都配置,也可以配置完成后直接复制repo文件到其他主机):
这里使用的阿里云镜像仓库

server11(master端):
yum install -y salt-master #安装master端

systemctl enable --now salt-master.service #启动master并设置master自启动

server12、server13(minion)端配置:
yum install -y salt-minion #安装minion端

vim /etc/salt/minion master: 192.168.1.21 #设置master主机的ip

systemctl enable --now salt-minion.service ##启动minion并设置开机自启动

master端查看连接请求
salt-key -L

master端执行命令允许minion连接
salt-key -A ##添加所有 -a可指定添加

查看结果

master端测试与minion端的连接
salt '*' test.ping

三、saltstack远程执行
1. Salt命令由三个主要部分构成:
- salt '<target>' <function> [arguments]
target: 指定minion, 默认的规则是使用glob匹配minion id. # salt '*' test.ping
Targets也可以使用正则表达式:
salt -E 'server1[2-3]' test.ping

Targets也可以指定列表:
salt -L 'server12,server13' test.ping

funcation是module提供的功能,Salt内置了大量有效的functions.
salt '*' cmd.run 'uname -a'

arguments通过空格来界定参数:
salt 'server13' sys.doc pkg #查看模块文档

salt内置的执行模块列表:
http://docs.saltstack.cn/ref/modules/all/index.html
2. 编写远程执行模块
编辑master配置文件:
vim /etc/salt/master

重启master服务:
systemctl restart salt-master.service
![]()
创建模块目录:
mkdir -p /srv/salt/_modules
编写模块文件:
vim /srv/salt/_modules/mydisk.py

同步模块:
salt server12 saltutil.sync_modules

运行模块:
salt server12 mydisk.df

YAML语法:
规则一: 缩进
Salt需要每个缩进级别由两个空格组成,不要使用tabs。
规则二: 冒号
字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。 my_key: my_value
规则三: 短横杠
想要表示列表项,使用一个短横杠加一个空格。 - list_value_one - list_value_two
配置管理:
创建一个sls文件:
vim /srv/salt/apache.sls

指定主机执行:
salt server2 state.sls apache

准备Top文件:
vim /srv/salt/top.sls

批量执行:
salt '*' state.highstate

可以看到server12因为刚才安装过了,所以是绿色的,表示状态一致不需要进行,server13是蓝色的,成功安装httpd,这和ansible很相似
Salt 状态系统的核心是SLS,或者叫SaLt State 文件。
SLS表示系统将会是什么样的一种状态,而且是以一种很简单的格式来包含这些数据,常被叫做配置管理。
sls文件命名:
- sls文件以”.sls”后缀结尾,但在调用时是不需要写后缀的。
- 使用子目录来做组织是个很好的选择。
- init.sls 在一个子目录里面表示引导文件,也就表示子目录本身, 所以``apache/init.sls`` 就是表示``apache``. 如果同时存在apache.sls 和 apache/init.sls,则 apache/init.sls 被忽略,apache.sls将被用来表示apache.
四、grains与pillar
1. grains
1.1 grains简介
Grains是SaltStack的一个组件,存放在SaltStack的minion端。
当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。 由于grains是静态数据,因此不推荐经常去修改它。
应用场景:
- 信息查询,可用作CMDB。
- 在target中使用,匹配minion。
- 在state系统中使用,配置管理模块。
1.2 信息查询
用于查询minion端的IP、FQDN等信息。
默认可用的grains:
salt '*' grains.ls

查看每一项的值:
salt '*' grains.items #items表示查看所有
salt '*' grains.item ipv4 ##只查看ip

1.3 自定义grains项
在/etc/salt/minion中定义:
server12:
vim /etc/salt/minion

重启salt-minion,否则数据不会更新:
systemctl restart salt-minion
查看
salt server12 grains.item roles

在/etc/salt/grains中定义:
server13:
vim /etc/salt/grains

同步数据:
salt server13 saltutil.sync_grains
查询自定义项:
salt server13 grains.item deployment

1.4 编写grains模块
在salt-master端创建_grains目录:
mkdir /srv/salt/_grains
vim /srv/salt/_grains/my_grain.py

同步grains到minion端
salt '*' saltutil.sync_grains

之前server12配置文件中有roles的值,server13没有,经过同步后发现server12中roles值是配置文件中写的,没有被覆盖

1.5 grains匹配运用
在target中匹配minion:
salt -G roles:memcache cmd.run hostname
salt -G roles:nginx cmd.run hostname

在top文件中匹配:
vim /srv/salt/top.sls


可以看到server12没有匹配的grains所以报错,server13已经安装httpd
2. pillar
2.1 pillar简介
- pillar和grains一样也是一个数据系统,但是应用场景不同。
- pillar是将信息动态的存放在master端,主要存放私密、敏感信息(如用户名密码等),而且可以指定某一个minion才可以看到对应的信息。
- pillar更加适合在配置管理中运用。
2.2 声明pillar
定义pillar基础目录:
vim /etc/salt/master

mkdir /srv/pillar
重启salt-master服务:
systemctl restart salt-master.service
2.3 自定义pillar项
vim /srv/pillar/top.sls

mkdir /srv/pillar/packages
vim /srv/pillar/packages/init.sls

刷新pillar数据:
salt '*' saltutil.refresh_pillar

查询pillar数据:
salt '*' pillar.items

2.4 pillar数据匹配
命令行中匹配:
salt -I 'package:httpd' test.ping
salt -I 'package:mairadb' test.ping

系统中使用pillar数据:
vim /srv/salt/apache.sls

salt server13 state.sls apache

五、Jinja模板
1. Jinja模板简介
- Jinja是一种基于python的模板引擎,在SLS文件里可以直接使用jinja模板来做一些操作。 通过jinja模板可以为不同服务器定义各自的变量。
- 两种分隔符: {% ... %} 和 {{ ... }},前者用于执行诸如 for 循环或赋值的语句,后者把表达式的结果打印到模板上。
2. Jinja模板使用方式
Jinja最基本的用法是使用控制结构包装条件:
vim /srv/salt/testjinjia.sls

salt '*' state.sls testjinjia



Jinja在普通文件的使用:
复制一份http配置文件到salt目录下:
cp /mnt/httpd.conf /srv/salt/

修改模板文件(引用变量port):
vim /srv/salt/httpd.conf

vim /srv/salt/apache.sls

salt '*' state.sls apache

在server12和server13查看结果:
cat /etc/httpd/conf/httpd.conf | grep '^Listen'
![]()
![]()
import方式,可在state文件之间共享:
定义变量文件
vim lib.sls

导入
vim /srv/salt/httpd.conf

salt '*' state.sls apache

可以看到最终生效的是导入的变量,它覆盖了我们在sls中定义的变量
六、Job管理
1. Job简介
- master在下发指令任务时,会附带上产生的jid。
- minion在接收到指令开始执行时,会在本地的/var/cache/salt/minion/proc目录下产生该jid命名的文件,用于在执行过程中master查看当前任务的执行情况。
- 指令执行完毕将结果传送给master后,删除该临时文件。
2. Job cache
Job缓存默认保存24小时:
vim /etc/salt/master

master端Job缓存目录:
/var/cache/salt/master/jobs

3. Job持久化(存储到数据库)

这里演示从master存储到数据库,也可以从minion存储
修改master端配置:
vim /etc/salt/master

重启salt-master服务:
systemctl restart salt-master.service
安装数据库以及相关插件
yum install -y mariadb-server MySQL-python

MySQL-python插件必须安装,否则salt无法与mysql通信
启动数据库
systemctl start mariadb.service
安全初始化
mysql_secure_installation
创建sql模板(官网文档上可以找到)
vim salt.sql

导入数据库
mysql -p < salt.sql
![]()
数据库授权
grant all on salt.* to salt@'192.168.1.%' identified by 'salt';

这里是因为master和数据库在同一主机,所以授权本机就可以,如果从minion上传数据库,那也要进行相应的授权
查看数据库

执行一次远程任务

查看数据库
select * from salt_returns;

补充:
操作中出现的问题:
在授权时,我第一次是授权的localhost,在执行时提示无法连接数据库,因为虽然是在本机,但salt实际连接数据库时还是通过远程连接的方式,导致连接失败,所以我更改了授权,改为授权192.168.1.0/24网段对salt库拥有所有权限
4. Job管理
查看所有minion当前正在运行的jobs(在所有minions上运行saltutil.running)
salt-run jobs.active
列出当前master jobs cache中所有job
salt-run jobs.list_jobs

从master jobs cache中查询指定jid的运行结果
salt-run jobs.lookup_jid <jid>

七、salt-ssh与salt-syndic
1. salt-ssh
1.1 salt-ssh简介
- salt-ssh可以独立运行的,不需要minion端。
- salt-ssh 用的是sshpass进行密码交互的。
- 以串行模式工作,性能下降。
安装salt-ssh:
yum install -y salt-ssh

1.2 salt-ssh配置
配置roster(相当于ansible的inventory清单)文件,默认的本地路径是 /etc/salt/roster

测试:
salt-ssh '*' test.ping -i

连接询问加 -i 参数
或者编写配置文件添加以下内容
vim ~/.ssh/config
StrictHostKeyChecking no
salt-ssh是串行的,效率低下,是为了补充salt需要客户端的缺陷,但推荐使用ansible(不需要客户端),ansible相比salt-ssh效率提升很多
2. salt-syndic
2.1 salt-syndic简介
- 如果大家知道zabbix proxy的话那就很容易理解了,syndic其实就是个代理,隔离master与minion。
- Syndic必须要运行在master上,再连接到另一个topmaster上。
- Topmaster 下发的状态需要通过syndic来传递给下级master,minion传递给master的数据也是由syndic传递给topmaster。
- topmaster并不知道有多少个minion。
- syndic与topmaster的file_roots和pillar_roots的目录要保持一致。
2.2 salt-syndic配置

topmaster端(server14 ip:192.168.1.24):
安装salt-master
yum install -y salt-master
配置
# vim /etc/salt/master
![]()


作为顶级master
systemctl start salt-master.service
# salt-key -L #查看下级master的连接授权
# salt-key -A
下级master端(server11):
安装salt-syndic
yum install -y salt-syndic
vim /etc/salt/master

重启服务
systemctl restart salt-master
systemctl start salt-syndic
在topmaster端查看:


测试:

可以看到实际执行操作的是server12和server13
八、salt-api配置
1. salt-api简介
SaltStack 官方提供有REST API格式的 salt-api 项目,将使Salt与第三方系统集成变得尤为简单。
官方提供了三种api模块:
- rest_cherrypy
- rest_tornado
- rest_wsgi
官方链接:https://docs.saltstack.com/en/latest/ref/netapi/all/index.html#all-netapi-modules
2. salt-api配置
安装salt-api:
yum install -y salt-api.noarch python-cherrypy.noarch

生成证书:
cd /etc/pki/tls/private
openssl genrsa 2048 > localhost.key

cd /etc/pki/tls/certs
make testcert //根据提示填写相关信息即可

创建用户认证文件:
useradd -s /sbin/nologin saltapi
echo westos | passwd --stdin saltapi

vim /etc/salt/master.d/auth.conf

激活rest_cherrypy模块:
vim /etc/salt/master.d/api.conf

打开include加载自配置文件
vim /etc/salt/master
![]()
重启服务:
systemctl restart salt-master
systemctl start salt-api
3. salt-api使用
获取认证token:
curl -sSk https://192.168.1.24:8000/login \
-H 'Accept: application/x-yaml' \
-d username=saltapi \
-d password=redhat \
-d eauth=pam

推送任务:
curl -sSk https://192.168.1.24:8000 \
-H 'Accept: application/x-yaml' \
-H 'X-Auth-Token: 244c45ae5e3329f085a930eeb2d8ebab479ba469'\
-d client=local \
-d tgt='*' \
-d fun=test.ping

这里我是通过topmaster使用的saltapi,出现了server11:false,如果是直接通过master,返回是正常的
token值是上面命令获取的toekn值。
全面介绍SaltStack配置管理系统,涵盖安装、远程执行、状态管理、模板、Job管理、salt-ssh、salt-syndic及salt-api配置。适用于运维人员提高效率。
629

被折叠的 条评论
为什么被折叠?



