saltstack自动化运维基础

一、了解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.92C2Gmaster.saltstack.com/172.16.10.10
CentOS7.92C2Gweb01saltstack.com/172.16.10.11
CentOS7.92C2Gweb02.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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值