1. 介绍
基于Python开发的一套C/S架构配置管理工具,底层使用ZeroMQ消息队列pub/sub方式通信,使用SSL证书签发的方式进行认证管理。
2. 环境准备
2.1 安装
本文采用salt-bootstrap方式安装。salt-bootstrap是SaltStack的一个单独项目,主要用于解决多平台一键部署SaltStack环境
下载安装脚本
curl -L https://bootstrap.saltstack.com -o install_salt.sh
安装salt-master
sh install_salt.sh -M #安装最新stable版本的salt-master和salt-minion
安装salt-minion
sh install_salt.sh #安装最新stable版本的salt-minion
2.2 配置
(1) 所有master和minion节点配置hosts文件(生产环境使用DNS)
主机名 | IP | 说明 |
node1 | 172.16.37.23 | Master |
node2 | 172.16.37.35 | Minion |
node3 | 172.16.37.41 | Minion |
node4 | 172.16.37.39 | Minion |
node5 | 172.16.37.43 | Minion |
(2) Master防火墙规则
salt master启动后默认会监听两个端口:
4505/tcp,publish_port,提供远程执行命令发送功能
4506/tcp,ret_port,用于文件服务、认证、结果搜集等功能接口
(3) Minion配置
修改/etc/salt/minion
a) 修改minion的master
找到如下行’#master: salt’,取消注释,修改为实际master主机名
master: node1
b) 为minion指定id
找到如下行’#id:’,取消注释,并设置为minion的主机名(不一定要和主机名一样),如
id: node2
重启salt master和salt minion
systemctl restart salt-master salt-minion # Master
systemctl restart salt-minion # Minion
2.3 证书管理
SaltStack使用SSL签证的方式进行安全认证、通信加密
Minion第一次启动后会在/etc/salt/pki/minion生成公钥秘钥,然后将公钥发送给Master,等待Master接受
Master为其签发证书后才能与该Minion建立通信
相关命令
#查看证书签发情况
salt-key -L
#为node2签发证书
salt-key -a node2
#为所有等待接受的Minion签发证书
salt-key -A
3. 远程执行命令
salt ‘目标机器’ 函数 [参数](详细用法见’salt -h’)
在所有Minion远程执行test模块中的ping函数( /usr/lib/python2.7/site-packages/salt/modules/test.py ,该函数直接返回True)
salt ‘*’ test.ping
查看函数说明
salt ‘node2’ sys.doc test.ping
远程命令执行模块cmd( /usr/lib/python2.7/site-packages/salt/modules/cmdmod.py )
salt ‘*’ cmd.run “hostname”
列出cmd模块的函数
salt 'node2' sys.list_functions cmd
查看函数说明
salt 'node2' sys.doc cmd.run
原理都是在匹配的目标机器执行python模块中的函数,可以编写自定义的python模块推送到Minion上按上述方式执行
4. 状态系统
4.1 状态系统说明
通过SLS(SaLt State)文件描述Minion要达到什么状态,底层由SaltStack的状态模块保证Minion处于该状态
以安装httpd服务为例,采用执行远程命令的方式如下:
salt ‘node2’ pkg.install httpd
而采用状态文件进行描述如下:
然后通过状态模块确保目标机器中httpd服务处于pkg.installed的状态:
salt ‘node2’ state.apply apache
两者都达到了在目标机器部署httpd服务的目的,但是执行远程命令的方式每次都会执行相同的逻辑和指令,而状态文件则是根据描述让Minion处于指定状态,当前状态和所需状态不同时才执行相关操作
执行远程命令的方式属于执行模块。查看所有执行模块
salt 'node2' sys.list_modules
查看pkg执行模块中的所有函数
salt 'node2' sys.list_functions pkg
状态文件的方式属于状态模块。查看所有状态模块
salt 'node2' sys.list_state_modules
查看pkg状态模块中的所有函数
salt 'node2' sys.list_state_functions pkg
4.2 Highstate
highstate通过top.sls文件作为入口对模块和主机进行管理
使用highstate,可以用top.sls组织多个状态文件,对模块进行拆分和复用,实现多环境的配置和管理等
如下举例对highstate进行说明
file_roots默认只有一个base环境,位于/srv/salt,top.sls就在base环境的根目录下。目录结构如下:
在top.sls中指定状态文件或状态文件子目录
top.sls中引用了myapp,它会按如下顺序引用:如果存在myapp.sls则引用myapp.sls,如果不存在,则引用myapp目录下的init.sls。我们采用子目录的方式对目录进行规划
在myapp/init.sls中include与myapp相关的各个状态文件(可以把状态文件拆分成多个,在此处include)
.myconf对应与init.sls同目录的myconf.sls状态文件,在该文件中对Minion的/tmp/myconf.txt状态进行描述
在files/myconf.txt中写入任意内容,执行如下命令让Minion处于描述的状态
salt 'node2' state.apply
或者:
salt 'node2' state.highstate
参考:
(1) https://docs.saltstack.com/en/latest/topics/tutorials/states_pt1.html
(2) https://docs.saltstack.com/en/latest/topics/tutorials/starting_states.html
5. Grains
SaltStack中记录Minion静态信息的组件(OS类型、CPU核数、内存大小、IP地址等),在Minion启动时采集汇报给Master,因此Grains通常存储的是静态、不常变化的数据,存储在Minion本地
Minion可以操作自己的Grains数据(增删改)
可通过如下命令查看每项Grains数据:
salt 'node2' grains.items
6. Pillar
与Grains类似,但Pillar存储的是相对经常变化的数据,存储在Master本地
Minion只能查看自己的Pillar数据
可通过如下命令查看每项Pillar数据:
salt 'node2' pillar.items
7. Jinja
Python模板引擎,通过与Grains和Pillar的结合定义动态的配置
比如,不同的Minion通过fqdn可以获取各自不同的主机名
接下来我们可以通过Grains创建动态配置,让每个目标机器中的/tmp/myconf.txt显示自己的主机名
修改状态文件中的file描述,指定template为jinja
#cat dev/myapp/myconf.sls
conf1:
file.managed:
- name: /tmp/myconf.txt
- source: salt://nginx/files/myconf.txt
- user: root
- group: root
- mode: 644
- template: jinja
在source对应的文件中通过 {{ grains[‘ITEM’] }} 的方式引用Grains数据
#cat dev/myapp/files/myconf.txt
[BASE] /srv/salt/dev
My hostname is {{ grains['fqdn'] }}
让所有Minion处于描述的状态
salt '*' state.apply
参考:
(1) https://docs.saltstack.com/en/latest/topics/tutorials/states_pt3.html
8. 多环境的配置和管理
如下以在不同环境的主机中放置不同内容的/tmp/myconf.txt文件为例进行说明
为了便于区分不同环境,先修改各Minion的id加入环境标识
修改master的file_root配置( /etc/salt/master )
file_roots:
base:
- /srv/salt/base
dev:
- /srv/salt/dev
prod:
- /srv/salt/prod
在多环境下,每个环境的根目录下维护各自的top.sls
top.sls中指明自己的环境,匹配的目标机器,包含的状态文件/子目录等
top.sls中引用了myapp,它会按如下顺序引用:如果存在myapp.sls则引用myapp.sls,如果不存在,则引用myapp目录下的init.sls。我们采用子目录的方式对目录进行规划。在init.sls中指定该子目录中的状态文件
.myconf对应与init.sls同目录的myconf.sls状态文件,在该文件中对Minion的/tmp/myconf.txt状态进行描述
分别在base、dev、prod环境的myconf.txt中写入不同内容,执行如下命令让不同环境的Minion处于对应的描述状态
salt '*' state.apply # 默认base环境
salt '*' state.apply saltenv=dev # dev环境
salt '*' state.apply saltenv=prod # prod环境
参考:
(1) https://docs.saltstack.com/en/latest/topics/tutorials/states_pt4.html