1. Saltstack 介绍

1.1 saltstack简介

  • SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建。

  • 通过部署SaltStack,我们可以在成千万台服务器上做到批量执行命令,根据不同业务进行配置集中化管理、分发文件、采集服务器数据、操作系统基础及软件包管理等。
    Saltstack架构

1.2 saltstack架构

• Saltstack基于C/S架构
– 服务器端称作Master
– 客户端称作Minion

• 可以实现传统处理方式,即:客户端发送请求给服务器,服务器收到请求后处理请求,再将结果返回

• 也可以使用消息队列中的发布与订阅(pub/sub)服务模式

1.3 salt基本原理

  • SaltStack 采用 C/S模式,server端就是salt的master,client端就是minion,minion与master之间通过ZeroMQ消息队列通信

  • minion上线后先与master端联系,把自己的pub key发过去,这时master端通过salt-key -L命令就会看到minion的key,接受该minion-key后,也就是master与minion已经互信

  • master可以发送任何指令让minion执行了,salt有很多可执行模块。这些模块是python写成的文件,里面会有很多函数,如cmd.run,当我们执行salt
    ‘*’ cmd.run
    'hostname’的时候,master下发任务匹配到的minion上去,minion执行模块函数,并返回结果。master监听4505和4506端口,4505对应的是ZMQ的PUB
    system,用来发送消息,4506对应的是REP system是来接受消息的。

2. saltstack的安装配置

实验环境:
192.168.43.10 作为master
192.168.43.2 作为minion
192.168.43.3 作为minion

2.1. 配置yum源

官网:https://www.saltstack.com/
设置官方YUM仓库:

 yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest.el7.noarch.rpm

2.2 配置master端

  • 在server1中
yum install -y salt-master.noarch

yum install -y python-setproctitle.x86_64

systemctl enable salt-master --now

2.3. 配置minion端

  • 在server2中
yum install -y salt-minion.noarch
  • 在server2中配置并编写文件
[root@server2 ~]# cd /etc/salt/
[root@server2 salt]# ls
cloud         cloud.deploy.d  cloud.profiles.d   master    minion    minion_id  proxy    roster
cloud.conf.d  cloud.maps.d    cloud.providers.d  master.d  minion.d  pki        proxy.d
[root@server2 salt]# vim minion
  • 将master改为server1的 ip
    在这里插入图片描述
  • 重启服务

2.4 master端验证minion

  • salt-key常用参数
-a 添加指定ID 的key
-A 添加全部
-R 拒绝全部
-d 删除指定ID的
-D 删除全部
- lsof-key -L查看等待验证的minion
- salt-key -a server2  添加server2的minion端
- salt-key -A 添加所有minion端
- salt-key -d server2 删除指定minion端

(如果hostname与minion端中minion_id中的名称不符合,需要删除salt-key和minion_id后,重启master重新验证)**

root@server1 salt]# netstat -ntlp
##查看是否生成4505 4506  端口

在这里插入图片描述
在这里插入图片描述

  • 配置master验证minion
    在这里插入图片描述
  • 如果minion端不止一个的话,可以通过 salt-key -A添加所有minion
    在这里插入图片描述
    在这里插入图片描述
  • 用同样的方法设置一下server3
[root@server3 myr]# yum install -y salt-minion

[root@server3 myr]# vim /etc/salt/minion
[root@server3 myr]# systemctl restart salt-minion

在这里插入图片描述

  • 几个简单的命令
    在这里插入图片描述
  • 主从做了个公钥相互交换
[root@server1 salt]# cd /etc/salt/pki
[root@server1 pki]# ls
master  minion
[root@server1 pki]# cd master/
[root@server1 master]# ls
master.pem  minions           minions_denied  minions_rejected
master.pub  minions_autosign  minions_pre
##从主节点查看公钥
[root@server1 master]# md5sum master.pub  
d13632ada096f9c6977ab9cb0c1e0c33  master.pub
#从节点自己的公钥
[root@server2 minion]# md5sum minion.pub 
8433727b8d33d898e498b2e7730f11d7  minion.pub
#从节点看主节点公钥
[root@server2 minion]# md5sum minion_master.pub 
d13632ada096f9c6977ab9cb0c1e0c33  minion_master.pub
##主节点有所有从节点的公钥
[root@server1 minions]# ls
server2  server3
[root@server1 minions]# md5sum server3
55d2c5fece6a57d2317a4b9e0fdb82b7  server3
[root@server1 minions]# md5sum server2
8433727b8d33d898e498b2e7730f11d7  server2
[root@server1 minions]# pwd
/etc/salt/pki/master/minions

