4、saltstack的使用
官方文档地址:http://repo.saltstack.com/#rhel
4.1、saltstatck介绍:
用户要一致,这里使用的是root用户;
用于批量管理成百上千的服务器;
并行的分发,使用python开发,提供丰富的api接口;
Saltstack的master端监听4505与4506端口,4505为master和minion认证通信端口,4506为master用来发送命令或者接收minion的命令执行返回信息;
当客户端启动后,会主动连接master端注册,然后一直保持该TCP连接,而master通过这条TCP连接对客户端进行控制。如果连接断开,master对客户端
将不能进行控制,但是当客户端检查到连接断开后,会定期向master端请求注册连接;
1、saltstack运行方式:
①Local②Master/Minion③master④Salt SSH
2、saltstack三大功能:
①远程执行②配置管理③云管理
3、saltstack数据系统:
①Grains (静态数据)②pillar (动态数据)
4、saltstack配置管理:
①SLS(YAML、Jinja)②Highstate③States Mod
5、Saltstack几个重要的组件:
(1)grains:
grains 是在 minion(客户端)启动时收集到的一些信息,比如操作系统类型、网卡ip等静态信息。grains的信息是静态的,并不会时时变更,
它只是在 minion 启动时收集到的;
(2)pillar:
pillar 和 grains 不一样,是在 master 上定义的,并且是针对 minion 定义的一些信息。像一些比较重要的数据(密码)可以存在 pillar 里,
还可以定义变量等;
(3)state:
它是saltstack的最核心功能,通过预先指定好的sls文件对被控主机进行管理:包/文件/网络配置/系统服务/系统用户等;
6、服务器分配:
本实验用的是saltstack的Master/Minion模式;
服务器名称 |
ip地址 |
controller-node1(主) |
172.16.1.90 |
slave-node1(从) |
172.16.1.91 |
4.2、软件安装:
1、安装saltstack yum源,主从一致:
[root@controller-node1 ~]# yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest.el7.noarch.rpm
2、主节点安装salt-master:
[root@controller-node1 ~]# yum install salt-master
3、从节点安装slat-minion:
[root@slave-node1 ~]# yum install salt-minion
4.3、saltstack配置文件配置:
1、主节点:
[root@controller-node1 ~]# grep -Ev "^#|^$" /etc/salt/master
interface: 172.16.1.90
publish_port: 4505
#默认值;
user: root
#默认值;
ret_port: 4506
#默认值;
timeout: 15
#saltstack执行命令的超时时间,默认是5秒;
state_top: top.sls
#默认值;
file_roots:
base:
- /srv/salt/base
dev:
- /srv/salt/dev
test:
- /srv/salt/test
prod:
- /srv/salt/prod
pillar_roots:
base:
- /srv/pillar/base
dev:
- /srv/pillar/dev
test:
- /srv/pillar/test
prod:
- /srv/pillar/prod
[root@controller-node1 ~]# mkdir -p /srv/salt/{base,dev,test,prod}
[root@controller-node1 ~]# tree /srv/salt/
/srv/salt/
├── base
├── dev
├── prod
└── test
4 directories, 0 files
[root@controller-node1 ~]# mkdir -p /srv/pillar/{base,dev,test,prod}
[root@controller-node1 ~]# tree /srv/pillar/
/srv/pillar/
├── base
├── dev
├── prod
└── test
4 directories, 0 files
2、从节点:
[root@slave-node1 ~]# grep -Ev "^#|^$" /etc/salt/minion
master: 172.16.1.90
master_port: 4506
#默认值;
user: root
#默认值;
id: 172.16.1.91
4.4、启动saltstack服务并加入到开机自启动:
1、主节点:
[root@controller-node1 ~]# systemctl start salt-master
[root@controller-node1 ~]# systemctl enable salt-master
[root@controller-node1 ~]# netstat -tunlp | grep "45"
tcp 0 0 172.16.1.90:4505 0.0.0.0:* LISTEN 1962/python
tcp 0 0 172.16.1.90:4506 0.0.0.0:* LISTEN 1968/python
[root@controller-node1 ~]# lsof -ni:4505
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
salt-mast 12990 root 16u IPv4 64670 0t0 TCP 172.16.1.90:4505 (LISTEN)
salt-mast 12990 root 18u IPv4 68274 0t0 TCP 172.16.1.90:4505->172.16.1.91:60502 (ESTABLISHED)
2、从节点:
[root@slave-node1 ~]# systemctl start salt-minion.service
[root@slave-node1 ~]# systemctl enable salt-minion.service
[root@slave-node1 ~]# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1052/sshd
tcp6 0 0 :::22 :::* LISTEN 1052/sshd
[root@slave-node1 ~]# lsof -ni:4505
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
salt-mini 1888 root 21u IPv4 29671 0t0 TCP 172.16.1.91:60502->172.16.1.90:4505 (ESTABLISHED)
4.5、将从节点加入到主节点:
1、列出saltstack当前节点状况:
[root@controller-node1 ~]# salt-key -l all
Accepted Keys:
Denied Keys:
Unaccepted Keys:
172.16.1.91
Rejected Keys:
2、将从节点加入:
[root@controller-node1 ~]# salt-key -a 172.16.1.91 #支持通配符,比如 salt-key -a 172.*
The following keys are going to be accepted:
Unaccepted Keys:
172.16.1.91
Proceed? [n/Y] y
Key for minion 172.16.1.91 accepted.
[root@controller-node1 ~]# salt-key -l all
Accepted Keys:
172.16.1.91
Denied Keys:
Unaccepted Keys:
Rejected Keys:
3、补充:
1、saltstack salt-key动作命令(支持通配符):
[root@controller-node1 ~]# salt-key --help
-l ARG:列出公钥;
pre、un和unaccepted将列出未接受公钥的minion;
acc或accepted将列出已接受公钥的minion;
rej或rejected将列出被拒绝接收公钥的minion;
den或denied将列出被拒绝接收公钥的minion;
all将列出所有键;
-L: --list-all列出所有公钥;
-a ACCEPT:接受指定minion的公钥,默认范围是Unaccepted Keys;
--include-rejected
--include-denied
-A:接受所有minion为未接受的公钥,默认范围是Unaccepted Keys;
--include-all #包括rejected和denied、unaccepted;
--include-rejected
--include-denied
-r REJECT:拒绝接受指定minion的公钥,默认范围是Unaccepted Keys;
--include-accepted
--include-denied
-R:拒绝所有minion的公钥,默认范围是Unaccepted Keys;
--include-all #包括accepted和denied、unaccepted;
--include-accepted
--include-denied
-p PRINT: 打印指定的minion的公钥,默认范围是所有区域;
-P:打印所有minion的公钥,默认范围是所有区域;
-d:DELETE:删除指定的minion的公钥,默认范围是所有区域;
-D:删除所有minion的公钥,默认范围是所有区域;
#删除的minion公钥会被放到Unaccepted Keys区域下;
2、saltstack master和minion的认证过程:
(1)master在第一次启动时会在/etc/salt/pki/(空目录)目录下生成master、minion两个目录,在master目录下会生成
master.pem(私钥)和master.pub(公钥)秘钥对和其它的目录;
(2)minion在第一次启动时会在/etc/salt/pki/(空目录)目录下生成master、minion两个目录,在minion目录下会生成
minion.pem(私钥)和minion.pub(公钥)秘钥对和其它的目录,并将自己的公钥发送给master;
(3)在未将minion注册到master时,minion的公钥会被放在master端的/etc/salt/pki/minions_pre/目录下并以
在minion配置文件中配置的id为名称,当minion加入到master后,minion的公钥会被放在master端的
/etc/salt/pki/minions/目录下,并将自己的公钥发送给minion,存放在minion的/etc/salt/pki/minion/目录下,这样便完
成了master和minion的认证,master和minion使用公钥和私钥进行加密,使用的是aes(高级加密标准)的加密算法,非常的
安全;
(4)如果minion配置文件中的id需要改变的解决办法:
1)停止minion服务;
2)在master端使用'salt-key -d <name>'删除公钥在master上;
提示:如果没有执行上面一步,即使删除了minion的公钥,那么minion也会将公钥发送给master
这样就会导致删不掉minion的公钥;
3)删除minion /etc/salt/pki/目录下的所有内容;
4)修改minion配置文件中的id;
5)启动minion服务;
(5)master和minion认证目录:
1)master:
[root@controller-node1 ~]# tree /etc/salt/pki/
/etc/salt/pki/
├── master
│ ├── master.pem
│ ├── master.pub
│ ├── minions
│ │ └── 172.16.1.91
│ ├── minions_autosign
│ ├── minions_denied
│ ├── minions_pre
│ └── minions_rejected
└── minion
2)minion:
[root@slave-node1 ~]# tree /etc/salt/pki/
/etc/salt/pki/
├── master
└── minion
├── minion_master.pub
├── minion.pem
└── minion.pub
(6)根据master和minion的认证原理,可以对master的/etc/salt/目录和/srv/目录进行备份,如果
出现master服务器损坏的情况下可以进行还原,还原步骤如下:
1)关闭salt-master服务:
[root@controller-node1 ~]# systemctl stop salt-master.service
2)还原备份的目录,在还原之前需要对现有的目录进行备份;
3)启动salt-master服务:
[root@controller-node1 ~]# systemctl start salt-master.service
3)忽略salt-master监听总线;
[root@controller-node1 ~]# salt '*' cmd.run 'uptime' --async
4)还原成功,可以正常使用;
4.6、常用远程执行命令;
1、远程命令格式:
命令 目标 模块 参数
2、常用命令:
(1)远程测试:
[root@controller-node1 ~]# salt '*' test.ping
#单引号表示转义,也可以使用\*或"*"
(2)cmd密令:
[root@controller-node1 ~]# salt '*' cmd.run 'uptime'
#cmd命令可以执行linux中一切的命令;
(3)软件安装命令:
[root@controller-node1 ~]# salt '*' pkg.install 'httpd'
(4)网络命令:
[root@controller-node1 ~]# salt '*' network.active_tcp
[root@controller-node1 ~]# salt '*' network.arp
[root@controller-node1 ~]# salt '*' network.connect 172.16.1.91 80
[root@controller-node1 ~]# salt '*' network.get_hostname
[root@controller-node1 ~]# salt '*' network.default_route
(4)服务命令:
[root@controller-node1 ~]# salt '*' service.get_enabled
[root@controller-node1 ~]# salt '*' service.get_disabled
[root@controller-node1 ~]# salt '*' service.start 'httpd'
[root@controller-node1 ~]# salt '*' service.reload 'httpd'
[root@controller-node1 ~]# salt '*' service.stop 'httpd'
[root@controller-node1 ~]# salt '*' service.status 'httpd'
(2)查看top.sls中使用的sls,只能查看/srv/salt/base/目录下的sls;
[root@controller-node1 ~]# salt '*' state.show_top
(3)远程拷贝命令:
[root@controller-node1 ~]# salt-cp '*' /etc/passwd /tmp/
4.7、配置管理:
1、yaml语法说明:
(1)yaml类似于xml文件;
(2)缩进:除第一层不用缩进外,每层之间是两个空格的缩进,不能使用tab键;
(3)冒号:除以冒号结尾或路径外,后面必须要有一个空格;
(4)短横线:表示列表,短横线后面必须要有一个空格;
(5)井号:表示注释;
2、编写安装apache服务的描述文件:
缺点:不自动化,执行时还需要通知哪台机器执行;
[root@controller-node1 ~]# mkdir /srv/salt/base/web/ -p
[root@controller-node1 ~]# vim /srv/salt/base/web/apache.sls
apache-install:
#id,随便写,但是必须要唯一;
pkg.installed:
#远程执行软件安装命令;
- name: httpd
#安装的软件名称;
apache-service:
service.running:
#远程执行软件服务命令;
- name: httpd
#启动httpd;
- enable: True
#将软件加入到开机自启动
#说明,以上配置从上到下依次执行,如果服务已完成则行;
[root@controller-node1 ~]# salt '172.16.1.91' state.sls web.apache
#默认环境是base,换环境需要加saltenv=prod;
3、编写自动化配置:
说明:使用top.sls自动化文件进行配置,该配置文件必须在/srv/salt/base/下面;
[root@controller-node1 ~]# vim /srv/salt/base/top.sls
base:
#调用base环境下的sls;
'172.16.1.91':
#允许哪些机器执行操作,支持通配符;
- web.apache
#sls的名称;
[root@controller-node1 ~]# salt '*' state.highstate
#虽然说是让所有的节点执行工作,但是如果top.sls中没有定义一些节点的执行内容,那么该节就不会执行命令,最小化原则;
4、配置文件执行测试(test=True):
它会告诉你它会干什么,但是不会具体实施,颜色会不同;
[root@controller-node1 ~]# salt '172.16.1.91' state.sls web.apache test=True
[root@controller-node1 ~]# salt '*' state.highstate test=True
4.8、saltstack的数据存储系统Grains和pillar:
1、Grains和pillar的区别:
数据存储类型 |
存储位置 |
类型 |
采集方式 |
场景 |
Grains |
minion |
静态 |
minion启动时,可以手动刷新生效 |
1、获取信息 2、匹配 |
pillar |
master |
动态 |
指定,实时生效 |
1、敏感数据配置 2、匹配 |
2、Grains(谷粒):
Grains存放着salt-minion启动时收集的信息,是静态的信息,在minion上设置,以key-value的形式保存且为明
文,用来保存隐秘的数据是不安全的,设置后需要同步minion上的grains才能生效,Grains应用场景为信息查询;
(1)获取所有的grains信息:
[root@controller-node1 ~]# salt '172.16.1.91' grains.items
(2)获取指定grains信息:
[root@controller-node1 ~]# salt '172.16.1.91' grains.get 'ip4_interfaces:eth1'
172.16.1.91:
- 172.16.1.91
[root@controller-node1 ~]# salt '*' grains.get 'serialnumber'
172.16.1.91:
VMware-56 4d df f4 02 29 4e 45-6f c7 af 78 9d ef a2 44
[root@controller-node1 ~]# salt '*' grains.get 'osrelease'
172.16.1.91:
7.5.1804
(3)远程执行中匹配目标,使用grains匹配minion(缺点:不能指定多个条件且不可控):
[root@controller-node1 ~]# salt -G 'os:CentOS' cmd.run 'uptime'
172.16.1.91:
13:54:02 up 3:50, 1 user, load average: 0.00, 0.01, 0.05
#在所有的minion中grains值为'os:CentOS'的minion执行uptime命令;
(4)在top.sls中匹配使用:
[root@controller-node1 ~]# cat /srv/salt/base/top.sls
base:
'os:CentOS':
- match: grain
- web.apache
(5)grains的自定义需求:
1)在minion上创建grains文件:
[root@controller-node1 ~]# salt '172.16.1.91' cmd.run 'touch /etc/salt/grains'
2)在minion的grains文件中定义item项:
[root@controller-node1 ~]# salt '172.16.1.91' cmd.run 'echo "ip_eth1: 172.16.1.91" >/etc/salt/grains'
3)同步minion的grains:
[root@controller-node1 ~]# salt '172.16.1.91' saltutil.sync_grains
4)获取minion中自定义的item项:
[root@controller-node1 ~]# salt '172.16.1.91' grains.get 'ip_eth1'
172.16.1.91:
172.16.1.91
3、Pillar(柱):
pillar和grains一样是saltstack一个重要的数据存储系统,以key-value形式保存数据,对数据进行了加密,很安全,
主要放一些敏感的数据,比如密码、变量,且只能在top.sls中使用,pillar是在master上设置的,且是针对minion定
义的一些信息,设置后立即生效;
(1)获取minion所有的pillar:
[root@controller-node1 ~]# salt '172.16.1.91' pillar.items
172.16.1.91:
----------
#默认没有是因为master的配置文件中'#pillar_opts: False'选项是没有开启的,不推荐打开;
(2)如何设置pillar:
1)编写pillar安装文件(minion分类):
[root@controller-node1 ~]# cat /srv/pillar/base/apache.sls
{% if grains['os'] == 'CentOS' %}
#在pillar中引入grains进行参数判断;
apache: httpd
#key:apache,value:httpd(要安装的软件名称);
{% elif grains['os'] =='Debian' %}
apache: apache2
{% endif %}
2)编写top.sls文件(minion范围):
[root@controller-node1 ~]# cat /srv/pillar/base/top.sls
base:
'172.16.1.91':
- apache
3)获取设置的pillar:
[root@controller-node1 ~]# salt '*' pillar.items
172.16.1.91:
----------
apache:
httpd
4)在状态文件中引用pillar(安装):
[root@controller-node1 ~]# cat /srv/salt/base/web/apache.sls
apache-install:
pkg.installed:
- name: {{ pillar['apache'] }}
apache-service:
service.running:
- name: {{ pillar['apache'] }}
- enable: True
5)修改/srv/salt/base/top.sls(自动化):
[root@controller-node1 ~]# cat /srv/salt/base/top.sls
base:
'*':
- web.apache
6)执行
[root@controller-node1 ~]# salt '*' state.highstate
7)说明:
test=True和top.sls中的grains匹配在pillar中正常使用;
4.9、将saltstack的返回值写到数据库:
1、在master上安装数据库:
[root@controller-node1 ~]# yum install -y mariadb-server
[root@controller-node1 ~]# systemctl start mariadb
[root@controller-node1 ~]# systemctl enable mariadb
2、配置slatstack库:
(1)创建库和表:
参考文档:https://docs.saltstack.com/en/latest/ref/returners/all/salt.returners.mysql.html
[root@controller-node1 ~]# mysql -uroot -p123456
MariaDB [(none)]>
CREATE DATABASE salt DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
USE salt;
CREATE TABLE `jids` (
`jid` varchar(255) NOT NULL,
`load` mediumtext NOT NULL,
UNIQUE KEY `jid` (`jid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `salt_returns` (
`fun` varchar(50) NOT NULL,
`jid` varchar(255) NOT NULL,
`return` mediumtext NOT NULL,
`id` varchar(255) NOT NULL,
`success` varchar(10) NOT NULL,
`full_ret` mediumtext NOT NULL,
`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
KEY `id` (`id`),
KEY `jid` (`jid`),
KEY `fun` (`fun`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `salt_events` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`tag` varchar(255) NOT NULL,
`data` mediumtext NOT NULL,
`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`master_id` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `tag` (`tag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
MariaDB [salt]> show tables;
+----------------+
| Tables_in_salt |
+----------------+
| jids |
| salt_events |
| salt_returns |
+----------------+
3 rows in set (0.00 sec)
3、给库进行授权:
MariaDB [salt]> grant all on salt.* to salt@'172.16.1.%' identified by '123456';
MariaDB [salt]> flush privileges;
4、安装mysql的python模块:
[root@controller-node1 ~]# yum install -y MySQL-python
5、在master的配置文件中添加连接数据库的配置:
[root@controller-node1 ~]# vim /etc/salt/minion #部分配置修改;
cachedir: /var/cache/salt/master
#cache存储路径;
keep_jobs: 12
#mysql返回cache保存的时间,默认是24小时,建议改小,不然saltstack会占用磁盘;
#return: mysql
master_job_cache: mysql
mysql.host: '172.16.1.90'
mysql.user: 'salt'
mysql.pass: '123456'
mysql.db: 'salt'
mysql.port: 3306
6、重启salt-master:
[root@controller-node1 ~]# systemctl restart salt-master.service
7、测试:
[root@controller-node1 ~]# salt '172.16.1.91' cmd.run 'uptime' -v
Executing job with jid 20190729112956524977
-------------------------------------------
172.16.1.91:
11:29:56 up 1:09, 1 user, load average: 0.00, 0.01, 0.05
[root@controller-node1 ~]# salt-run jobs.lookup_jid 20190729112956524977
172.16.1.91:
11:29:56 up 1:09, 1 user, load average: 0.00, 0.01, 0.05
[root@controller-node1 ~]# mysql -uroot -p123456
MariaDB [salt]> select * from salt_returns\G;
*************************** 1. row ***************************
fun: cmd.run
jid: 20190729112956524977
return: " 11:29:56 up 1:09, 1 user, load average: 0.00, 0.01, 0.05"
id: 172.16.1.91
success: 1
full_ret: {"fun_args": ["uptime"], "jid": "20190729112956524977", "return": " 11:29:56 up 1:09, 1 user,
load average: 0.00, 0.01, 0.05", "retcode": 0, "success": true, "cmd": "_return", "_stamp": "2019-07-29T03:29:56.836808",
"fun": "cmd.run", "id": "172.16.1.91"}alter_time: 2019-07-29 11:29:56
8、补充:
(1)以上的mysql返回方法是master的返回,常用;
(2)在minion配置mysql返回,不常用:
1)在minion上安装MySQL-python:
[root@controller-node1 ~]# salt '*' pkg.install 'MySQL-python'
2)在minino的配置文件中添加如下参数:
[root@slave-node1 ~]# vim /etc/salt/minion
#return: mysql
mysql.host: '172.16.1.90'
mysql.user: 'salt'
mysql.pass: '123456'
mysql.db: 'salt'
mysql.port: 3306
2)在命令行使用'--return mysql参数指定返回':
[root@controller-node1 ~]# salt '172.16.1.91' cmd.run 'uptime' --return mysql
4.10、