Saltstack自动化运维详解(介绍 安装配置 远程执行管理)
文章目录Saltstack 介绍saltstack简介saltstack架构salt基本原理Saltstack 介绍saltstack简介SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyY
文章目录
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 编写远程执行模块
- 编辑master配置文件:
vim /etc/salt/master
- /srv/salt/为salt数据的根目录
- 重启服务
- 创建模块
mkdir /srv/salt/_modules ##创建目录
vim /srv/salt/_modules/mydisk.py##编写模块文件

-
同步模块:
salt server2 saltutil.sync_modules
-
运行模块
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
- 通过正则进行匹配的示例,
base:
'*':
- webserver
- 通过分组名进行匹配的示例,必须要有 - match: nodegroup
base:
group1:
- match: nodegroup
- webserver
- 通过grain模块匹配的示例,必须要有- match: grain
base:
'os:Fedora':
- match: grain
- webserver
- 批量执行命令
salt '*' state.highstate
使用子目录管理
- 注意:
- SLS文件的扩展名 .sls 被省略。 (例如. webserver.sls 变成 webserver)
- 子目录可以更好的组织,每个子目录都由一个点来表示.(例如 webserver/dev.sls 可以简称为 webserver.dev)
- 如果子目录创建一个init.sls的文件,引用的时候仅指定该目录即可. (例如 webserver/init.sls 可以简称为 webserver)
- 如果一个目录下同时存在webserver.sls 和 webserver/init.sls,那么 webserver/init.sls 将被忽略,SLS文件引用的webserver将只引用webserver.sls(优先级)
- 建立子目录
mkdir /srv/salt/httpdvim /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.slssalt 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/nginxmkdir /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 httpd 或salt server2 state.sls nginx ,不用加后面的.service
通过top.sls配置不同主机执行不同程序
vim /srv/salt/top.sls
base:
'server2':
- httpd.service
'server3':
- nginx.service
全局推 salt '*' state.highstate


更多推荐



所有评论(0)