3. saltstack远程执行

3.1 salt命令

  • Salt命令由三个主要部分构成:
salt '<target>' <function>[arguments]
  • target: 指定哪些minion,默认的规则是使用glob匹配minion id.

  • 可以使用正则表达式:
    salt -E 'server[1-3]' test.ping

  • 也可以指定列表:
    salt -L 'server2,server3' test.ping

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

  • arguments通过空格来界定参数:

salt 'server2' sys.doc pkg #查看模块文档
salt 'server2' pkg.install httpd
salt 'server2' pkg.remove httpd
  • salt内置的执行模块列表可参考官方网站
  • 执行模块

3.2 编写远程执行模块

  1. 编辑master配置文件:vim /etc/salt/master
    在这里插入图片描述
  • /srv/salt/为salt数据的根目录
  • 重启服务
  1. 创建模块
mkdir /srv/salt/_modules ##创建目录
vim /srv/salt/_modules/mydisk.py##编写模块文件

在这里插入图片描述

  1. 同步模块:
    salt server2 saltutil.sync_modules
    在这里插入图片描述

  2. 运行模块
    salt server2 mydisk.df
    在这里插入图片描述

  • 运行之后,会缓存到minion端的/var/cache/salt
    在这里插入图片描述

3.3配置管理

SLS文件
  • SLS(代表SaLt State文件)是Salt State系统的核心。SLS描述了系统的目标状态,由格式简单的数据构成。这经常被称作配置管理
自定义sls文件
  • 创建一个sls文件示例-安装httpd
  • vim /srv/salt/apache.sls
httpd:                    # ID声明,同时也是软件包的名称 
   pkg:                   # 状态声明
     -installed            # 函数声明

第一行被称为(ID declaration) 标签定义,在这里被定义为安装包的名。注意:在不同发行版软件包命名不同
第二行被称为(statedeclaration)状态定义, 在这里定义使用(pkg state module)
第三行被称为(functiondeclaration)函数定义, 在这里定义使用(pkg state module)调用 installed 函数

  • 也可以写成这种形式:
httpd:     
   pkg.installed  
web:
  pkg.installed:
    - pkgs:
      - httpd
      - php ##也可以装多个包
  • 注意:在安装包时会自动安装依赖性,在卸载时则不会卸载依赖性,只会满足所需要的状态
  • 指定主机执行 salt server2 state.sls apache

在这里插入图片描述
在这里插入图片描述

top.sls
  • top.sls 是配置管理的入口文件,一切都是从这里开始,在master 主机上,默认存放在/srv/salt/目录. top.sls 默认从 base 标签开始解析执行,下一级是操作的目标,可以通过正则,grain模块,或分组名,来进行匹配,再下一级是要执行的state文件,不包换扩展名。
  • 创建 /srv/salt/top.sls
  1. 通过正则进行匹配的示例,
base:
  '*':
    - webserver
  1. 通过分组名进行匹配的示例,必须要有 - match: nodegroup
base:
  group1:
    - match: nodegroup    
    - webserver
  1. 通过grain模块匹配的示例,必须要有- match: grain
base:
  'os:Fedora':
    - match: grain
    - webserver
  • 批量执行命令
    salt '*' state.highstate
    在这里插入图片描述
使用子目录管理
  • 注意:
  1. SLS文件的扩展名 .sls 被省略。 (例如. webserver.sls 变成 webserver)
  2. 子目录可以更好的组织,每个子目录都由一个点来表示.(例如 webserver/dev.sls 可以简称为 webserver.dev)
  3. 如果子目录创建一个init.sls的文件,引用的时候仅指定该目录即可. (例如 webserver/init.sls 可以简称为 webserver)
  4. 如果一个目录下同时存在webserver.sls 和 webserver/init.sls,那么 webserver/init.sls 将被忽略,SLS文件引用的webserver将只引用webserver.sls(优先级)
  • 建立子目录
    mkdir /srv/salt/httpd
    vim /srv/salt/httpd/install.sls
[root@server1 salt]# ls 
httpd  _modules
[root@server1 salt]# cd httpd
[root@server1 httpd]# ls
install.sls
[root@server1 httpd]# cat install.sls 
httpd:
  pkg.installed
  • salt server2 state.sls httpd.install可以在任何目录下执行成功
    在这里插入图片描述
  • 还可以引入init.sls文件 ,init.sls为入口文件
  • mv install.sls init.sls 将刚才的安装文件重命名为init.sls
  • salt server2 state.sls httpd

