1、Saltstack是什么?
saltstack 是一个异构平台基础设施管理工具,具有远程执行、配置管理、云管理、只需花费数分钟就可以运行起来,扩展性足以支撑上万台服务器,速度快,服务器之间秒级通讯数秒钟即可完成数据传递。
Saltstack三大功能
- 远程执行
- 配置管理(状态)
- 云管理
Saltstack四种运行方式
local 本地运行
minion/master 传统方式运行
syndic 分布式
salt SSH
Saltstack常用网址
2、Saltstack快速安装
实验环境
[root@salt0-master yum.repos.d]# uname -a //内核参数
Linux salt0-master 3.10.-.el7.x86_64 # SMP Fri Apr :: UTC x86_64 x86_64 x86_64 GNU/Linux
[root@salt0-master yum.repos.d]# hostname //主机名
salt0-master
[root@salt0-master yum.repos.d]# hostname -I //主机ip
10.0.0.51 172.16.1.51
[root@salt0-master yum.repos.d]# cat /etc/redhat-release //系统版本
CentOS Linux release 7.5. (Core)
虚拟机我给了一核一G,好像有点卡,不过不影响。
1、配置salt官方阿里云yum仓库
[root@salt0-master ~]# yum install -y \
https://mirrors.aliyun.com/saltstack/yum/redhat/salt-repo-latest-2.el7.noarch.rpm [root@salt0-master ~]# sed -i \
"s/repo.saltstack.com/mirrors.aliyun.com\/saltstack/g" /etc/yum.repos.d/salt-latest.repo
[root@salt0-master ~]# yum makecache
注:要确保主机名与文档一致
配置完后,安装Matser,启动服务
[root@salt0-master ~]# yum install salt-master -y
[root@salt0-master ~]# systemctl enable salt-master
[root@salt0-master ~]# systemctl start salt-master
查看端口
[root@master yum.repos.d]# systemctl start salt-master
[root@master yum.repos.d]# netstat -lntup
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 938/sshd
tcp 0 0 0.0.0.0:4505 0.0.0.0:* LISTEN 1679/python
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1022/master
tcp 0 0 0.0.0.0:4506 0.0.0.0:* LISTEN 1685/python
tcp6 0 0 :::3307 :::* LISTEN 933/mysqld
tcp6 0 0 :::3308 :::* LISTEN 934/mysqld
tcp6 0 0 :::3309 :::* LISTEN 936/mysqld
tcp6 0 0 :::3310 :::* LISTEN 940/mysqld
tcp6 0 0 :::22 :::* LISTEN 938/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1022/master
2、安装salt-minion指向salt-master 网络地址
新起一台机器,安装salt-minion
[root@salt1-minion ~]# yum install salt-minion -y #配置master地址或主机名, 建议使用主机名方式
[root@salt1-minion ~]# sed -i '/master: /c\master: salt0-master' /etc/salt/minion
[root@salt1-minion ~]# systemctl enable salt-minion
[root@salt1-minion ~]# systemctl start salt-minion
安装时出现的报错
Error: Package: salt-2018.3.-.el7.noarch (salt-latest)
Requires: systemd-python
Error: Package: salt-master-2018.3.-.el7.noarch (salt-latest)
Requires: systemd-python
Error: Package: python-urllib3-1.10.-.el7.noarch (salt-latest)
Requires: python-backports-ssl_match_hostname
Error: Package: python-tornado-4.2.-.el7.x86_64 (salt-latest)
Requires: python-backports-ssl_match_hostname
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest
解决办法:
查看本地的/ect/yum.repos.d/目录下是否有Base源,如果没有,去阿里云镜像网站,下载centos7系统的base源,安装完成即可解决。
安装完成salt-minion 查看 进程
[root@salt1-minion ~]# ps aux | grep salt
root 1.2 1.5 ? Ss : : /usr/bin/python /usr/bin/salt-minion
root 4.1 2.6 ? Sl : : /usr/bin/python /usr/bin/salt-minion
root 0.0 0.0 pts/ R+ : : grep --color=auto salt
3、salt-master主机验证
[root@salt0-master yum.repos.d]# salt-key
Accepted Keys:
Denied Keys:
Unaccepted Keys:
salt1-minion
Rejected Keys:
如启动发生故障,查看saltstack相关日志:
#服务端日志
[root@salt0-master ~]# tail -f /var/log/salt/master
#客户端日志
[root@salt1-minion ~]# tail -f /var/log/salt/minion
3、Saltstack的认证方式
saltstack是如何进行master主机和minion连接控制的呢?首先,salt的数据传输是通过AES加密的,master和minion之间在通信之前,需要进行认证操作。
salt通过认证的方式保证安全性,完成一次认证后,master就可以控制minion来完成各项工作了。
1、在Minion第一次启动时,会在/etc/salt/pli/minion/下自动生成 minion.pem (也就是private key 私钥)和 minion.pub (public key 公钥)然后将 minion.pub 发送给master
[root@salt1-minion ~]# tree /etc/salt/
/etc/salt/
├── minion
├── minion.d
├── minion_id
└── pki
└── minion
├── minion.pem
└── minion.pub
2、在master第一次启动时,会在 /etc/salt/pki/master/ 下自动生成 master.pem 和 master.pub 接收到 minion 的 public key ,会在 master 的 /ect/salt/pki/master/minions 目录下 存放以 minion id 命名的 public key 同时 minion 会保存一份 master public key 在 /etc/salt/pki/minion_master.pub
[root@salt1-minion ~]# tree /etc/salt/
/etc/salt/
├── minion
├── minion.d
│ └── _schedule.conf
├── minion_id
└── pki
└── minion
├── minion_master.pub
├── minion.pem
└── minion.pub
salt认证原理的小结:
minion 将 自己的公钥 发送给 master
master 认证 之后将自己的公钥 也放置在minion 端
4、Master端key认证示例
[root@linux-node1 ~]# salt-key -L
Accepted Keys: #已经接受的key
Denied Keys: #拒绝的key
Unaccepted Keys: #未加入的key
Rejected Keys: #吊销的key #常用参数
-L #查看KEY状态
-A #允许所有
-D #删除所有
-a #认证指定的key
-d #删除指定的key
-r #注销掉指定key(该状态为未被认证) #在master端/etc/salt/master配置
auto_accept: True #如果对Minion信任,可以配置master自动接受请求
#添加指定minion的key
[root@salt0-master ~]# salt-key -a salt1-minion.example.com -y
#添加所有minion的key
[root@salt0-master ~]# salt-key -A -y
#删除指定的key
[root@salt0-master ~]# salt-key -d salt1-minion.example.com -y
#删除所有的key
[root@salt0-master ~]# salt-key -D -y
salt-key 的使用
[root@salt0-master ~]# salt-key -a salt1-minion -y //添加 salt1-minion 到accepted key
The following keys are going to be accepted:
Unaccepted Keys:
salt1-minion
Key for minion salt1-minion accepted.
[root@salt0-master ~]# salt-key -L //如下表示添加成功
Accepted Keys:
salt1-minion
Denied Keys:
Unaccepted Keys:
Rejected Keys:
查看公钥是否添加
[root@salt0-master ~]# tree /etc/salt/
/etc/salt/
├── cloud
├── cloud.conf.d
├── cloud.deploy.d
├── cloud.maps.d
├── cloud.profiles.d
├── cloud.providers.d
├── master
├── master.d
├── minion
├── minion.d
├── pki
│ ├── master
│ │ ├── master.pem
│ │ ├── master.pub
│ │ ├── minions
│ │ │ └── salt1-minion
│ │ ├── minions_autosign
│ │ ├── minions_denied
│ │ ├── minions_pre
│ │ └── minions_rejected
│ └── minion
├── proxy
├── proxy.d
└── roster
5、Saltstack远程执行初识
判断salt的minion 主机是否存活
[root@salt0-master ~]# salt '*' test.ping
salt1-minion:
True
# salt 是一个命令
# * 表示目标主机, 在这里代表所有目标主机
# test.ping是salt远程执行的一个模块下面的方法。
saltstack可以使用cmd.run 模块 远程执行 shell命令
//让指定目标Minion节点运行uptime命令
[root@salt0-master ~]# salt 'salt1-minion' cmd.run 'uptime'
salt1-minion:
:: up :, user, load average: 0.00, 0.01, 0.05
# Salt提供了大量的模块执行不同的操作, 不建议生产频繁使用cmd.run
cmd.run 这个模块很强大,什么命令都可以执行,比如说创建一个/backup目录
[root@salt0-master ~]# salt 'salt1-minion' cmd.run 'mkdir /backup' //第一次创建
salt1-minion:
mkdir: cannot create directory '/backup': File exists //提示目录已存在
ERROR: Minions returned with non-zero exit code
[root@salt0-master ~]# salt 'salt1-minion' cmd.run 'mkdir /test' //什么都不提示,则代表创建成功
salt1-minion:
[root@salt0-master ~]# salt 'salt1-minion' cmd.run 'll /test' //如果命令输入错误,提示报错
salt1-minion:
/bin/sh: ll: command not found
ERROR: Minions returned with non-zero exit code
[root@salt0-master ~]# salt 'salt1-minion' cmd.run 'ls -l /test' //查看成功
salt1-minion:
total
所以,在生产中,尽量不要用cmd.run这个命令以防误删除等。
6、Saltstack 配置管理
salt 通过状态模块来识别配置描述文件 state 状态文件,格式是 YAML 扩展名后缀是 .sls
1.YAML 基础语法
YAML:
.缩进(层级关系) 2个空格,不能试用Tab。
.冒号 key: value
.短横线 - list1
- list2 .缩进
YAML使用一个固定的缩进风格表示数据层级结构关系,每个缩进由两个空格组成, 不要使用tabs。
.冒号
以冒号结尾, 以冒号为路径的除外,其他所有冒号后面所有必须有空格。
.短横线
表示列表项,使用一个短横杠加一个空格。
多个项使用同样的缩进级别作为同一列表。
2.YAML 配置,设置 base 环境
#定义基础环境目录位置
[root@salt0-master ~]# vim /etc/salt/master
663 # Example:
664 # file_roots:
665 # base: //基础环境目录
666 # - /srv/salt/
667 # dev: //开发环境目录
668 # - /srv/salt/dev/services
669 # - /srv/salt/dev/states
670 # prod: //生产环境目录
671 # - /srv/salt/prod/services
672 # - /srv/salt/prod/states
673 #
674 file_roots: //练习的话只需配置基础环境目录
675 base: //空 2 格
676 - /srv/salt //空 4 格
#修改配置必须重启服务
[root@salt0-master ~]# systemctl restart salt-master
3.编写 YAML 语法文件
[root@salt0-master ~]# mkdir -p /srv/salt/app //创建分类目录,用于生产中,区分业务
[root@salt0-master ~]# cd /srv/salt/app #编写sls文件, apache安装并启动
[root@salt0-master app]# cat apache.sls //书写时,注意YAML语法格式
apache-install:
pkg.installed:
- name: httpd apache-systemctl:
service.running:
- name: httpd
- enable: True
其他的 sls 文件,练习 vsftpd
#编写sls文件, vsftpd安装并启动
[root@salt0-master app]# cat vsftpd.sls
vsftpd_install:
pkg.installed:
- names:
- vsftpd
- httpd-tools vsftpd_systemctl:
service.running:
- name: vsftpd
- enable: True
练习 nginx 安装启动
#编写sls文件, nginx安装并启动
[root@salt0-master app]# cat nginx.sls
nginx-install:
pkg.installed:
- name: nginx nginx-systemctl:
service.running:
- name: nginx
4.使用 salt 命令的 state 状态模块 让所有的 minion 都应用该配置
[root@salt0-master app]# salt '*' state.sls app.apache
注: salt 是命令, * 是指 全部主机, state.sls 是状态模块 , app.apache 是文件名字
温馨提示:
在操作之前可以加上 test=True ,这个是验证操作,比如说 sed 和 sed -i 的意思。不会真的执行,模拟执行一遍,会出现黄色的字体,属于正常现象。
5.查看是否运行成功,如下则成功
[root@salt0-master app]# salt '*' state.sls app.apache
salt1-minion:
----------
ID: apache-install
Function: pkg.installed
Name: httpd
Result: True
Comment: The following packages were installed/updated: httpd
Started: 13:15:37.094711
Duration: 15305.052 ms
Changes:
----------
apr:
----------
new:
1.4.8-3.el7_4.1
old:
apr-util:
----------
new:
1.5.2-6.el7
old:
httpd:
----------
new:
2.4.6-80.el7.centos.1
old:
httpd-tools:
----------
new:
2.4.6-80.el7.centos.1
old:
mailcap:
----------
new:
2.1.41-2.el7
old:
----------
ID: apache-systemctl
Function: service.running
Name: httpd
Result: True
Comment: Service httpd has been enabled, and is running
Started: 13:15:52.420757
Duration: 732.984 ms
Changes:
----------
httpd:
True Summary for salt1-minion
------------
Succeeded: 2 (changed=2)
Failed: 0
------------
Total states run: 2
Total run time: 16.038 s
oldboy.com:
----------
ID: apache-install
Function: pkg.installed
Name: httpd
Result: True
Comment: The following packages were installed/updated: httpd
Started: 13:15:40.262922
Duration: 19089.429 ms
Changes:
----------
apr:
----------
new:
1.4.8-3.el7_4.1
old:
apr-util:
----------
new:
1.5.2-6.el7
old:
httpd:
----------
new:
2.4.6-80.el7.centos.1
old:
httpd-tools:
----------
new:
2.4.6-80.el7.centos.1
old:
mailcap:
----------
new:
2.1.41-2.el7
old:
----------
ID: apache-systemctl
Function: service.running
Name: httpd
Result: True
Comment: Service httpd has been enabled, and is running
Started: 13:15:59.465455
Duration: 1764.248 ms
Changes:
----------
httpd:
True Summary for oldboy.com
------------
Succeeded: 2 (changed=2)
Failed: 0
------------
Total states run: 2
Total run time: 20.854 s
注:其实在 master 主机上执行 salt 命令就是在 minion 上调用 服务,比如下载nginx ,我们在minion 上可以用 ps aux | grep yum 查看到 正在用 yum install nginx 下载。
查看 minion 主机 80端口是否开启
[root@salt1-minion ~]# netstat -lntup
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.0.0:* LISTEN /sshd
tcp 127.0.0.1: 0.0.0.0:* LISTEN /master
tcp6 0 0 :::80 :::* LISTEN 3597/httpd
tcp6 ::: :::* LISTEN /sshd
tcp6 ::: :::* LISTEN /master
7、Saltstack 高级状态模块
如果想不同的主机应用不同的配置, 则需要使用到 salt
高级状态模块
#top_file_merging_strategy: merge # To specify the order in which environments are merged, set the ordering
# in the env_order option. Given a conflict, the last matching value will
# win.
#env_order: ['base', 'dev', 'prod'] # If top_file_merging_strategy is set to 'same' and an environment does not
# contain a top file, the top file in the environment specified by default_top
# will be used instead.
#default_top: base //默认的是base
当使用salt
命令执行高级状态, 会将topfile
当做入口文件,进行调用
编写 topfile 文件
# topfile入口文件只能放置在base环境
[root@salt0-master salt]# cat top.sls
base:
'salt1-minion': //第一台机器执行app.nginx
- app.nginx
'oldboy.com': //第二台机器执行app.nginx 和 app.apache
- app.nginx
- app.apache
执行命令将应用发送给所有主机
[root@salt0-master salt]# salt '*' state.highstate //高级状态调用的是 state.highstate ,字面意思就是 高级状态
然后我们就会看到,每台主机都是按照当时设定的安装不同的服务。
小结:
1.首先确定 top 文件和 top 文件里执行的那些文件 都是在base环境下的。
2.使用state.highstate 就会第一个先找到top.sls。
8、Saltstack 消息队列
Saltstack 可以支撑数以千计,甚至更多的服务器,这些性能主要来自于ZeroMq ,因为saltstack的底层是基于 zeromq 进行高效的网络通信。zeromq是一个简单好用的传输层,像框架一样的一个套接字库,他使得socket 编程更加简单,简洁 和性能更高。
发布与订阅
zeromq 支持 publish 和 subscribe 即 发布与订阅模式,
Salt Master
运行两个网络服务
一个是 ZeroMQ PUB
消息发布与订阅系统,默认监听 4505
端口, 主要用于 Master
对 Minion
下发指令
#所有的Minion连接到Master的4505端口TCP状态持续保持为ESTABLISHED
[root@linux-node1]# yum install lsof -y [root@salt0-master salt]# lsof -i :
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
salt-mast root 16u IPv4 0t0 TCP *: (LISTEN)
salt-mast root 18u IPv4 0t0 TCP db01:->db02: (ESTABLISHED)
salt-mast root 19u IPv4 0t0 TCP db01:->172.16.1.53: (ESTABLISHED)
注意: 可以修改/etc/salt/master配置文件的publish_port参数设置端口。
请求与响应
ZeroMQ
支持Request-Reply
请求与响应模式,简称REQ/REP
Salt Master
运行的第二个网络服务就是ZeroMQ REP
系统,默认监听4506端口salt
客户端与服务端通信的端口
同时也主要用于Master
接收Minion
执行某个命令后的返回值
注意: 可以修改/etc/salt/master配置文件的ret_port参数设置。
显示SaltStack进程名称方式
[root@linux-node1]# yum install -y python-setproctitle
[root@linux-node1]# ps aux | grep salt
/usr/bin/salt-master -d ProcessManager #中心进程管理器
/usr/bin/salt-master -d _clear_old_jobs #清除旧的Jobs文件及更新fileserver
/usr/bin/salt-master -d Publisher #将任务PUB到Minion端
/usr/bin/salt-master -d EventPublisher #Event Publisher进程
/usr/bin/salt-master -d ReqServer_ProcessManager #ReqServer进程管理器
/usr/bin/salt-master -d MWorker #工作进程
/usr/bin/salt-master -d MWorker #工作进程
/usr/bin/salt-master -d MWorker #工作进程
/usr/bin/salt-master -d MWorker #工作进程
/usr/bin/salt-master -d MWorker #工作进程
/usr/bin/salt-master -d MWorkerQueue #将Ret接口(ROUTER)数据转发到Worker(DEALER)
9、Saltstack 常用配置
salt master 配置
Salt Master
端的配置是修改/etc/salt下master
配置文件。以下是Master
端常用的配置。
interface: //指定bind 的地址(默认为0.0.0.0)
publish_port: //指定发布端⼝(默认为4505)
ret_port: //指定结果返回端⼝, 与minion配置⽂件中的master_port对应(默认为4506)
user: //指定master进程的运⾏⽤户,如果调整, 则需要调整部分目录的权限(默认为root)
timeout: //指定timeout时间, 如果minion规模庞⼤或⺴络状况不好,建议增⼤该值(默认5s)
keep_jobs: //minion执⾏结果返回master, master会缓存到本地的cachedir目录,该参数指定缓存多⻓时间,可查看之间执行结果会占⽤磁盘空间(默认为24h)
job_cache: //master是否缓存执⾏结果,如果规模庞⼤(超过5000台),建议使⽤其他⽅式来存储jobs,关闭本选项(默认为True)
file_recv : //是否允许minion传送⽂件到master 上(默认是Flase)
file_roots: //指定file server目录, 默认为:
file_roots:
base:
- /srv/salt
pillar_roots : //指定pillar ⺫录, 默认为:
pillar_roots:
base:
- /srv/pillar
log_level: //⽇志级别
⽀持的⽇志级别有'garbage', 'trace', 'debug', info', 'warning', 'error', ‘critical ’ ( 默认为’warning’)
Salt Minion配置Minion
端配置非常简单,一般只需要修改两个配置即可。
[root@minion ~]# vim /etc/salt/minion
master: 192.168.56.11 //修改master为master的IP地址
id: //客户端的id,默认不设置会取客户端的完整主机名
Salt Minion
端常用配置
master: //指定master 主机(默认为salt)
master_port: //指定认证和执⾏结果发送到master的哪个端⼝, 与master配置⽂件中的ret_port对应(默认为4506)
id: //指定本minion的标识, salt内部使⽤id作为标识(默认为主机名)
user: //指定运⾏minion的⽤户.由于安装包,启动服务等操作需要特权⽤户, 推荐使⽤root( 默认为root)
cache_jobs : //minion是否缓存执⾏结果(默认为False)
backup_mode: //在⽂件操作(file.managed 或file.recurse) 时, 如果⽂件发⽣变更,指定备份目录.当前有效
providers : //指定模块对应的providers, 如在RHEL系列中, pkg对应的providers 是yumpkg5
renderer: //指定配置管理系统中的渲染器(默认值为:yaml_jinja )
file_client : //指定file clinet 默认去哪⾥(remote 或local) 寻找⽂件(默认值为remote)
loglevel: //指定⽇志级别(默认为warning)
tcp_keepalive : //minion 是否与master 保持keepalive 检查, zeromq3(默认为True)