文章目录
Saltstack
概述
Salt 是:
一个配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的报被安装,指定的服务在运行);
一个分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则挑选出来的节点)上执行命令和查询数据;
开发其的目的是为远程执行提供最好的解决方案,并使远程执行变得更好,更快,更简单;
salt在几乎不改动配置的情况下就可以工作,也可以调整从而满足特定的需求。
Salt的核心功能:
- 使命令发送到远程系统是并行的而不是串行的
- 使用安全加密的协议
- 使用最小最快的网络载荷
- 提供简单的编程接口
Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不止可以通过主机名,还可以通过系统属性。
通信机制
SaltStack 采用 C/S模式,minion与master之间通过ZeroMQ消息队列通信,默认监听4505端口。
Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听4506端口。
安装与配置
安装
可以通过访问saltstack官网去访问和学习使用:https://www.saltstack.com/
saltstack是拥有中文文档的可以访问:http://docs.saltstack.cn/
安装分为两部分,测试使用三台一台为master节点,其它两台为minion节点。
设置官方YUM仓库安装进行
master节点操作:
[root@server1 ~]# yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest.el7.noarch.rpm
[root@server1 ~]# yum install -y salt-master #安装master节点
[root@server1 ~]# systemctl enable --now salt-master.service #启动并设为开机自启
minion节点操作:
server2
[root@server2 ~]# yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
[root@server2 ~]# yum install -y salt-minion
[root@server2 ~]# vim /etc/salt/minion #编辑minion 的配置文件
master: 172.25.254.1 #更改master后面的地址为master节点的ip
#注意这是python写的程序所以写配置时:后有空格,否则会报错
[root@server2 ~]# systemctl enable --now salt-minion.service #启动并开机自启
server3进行同样操作配置开启minion
如果访问官方的仓库很慢的话,也可以去使用阿里云的仓库安装就会快得多
# yum install https://mirrors.aliyun.com/saltstack/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
配置
安装完成后,因为刚才开启了minion节点,并且设置master指向server1,所以在server1上我们就可以看到两个minion上看到的信号,注意设置地址解析
这里看到的server2和server3是还未被允许的
[root@server1 ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
server2
server3
Rejected Keys:
可以查看一下4506端口,展示的信息显示是从server2和server3上给server1在发送信息,但是4505端口暂时是没有任何信息的
[root@server1 ~]# lsof -i :4506
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
salt-mast 3550 root 23u IPv4 32689 0t0 TCP *:4506 (LISTEN)
[Bqsalt-mast 3550 root 30u IPv4 36712 0t0 TCP server1:4506->172.25.254.2:37596 (ESTABLISHED)
salt-mast 3550 root 31u IPv4 37053 0t0 TCP server1:4506->172.25.254.3:38790 (ESTABLISHED)
[root@server1 ~]# lsof -i :4505
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
salt-mast 3543 root 15u IPv4 32640 0t0 TCP *:4505 (LISTEN)
然后来操作允许连接这两台minion节点
[root@server1 ~]# salt-key -a server2 #可以用参数-a指定允许指定节点
[root@server1 ~]# salt-key -A #也可以-A指定允许所有要连接的节点,删除也是一样,-d或-D,删除指定或全部
[root@server1 ~]# salt-key -L
Accepted Keys:
server2
server3
Denied Keys:
Unaccepted Keys:
Rejected Keys:
测试连接的效果
[root@server1 ~]# salt '*' test.ping #'*'表示匹配所有节点
server3:
True #表示连接正常
server2:
True
[root@server1 ~]# lsof -i :4505 #4505的连接信息也有了
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
salt-mast 3543 root 15u IPv4 32640 0t0 TCP *:4505 (LISTEN)
salt-mast 3543 root 17u IPv4 39059 0t0 TCP server1:4505->172.25.254.2:60548 (ESTABLISHED)
salt-mast 3543 root 18u IPv4 39131 0t0 TCP server1:4505->172.25.254.3:42180 (ESTABLISHED)
注意:当minion节点连接master节点后,在minion节点会生成/etc/salt/minion_id文件,里面记录的了你当前的主机名,如果自行更改了主机名,就需要先在master节点删除之前的连接,再删除/etc/salt/minion_id,然后重启服务再去连接。
Saltstack远程执行操作
远程指令操作
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. 如cmd、pkg、service等模块 |
- | 模块的详细内容和用法可以查看http://docs.saltstack.cn/ref/modules/all/index.html |
arguments | 空格来界定参数,如salt ‘server2’ sys.doc pkg |
测试:
使用master节点直接去操作minion节点
[root@server1 ~]# salt server2 cmd.run df #再server2上执行df命令
server2:
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/rhel-root 8910848 1251164 7659684 15% /
devtmpfs 495380 0 495380 0% /dev
tmpfs 507448 40 507408 1% /dev/shm
tmpfs 507448 13280 494168 3% /run
tmpfs 507448 0 507448 0% /sys/fs/cgroup
/dev/vda1 508580 128004 380576 26% /boot
tmpfs 101492 0 101492 0% /run/user/0
编写远程执行模块文件来控制minion
编写前需要开启master配置里的默认基础目录路径
[root@server1 ~]# vim /etc/salt/master
file_roots:
base:
- /srv/salt/ #开启后基础路径就在/srv/salt/
[root@server1 ~]# systemctl restart salt-master.service
[root@server1 ~]# mkdir /srv/salt #创建这个目录
然后就可以测试编辑执行文件
根据官方文档我们也可以编写自定义的模块来操作
首先在/srv/salt/创建目录 _modules ,在此目录里写一个py执行文件
[root@server1 salt]# mkdir /srv/salt/_modules
[root@server1 salt]# vim /srv/salt/_modules/disk.py
def df():
return __salt__['cmd.run']('df -h')
编写完成后需要将自定义的模块同步给其他的nimion节点
[root@server1 salt]# salt server2 saltutil.sync_modules
server2: #同步给server2
- modules.disk
可以在server2的salt数据储存目录里看到master节点同步的模块就储存在这里,内容都是一样的,所以当在master调用这个模块时相当于就是在执行nimion节点里的这个文件内容
[root@server2 ~]# cat /var/cache/salt/minion/files/base/_modules/disk.py
def df():
return __salt__['cmd.run']('df -h')
调用模块测试
[root@server1 salt]# salt server2 disk.df
server2:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 8.5G 1.2G 7.4G 15% /
devtmpfs 484M 0 484M 0% /dev
tmpfs 496M 80K 496M 1% /dev/shm
tmpfs 496M 13M 483M 3% /run
tmpfs 496M 0 496M 0% /sys/fs/cgroup
/dev/vda1 497M 126M 372M 26% /boot
tmpfs 100M 0 100M 0% /run/user/0
对于系统自带的模块使用,直接编写 .sls结尾的文件就可以,这里需要注意的就是编辑的语法规则
- 规则一: 缩进
Salt需要每个缩进级别由两个空格组成,不要使用tabs。 - 规则二: 冒号
字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。
my_key: my_value - 规则三: 短横杠
想要表示列表项,使用一个短横杠加一个空格。
- list_value_one
- list_value_two
编写sls文件执行模块
[root@server1 salt]# vim apache.sls
httpd: #ID声明
pkg: #状态声明
- installed #函数声明
也可以写成:
httpd:
pkg.installed
推送执行文件给server2
[root@server1 salt]# salt server2 state.sls apache #这里的apache就是apache.sls,不需要特殊指定路径,默认就是从/srv/salt/开始
[root@server2 ~]# ls /var/cache/salt/minion/files/base/ #在server1上执行推送时,是将编写的sls文件推送给server2上然后再去执行这个文件内容
apache.sls _modules
执行成功后会有显示成功或失败
还有一种方式可以将所有关于某个执行目的的文件都放在一个目录里,然后直接去这个目录下的文件来执行.
init.sls 在一个子目录里面表示引导文件,也就表示子目录本身,所以我们将apache.sls放在apache目录下改名为apache/init.sls
[root@server1 salt]# mkdir apache
[root@server1 salt]# mv apache.sls apache/init.sls
[root@server1 salt]# salt server2 state.sls apache #推送时执行apache就会自动指定到apache/init.sls执行
注意: 如果同时存在apache.sls 和 apache/init.sls,则 apache/init.sls 被忽略,apache.sls将被用来表示 apache.
模块使用
给server2推送安装httpd和php,并且设置启动httpd和开机自启
[root@server1 salt]# vim apache/init.sls
web:
pkg.installed:
- pkgs:
- httpd
- php
service.running:
- name: httpd
- enable: True
[root@server1 salt]# salt server2 state.sls apache
除了推送安装服务,还可以去推送文件,入推送更改httpd的配置文件内容
从server2里取来http的配置文件
[root@server1 salt]# scp server2:/etc/httpd/conf/httpd.conf /srv/salt/apache/
[root@server1 salt]# vim apache/httpd.conf #编辑配置文件
Listen 8888 #更改端口为8888,原本是80
然后更改推送文件
[root@server1 salt]# vim apache/init.sls
web:
pkg.installed:
- pkgs:
- httpd
- php
file.managed:
- source: salt://apache/httpd.conf #文件来源就是从salt基础路径下找apache/httpd.conf
- name: /etc/httpd/conf/httpd.conf #m目标路径是http的配置文件路径
service.running:
- name: httpd
- enable: True
- watch: #监控
- file: web #监控的内容是在web声明下的文件,每个声明下只能存在一个状态声明,不能出现两次
推送执行
[root@server1 salt]# salt server2 state.sls apache
[root@server2 ~]# netstat -ntlp #server2里的端口改为了8888
tcp6 0 0 :::8888 :::* LISTEN 4463/httpd
远程执行源码安装操作
给server2上配置了apache,在server3上来编译安装nginx
[root@server1 salt]# mkdir -p /srv/salt/nginx/files #建立目录将nginx源码包放在里面
[root@server1 salt]# vim /srv/salt/nginx/install.sls
nginx:
pkg.installed: #安装编译时的依赖性
- pkgs:
- openssl-devel
- gcc
- pcre-devel
file.managed: #传送源码包
- source: salt://nginx/files/nginx-1.18.0.tar.gz
- name: /mnt/nginx-1.18.0.tar.gz
cmd.run: #执行解压编译等工作
- name: cd /mnt && tar xfz nginx-1.18.0.tar.gz && cd nginx-1.18.0 && 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 #确认文件是否存在,存在的话就不会在创建编译
nginx-service:
file.managed: #添加nginx启动脚本
- source: salt://nginx/files/nginx.service
- name: /usr/lib/systemd/system/nginx.service
service.running: #运行nginx
- name: nginx
- enable: True
- reload: True
启动脚本是在:https://www.nginx.com/resources/wiki/start/topics/examples/systemd/ 网址里的模板使用就可以
[root@server1 salt]# 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/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
如果需要推送更改配置文件就和apache的方式一样,推送配置文件,在启动项里添加watch监控变化
执行推送,没有问题就可以在server3上看到启动了
[root@server1 salt]# salt server3 state.sls nginx.install
高级推送
可以在一个sls文件里指定多个minion节点的任务进行批量推送
[root@server1 salt]# vim /srv/salt/top.sls #在salt基础目录下创建top文件
base:
'server2': #一台节点下可以并列指定多个任务模块
- apache #让server2执行apache目录里的默认文件任务
'server3':
- nginx.install #让server3执行nginx里的install.sls文件
[root@server1 salt]# salt '*' state.highstate #高级推送
这样操作会在server2和server3里分别执行指定的模块任务,互不干扰