在这里插入图片描述

  • 注意:如果httpd目录中同时存在 init.sls和httpd.sls文件,如果执行上面命令,则执行httpd.sls,init.sls文件会被忽略

  • 创建file目录,存放一些配置文件

[root@server1 files]# scp server2:/etc/httpd/conf/httpd.conf .
##将server2 httpd配置文件复制进到files中
[root@server1 files]# pwd
/srv/salt/httpd/files

vim init.sls

web:
  pkg.installed:
    - pkgs:
      - httpd

  file.managed:
    - source: salt://httpd/files/httpd.conf
    - name: /etc/httpd/conf/httpd.conf
  • 将server1中的配置文件 里面的内容更改一下,重新推一下,发现server2中的httpd配置文件也随之改变
SLS示例
配置HTTP

方法1. vim init.sls(只通过一个文件)

web:
  pkg.installed:
    - pkgs:
      - httpd

  file.managed:
    - source: salt://httpd/files/httpd.conf
    - name: /etc/httpd/conf/httpd.conf
  service.running:
    - name: httpd
    - enable: True
    - reload: True
    - watch:
      - file: web

方法2. 可通过多个文件

-vim /srv/salt/httpd/install.sls

apache-install:
  pkg.installed:
    - pkgs:
      - httpd
  • vim /srv/salt/httpd/service.sls
include:
  - httpd.install
apache-deploy:
  file.managed:
    - source:salt://httpd/files/httpd.conf
    - name:/etc/httpd/conf/httpd.conf

  service.running:
    - name:httpd
    - enable: True
    - reload: True
    - watch: ##监控
      - file: apache-deploy ##触发;注意这样的调用只能有一次
  • vim /srv/salt/top.sls
base:
  '*':
    - httpd

salt server2 state.highstate全局推

在这里插入图片描述

配置Nginx

mkdir /srv/salt/nginx
mkdir /srv/salt/nginx/files把nginx的安装压缩包放在files里面
在这里插入图片描述

vim /srv/salt/nginx/install.sls

nginx-install:
  file.managed:
    - source: salt://nginx/files/nginx-1.19.1.tar.gz
    - name: /mnt/nginx-1.19.1.tar.gz

  pkg.installed:
    - pkgs:
      - gcc
      - pcre-devel
      - openssl-devel

  cmd.run:
    - name: cd /mnt/ && tar zxf nginx-1.19.1.tar.gz && cd nginx-1.19.1 && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx --with-http_ssl_module &> /dev/null && make &> /dev/null && make install &> /dev/null
    - creates: /usr/local/nginx

/usr/local/bin/nginx:
  file.symlink:
    - target: /usr/local/nginx/sbin/nginx
  • 先推一下,salt server2 state.sls nginx.install
    在这里插入图片描述
  • 在server2中查看,发现nginx已经成功安装
    在这里插入图片描述
  • 为了后续,把server2中的nginx的配置文件传入到server1中的/srv/salt/nginx/files中
[root@server1 files]# ls
nginx-1.19.1.tar.gz
[root@server1 files]# scp server2:/usr/local/nginx/conf/nginx.conf .
nginx.conf                                             100% 2791     2.5MB/s   00:00    
[root@server1 files]# ls
nginx-1.19.1.tar.gz  nginx.conf
  • vim /srv/salt/nginx/files/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

vim /srv/salt/nginx/user.sls创建nginx用户

nginx:
  user.present:
    - createhome: False
    - home: /usr/local/nginx
    - shell: /sbin/nologin

vim /srv/salt/nginx/service.sls

include:
  - nginx.install
  - nginx.user

/usr/local/nginx/conf/nginx.conf:
  file.managed:
    - source: salt://nginx/files/nginx.conf

nginx-service:
  file.managed:
    - source: salt://nginx/files/nginx.service
    - name: /usr/lib/systemd/system/nginx.service

  service.running:
    - name: nginx
    - enable: True
    - reload: True
    - watch:
      - file: /usr/local/nginx/conf/nginx.conf
  • salt server2 state.sls nginx.service
    在这里插入图片描述

注意:推之前记得关掉server2中httpd的进程,否则可能出现最后一个任务报错的情况
注意:上面的httpd和nginx配置中,service.sls都可以重命名为init.sls,在实行命令的时候就只用 salt server2 state.sls httpdsalt server2 state.sls nginx ,不用加后面的.service

通过top.sls配置不同主机执行不同程序
vim /srv/salt/top.sls
base:
  'server2':
    - httpd.service
  'server3':
    - nginx.service

全局推 salt '*' state.highstate

在这里插入图片描述
在这里插入图片描述

Logo

一站式 AI 云服务平台

更多推荐