一、了解SaltStack自动化运维工具
1.1 SaltStack 原理
-
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 端请求注册连接
二、部署saltstack
资源配置
操作系统 | 配置 | 主机名/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 |
2.1 基础环境
2.1.1 关闭防火墙
systemctl stop firewalld systemctl disable firewalld
2.1.2 关闭selinux
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config reboot
2.1.3 修改主机名
hostnamectl set-hostname maste.saltstack.com hostnamectl set-hostname web01.saltstack.com hostnamectl set-hostname web02.saltstack.com
2.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 EOF
2.1.5 时间同步
yum -y install chrony systemctl start chronyd chronyc sources -v
2.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.repo
2.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-master
2.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.sh
3.4 将master本地文件复制到远端所有主机
echo mysql > my.cnf salt-cp '*' /srv/salt/my.cnf /root
3.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