-
SaltStack 由 Master 和 Minion 构成,Master 是服务器端,表示一台服务器,Minion 是客户服务器端,表示多台服务器。在 Master 上发送命令给符合条件的 Minion,Minion 就会执行相应的命令。Master 和 Minion 之间是通过 ZeroMQ(消息队列)进行通信。
-
Master 服务端监听 4505 与 4506 端口,4505 为 SaltStack 的消息发布端口, 4506 为 SaltStack 客户端与服务端通信的端口
-
Minion 客户端程序并不监听端口,当客户端启动后,会主动连接 Master 端注册,然后一直保持该 TCP 连接,而 Master 通过这条TCP 连接对客户端进行控制。如果连接断开,Master 对客户端将不能进行控制。但是,当客户端检查到连接断开后,会定期的向 Master 端请求注册连接
资源配置
| 操作系统 | 配置 | 主机名/IP |
|---|---|---|
| CentOS7.9 | 2C2G | master.saltstack.com/172.16.10.10 |
| CentOS7.9 | 2C2G | web01saltstack.com/172.16.10.11 |
| CentOS7.9 | 2C2G | web02.saltstack.com/172.16.10.2 |
systemctl stop firewalld systemctl disable firewalld2.1.2 关闭selinux
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config reboot2.1.3 修改主机名
hostnamectl set-hostname maste.saltstack.com hostnamectl set-hostname web01.saltstack.com hostnamectl set-hostname web02.saltstack.com2.1.4 配置hosts 映射
cat >> /etc/hosts << EOF 172.16.10.10 maste.saltstack.com 172.16.10.11 web01.saltstack.com 172.16.10.12 web02.saltstack.com EOF2.1.5 时间同步
yum -y install chrony systemctl start chronyd chronyc sources -v2.1.6 配置下载saltstack 的yum 源
sudo rpm --import https://repo.saltproject.io/py3/redhat/7/x86_64/latest/SALTSTACK-GPG-KEY.pub curl -fsSL https://repo.saltproject.io/py3/redhat/7/x86_64/latest.repo | sudo tee /etc/yum.repos.d/salt.repo2.2 安装salt-master并配置
-
在master节点执行
# salt-master节点安装 yum -y install salt-master # 修改master节点配置文件 vim /etc/salt/master interface: 172.16.10.10 auto_accept: True file_roots: base: - /srv/salt/ pillar_roots: base: - /srv/pillar pillar_opts: True nodegroups: web01group: 'web01.saltstack.com' web02group: 'web02.saltstack.com' ================配置项详细含义如下================ #默认的master文件全部是注释的。首先需要修改主控端配置文件中的监听地址。需要注意的是为了安全,监听的地址一定要写私网地址 interface: 172.16.10.10 #设置允许被控端自动认证,只要被控端设置完主控端的IP地址后启动服务,主控端就会允许被控端自动认证,以避免以后每次运行salt-key来确认证书信任 auto_accept: True #修改saltstack文件根目录位置 file_roots: base: - /srv/salt/ #设置分组 nodegroups: web01group: 'web01.saltstack.com' web02group: 'web02.saltstack.com' #开启pillar功能 pillar_opts: True #设置pillar的主目录,去掉注释 pillar_roots: base: - /srv/pillar ================================================== # 创建目录pillar 和 saltstack文件目录 mkdir /srv/pillar mkdir /srv/salt # 启动salt-master systemctl start salt-master systemctl enable salt-master2.3 两台minion节点安装配置salt-minion
# minion节点都要执行安装 yum -y install salt-minion # 修改minion 配置文件 ## web01节点 vim /etc/salt/minion master: 172.16.10.10 id: web01.saltstack.com ## web02节点 vim /etc/salt/minion master: 172.16.10.10 id: web02.saltstack.com ========================================================= # 启动salt-minion systemctl start salt-minion systemctl enable salt-minion 三、saltstack 相关操作 3.1 测试 Minion 是否连接正常
salt '*' test.ping “*”为匹配所有主机,“test.ping”为 salt 一个函数。*号是正则,若分了多个组, 可以通过类似于 web*,来只匹配 web 服务器3.2 cmd.run 执行单个命令
# 查看所有主机当前目录下所有文件目录 salt '*' cmd.run 'ls' # 查看所有主机的磁盘信息 salt '*' cmd.run 'df -h' -t 5 ## -t 设置该命令执行的超时控制3.3 远端执行master本地脚本
vim /srv/salt/test.sh #!/bin/bash echo "OK" =================================== chmod +x /srv/salt/test.sh # 远端执行master本地脚本 salt '*' cmd.script salt://test.sh3.4 将master本地文件复制到远端所有主机
echo mysql > my.cnf salt-cp '*' /srv/salt/my.cnf /root3.5 SaltStack 定时同步
# (1)在master端执行同步 salt '*' state.highstate # (2)在minion端执行同步 salt-call state.highstate # (3)在minion端放在配置文件执行 schedule: highstate: function:state.highstate seconds:600 ##每隔 10 分钟同步四、批量分发文件
vim /srv/salt/top.sls # 先定义入口配置文件
base:
'*':
- send_file
================================================================================
vim /srv/salt/send_file.sls # 定义要加载的sls文件
send_file: # send_file 只是一个标识,方便我们查看这个文件的作用
file.managed: # file.managed函数用来管理文件
- name: /tmp/1.txt # 指定分发到目标 minion 的哪个路径
- source: salt://1.txt # 指定源文件路径,salt://1.txt 相当于 /srv/salt/1.txt
- user: root # 指定文件的属主
- group: root # 指定文件的属组
- mode: 600 # 指定文件的权限
================================================================================
touch /srv/salt/1.txt # 创建源文件
salt '*' state.highstate # 通过state模块,会自动去找/srv/salt/top.sls文件,然后top.sls会去加载send_file.sls文件,最终实现文件分发
五、SaltStack 批量部署 Apache服务
vim /srv/salt/top.sls
base:
'*':
- http
===========================================================
vim http.sls
httpd:
pkg.installed: ##装多个包
- pkgs:
- httpd ##安装的包
- php ##安装的包
- httpd-tools ##安装的包
service.running:
- name: httpd
- enable: true
- reload: true
user.present:
- uid: 87
- gid: 87
- home: /var/www/html
- shell: /sbin/nologin
group.present:
- gid: 87
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://httpd/httpd.conf
- user: root
- group: root
- mode: 644
===========================================================
mkdir /srv/salt/httpd
# 上传httpd.conf配置文件,移动到/srv/salt/httpd/ 下
ll /srv/salt/httpd/httpd.conf
-rw-r--r-- 1 root root 1454 11月 4 11:08 httpd.conf
# minion节点同步,刷新 state 配置
salt '*' state.highstate
六、SaltStack 批量部署 Nginx服务
6.1 创建 grains 目录,将目录下的定制文件同步到被控机上运行
创建 grains 目录,需要将目录下的定制文件同步到被控机上运行;然后,能正常获取被控机打开文件句柄数
mkdir -p /srv/salt/_grains
vim /srv/salt/_grains/nginx_config.py
#!/usr/bin/python
# 这个适用于python3版本
import os,sys,subprocess
def NginxGrains():
'''
return Nginx config grains value
'''
grains = {}
max_open_file=65535
try:
getulimit = subprocess.getstatusoutput('source /etc/profile;ulimit -n')
except:
pass
if getulimit[0]==0:
max_open_file = int(getulimit[1])
grains['max_open_file'] = max_open_file
return grains
============================================================
# 查看grains最大文件数
salt '*' grains.item max_open_file
# 同步 grains 模块
salt '*' saltutil.sync_all
6.2 配置 pilllar文件和state文件
# 在主控端上创建入口文件 top.sls,入口文件的作用是定义 pillar 的数据覆 盖被控主机的有效域范围
vim /srv/pillar/top.sls
base:
web01group: ##组名
- match: nodegroup
- web01server ##设置包括 web01server.sls
web02group: ##组名
- match: nodegroup
- web02server ##设置包括 web02server.sls
==========================================================
# “web01group”和”web02group”是/etc/salt/master 中定义的不同的组,对每一个组编写 一个对应的文件指定配置,这里使用的是“web01server”和”web02server”,再分别定义不同 组主机的 Nginx 的根目录
vim /srv/pillar/web01server.sls
nginx:
root: /data
===========================================================
vim /srv/pillar/web02server.sls
nginx:
root: /www
===========================================================
# 使用以下命令查看 pillar 配置的情况
salt '*' pillar.items
==========================================================
# 定义 state 的入口 top.sls 文件,注意和 pillar 的入口文件名字一样
vim /srv/salt/top.sls
base:
'*':
- nginx
=========================================================
# 定义被控机执行的状态,安装 Nginx 软件、配置、启动
vim /srv/salt/nginx.sls
nginx:
pkg:
- installed
file.managed:
- source: salt://nginx/nginx.conf
- name: /etc/nginx/nginx.conf
- user: root
- group: root
- mode: 644
- template: jinja
service.running:
- enable: True
- reload: True
- watch:
- file: /etc/nginx/nginx.conf
- pkg: nginx
====================================================
6.3 创建nginx配置文件模板
-
使用 jinja 模板定义 Nginx 配置文件 nginx.conf,首先创建一个 nginx 目录,因为上面定义了 Nginx 配置文件的源路径
mkdir /srv/salt/nginx
vim /srv/salt/nginx/nginx.conf
user nginx;
worker_processes {{grains['num_cpus']}};
{% if grains['num_cpus'] ==1 %}
worker_cpu_affinity 10;
{% elif grains['num_cpus'] ==2 %}
worker_cpu_affinity 01 10;
{% elif grains['num_cpus'] == 4 %}
worker_cpu_affinity 0001 0010 0100 1000;
{% elif grains['num_cpus'] == 8 %}
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
{% else %}
worker_cpu_affinity 0001 0010 0100 1000;
{% endif %}
worker_rlimit_nofile {{ grains['max_open_file'] }};
error_log /var/log/nginx_error.log;
pid /var/run/nginx.pid;
events
{
worker_connections {{ grains['max_open_file'] }};
}
http
{
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 60;
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"' ;
server{
listen 80 default_server;
server_name _;
location / {
root {{ pillar['nginx']['root'] }};
index index.html index.htm;
}
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
6.4 同步刷新 state 配置,创建Nginx服务
# minion 节点都要安装安装 epel源 yum -y install epel-release # minion同步,刷新 state 配置 salt '*' state.highstate # 验证 ##在minion节点查看nginx服务状态 systemctl status nginx



