参考文档:
https://www.cnblogs.com/xintiao-/p/10380656.html
https://blog.51cto.com/13760226/2308580
https://www.cnblogs.com/wangshuyang/p/9051690.html
视频地址:
https://www.bilibili.com/video/BV1cQ4y1P7dg?from=search&seid=11256427180171665047

一,saltstack自动化运维工具

基于python开发,用户批量管控服务器(管理上千台服务器-可配合ansible)。

  1. saltstack角色:

salt-master:管理端软件
salt-minion:被管理端软件
salt-syndic: salt代理

  1. 支持分布式部署:

saltstack.png

  1. 支持证书的方式认证:安全。

证书.png

  1. 结合zeroMQ消息队列,python模块设计
  2. 提供salt-api方便编程语言的调用
  3. 提供进程,网络,用户,服务,软件等管理模块

二,saltstack的部署

  • 环境部署:

管理端:
[root@m01 ~]# yum install salt-master -y
[root@m01 ~]# vim /etc/salt/master #可以默认,之后需要在修改
[root@m01 ~]# systemctl start salt-master
[root@m01 ~]# systemctl enable salt-master
[root@m01 ~]# netstat -antp |grep python
tcp 0 0 172.16.1.61:4505 0.0.0.0: LISTEN 1527/python
tcp 0 0 172.16.1.61:4506 0.0.0.0:
LISTEN 1549/python
[root@m01 ~]#cp /etc/salt/master /etc/salt/master.bak
[root@m01 ~]# vim /etc/salt/master

被控端:
[root@lb01 ~]# yum install salt-minion -y
[root@lb01 ~]# systemctl start salt-minion.service
[root@lb01 ~]# systemctl enable salt-minion.service
[root@lb01 ~]# grep "^[a-Z]" /etc/salt/minion
master: 172.16.1.61
id: 172.16.1.5
其他相同:

  • 在master:签收证书

(minion首次启动的时—>>master发送证书)
[root@m01 ~]# salt-key -L
Accepted Keys:
172.16.1.5
web01
web02
Denied Keys:
Unaccepted Keys: #未接收的证书
Rejected Keys: #拒绝的key

[root@m01 ~]# salt-key -A #接收所用证书申请
The key glob ‘*’ does not match any unaccepted keys.

salt-key命令的使用: -L #显示所有证书信息 -A #签收所有minion 证书 -a minion_id
-D #删除所有minion证书 -d #不能管理minion了

如果minion端主机名称/ip改变需要更新id: [root@web01 ~]# cat /etc/salt/minion_id web01 就要删除/etc/salt/minion_id文件或者清空/etc/salt/minion_id文件里面的内容,然后重启minion服务。


简单操作:
[root@m01 ~]# salt ‘*’ test.ping
172.16.1.5:
True
web02:
True
web01:
True

salt ‘*’ cmd.run ‘uptime’
web02:
10:51:50 up 2 days, 12:05, 1 user, load average: 0.00, 0.01, 0.05
web01:
10:51:51 up 2 days, 12:05, 1 user, load average: 0.00, 0.01, 0.05
172.16.1.5:
10:51:50 up 2 days, 12:05, 2 users, load average: 0.00, 0.01, 0.05


三,saltstack管控方式:

1、调用saltstack提供的模块 (类似ansible-adhoc)
2、写sls状态文件 (类ansible-plybook)

1.调用salstack提供的模块

1、salt命令的使用

  1. Usage: `salt ``[``options``]`` ``'``<target>``'`` ``<``function``>`` ``[``arguments``] `<br /> options选项:支持多种匹配minion的写法
  2. 1) -L 支持使用逗号隔开的方式写多个minion_ID<br /> [root@salt-master ~]_# salt -L 'web01,192.168.183.12' test.ping_<br /> <br /> 2) -E 支持正则表达式的方式匹配minion <br /> [root@salt-master ~]_# salt -E '^192' test.ping_
  3. 3) -S 支持以网段的方式匹配minion <br /> [root@salt-master ~]_# salt -S '192.168.183.0/24' test.ping_
  4. 4) -N 支持以主机组的方式匹配minion <br /> <br /> [root@salt-master ~]_# salt -N 'group1' test.ping #_ 事先在master端定义主机组, /etc/salt/master <br /> #nodegro<br />group1: 'L@ID,ID'
  5. 5) -G 支持以grains数据组件中的数据匹配minion <br /> [root@salt-master ~]_# salt -G 'os:CentOS' test.ping_<br /> <br /> grains 数据组件 <br /> 用于保存minion状态信息(IP、主机名、系统版本、内核、BIOS等)的数据组件 <br /> <br /> 查看grains中的数据(键值对)<br /> [root@salt-master ~]_# salt 'web01' grains.items_<br />salt 'web01' grains.items<br />web01:<br /> ----------<br /> SSDs:<br /> biosreleasedate:<br /> 07/29/2019<br /> biosversion:<br /> 6.00<br /> cpu_flags:<br /> - fpu<br />...

键值对存储是数据库最简单的组织形式。 键:就是du存的值的编号 值:就是要存放的数据

2、常见模块应用

查看帮助:
1) 查看所有模块
[root@salt-master ~]# salt ‘web01’ sys.list_modules

2) 查看模块提供的操作方法
[root@salt-master ~]# salt ‘web01’ sys.list_functions user

3) 查看方法的使用
[root@salt-master ~]# salt ‘web01’ sys.doc user.add

1) test.ping 测试与minion的通信
[root@salt-master ~]# salt ‘*’ test.ping

2) cmd.run 执行命令
[root@salt-master ~]# salt ‘*’ cmd.run ‘uptime’
[root@salt-master ~]# salt ‘*’ cmd.run ‘df -hT’

3) 软件管理模块 pkg
[root@salt-master ~]# salt ‘*’ pkg.install vsftpd
salt ‘web01’ sys.list_functions pkg
web01:
- pkg.available_version
- pkg.check_db
- pkg.clean_metadata
- pkg.download
- pkg.file_list
- pkg.install
- pkg.latest_version
- pkg.remove
- pkg.list_repo_pkgs
- pkg.list_repos

4) 服务管理模块 service
[root@salt-master ~]# salt ‘*’ service.start vsftpd
[root@salt-master ~]# salt ‘*’ service.enable vsftpd

5) 用户/用户组管理模块 user/group模块
[root@m01 ~]# salt ‘web01’ sys.list_functions group
web01:
- group.add
- group.delete
- group.info
- group.members

salt ‘web01’ sys.list_functions user
web01:
- user.add

…# salt ‘web01’ sys.doc user.add ‘user.add:’ Add a user to the minion CLI Example: salt ‘*’ user.add name

[root@salt-master ~]# salt ‘*’ group.add jishu
[root@salt-master ~]# salt ‘*’ user.add openstack
[root@salt-master ~]# salt ‘*’ user.chgroups openstack jishu

6) 计划任务管理模块 cron

[root@m01 ~]# salt 'web01' ``sys.list_functions`` cron web01:

  • cron.list_tab
  • cron.ls
  • cron.raw_cron
  • cron.rm
  • cron.rm_env
  • cron.rm_job
  • cron.set_env
  • cron.set_job
  • cron.set_special
  • cron.write_cron_file
  • cron.write_cron_file_verbose

salt 'web01' sys.doc cron.set_job ‘cron.set_job:’ Sets a cron job up for a specified user. CLI Example: salt ‘‘ cron.set_job root ‘‘ ‘‘ ‘‘ ‘*’ 1 /usr/local/weekly

[root@salt-master ~]# salt ‘‘ cron.set_job root “30” “23” ““ ““ ““ “/usr/sbin/ntpdate 120.25.108.11”

7) 文件管理模块 file
[root@salt-master ~]# salt ‘*’ file.append /etc/hosts “1.1.1.1 test1.linux.com” #追加
[root@salt-master ~]# salt ‘*’ file.write /tmp/file01 “abc” #覆盖

8) hosts文件管理模块
[root@salt-master ~]# salt ‘*’ hosts.add_host 1.1.1.1 test1 #追究hosts解析
[root@salt-master ~]# salt ‘*’ hosts.set_host 1.1.1.1 test2 #覆盖hosts解析


四、sls状态文件

  1. 通过使用state组件提供模块<br /> 查看帮助:<br /> 1) 查看state组件提供的模块 <br /> [root@salt-master ~]_# salt 'web01' sys.list_state_modules _<br /> <br /> 2) 查看模块的方法 <br /> [root@salt-master ~]_# salt 'web01' sys.list_state_functions user _
  2. 3) 查看方法的使用 <br /> [root@salt-master ~]_# __salt 'web01' sys.state_doc user.present_

遵循yaml语法: 1) 同级别代码要有相同缩进; 建议4个空格
2) key: value, 冒号后必须要有一个空格
3) 一个键对应多个值时,每个值单独占一行, 每个值需要有一个-横线 key:

  1. - value1
  2. - value2
  3. - value3


状态文件大体格式 *.sls
任务名称: 模块名称: 参数 参数 参数 模块名称: 参数 参数 参数

示例1:创建用户的功能
1、定义保存状态文件的环境
本质就是个目录, saltstack默认只识别base环境 (将默认的注释去掉)
[root@salt-master ~]# vim /etc/salt/master
file_roots:
base:
- /srv/salt

[root@salt-master ~]# mkdir /srv/salt
2、编写创建用户的状态文件

[root@salt-master ~]# cat /srv/salt/userCreate.sls
create hadoop user:
user.present:
- name: hadoop
- shell: /sbin/nologin

1. 如何执行状态文件?

  1. 方法1) state.sls 文件名称 <br /> [root@salt-master ~]_# __salt '*' state.sls userCreate __ #env=_<br /> 针对所有minon,执行base环境中名称为userCreate的状态文件中的操作 <br /> <br /> 方法2) state.highstate 执行状态名:<br /> 入口文件 top.sls (定义了路径)<br /> <br /> 定义minon与状态文件间的关系 <br /> [root@m01 usercreate]# cat /srv/salt/top.sls
  1. base: #base环境下
  2. "*": #定义执行的对象
  3. - usrcreate #执行的文件,必须在定义的环境下
  1. [root@salt-master ~]_# salt '*' state.highstate _

示例2:推送文件功能
cat /srv/salt/files/pushfile.sls

  1. push file:
  2. file.managed:
  3. - source: salt://files/file01.test
  4. - name: /opt/file01.test
  5. - user: nobody
  6. - group: nobody
  7. - mode: 0600
  1. salt://<br /> 代表的是状态文件所在环境对应的目录名称 <br /> <br />![文件地址.png](https://cdn.nlark.com/yuque/0/2020/png/1581532/1594298890978-8fbbe13f-a9ee-45e7-adc2-866fbd2d7c9d.png#align=left&display=inline&height=513&margin=%5Bobject%20Object%5D&name=%E6%96%87%E4%BB%B6%E5%9C%B0%E5%9D%80.png&originHeight=513&originWidth=1102&size=1699348&status=done&style=none&width=1102)

示例3: 安装部署MySQL

  1. install mysql software:
  2. pkg.installed:
  3. - name: mariadb-server
  4. service.running:
  5. - name: mariadb
  6. - enable: True

资源的依赖关系
1、unless #一般用于防止重复执行
cmd.run模块的参数 #只有unless后的命令执行失败,name参数对应的命令才执行
cat /srv/salt/unless_test.sls

  1. install dhcp:
  2. cmd.run:
  3. - name: yum install -y dhcp
  4. - unless: rpm -q dhcp #有点想if条件判断

salt '*' state.sls unless_test

2、定义资源的依赖关系
require 我依赖谁 #换行 模块名 :操作排名
requirein 我被谁依赖
[root@salt-master ~]
# cat /srv/salt/httpd.sls _

  1. [root@m01 ~]# salt '*' cmd.run 'systemctl stop nginx'
  2. lb01:
  3. web01:
  4. web02:
  5. [root@m01 ~]# salt '*' state.sls http
  6. install httpd:
  7. pkg.installed:
  8. - name: httpd
  9. copy httpd configure:
  10. file.managed:
  11. - source: salt://files/httpd.conf
  12. - name: /etc/httpd/conf/httpd.conf
  13. - require:
  14. - pkg: install httpd
  15. start httpd deamon:
  16. service.running:
  17. - name: httpd
  18. - enable: True
  19. - require:
  20. - pkg: install httpd
  21. - file: copy httpd configure



2、 定义资源的关注关系
watch 我关注谁
watchin 我被谁关注
适用场景:检测配置文件变化,自动加载配置文件

[root@salt-master ~]
# cat /srv/salt/httpd.sls _
copy config file:
file.managed:
- source: salt://files/httpd.conf
- name: /etc/httpd/conf/httpd.conf

  1. start httpd deamon:<br /> service.running:<br /> - name: httpd<br /> - enable: True<br /> - require:<br /> - file: copy config file<br /> - watch:<br /> - file: copy config file<br /> <br /> <br />

2. Jinja模板

  1. 支持在文件模板中使用变量,增加配置文件的灵活性 <br /> <br /> 在文件模板中使用变量 {{ 变量名称 }}

[root@salt-master ~]# grep -i “^Listen” /srv/salt/files/httpd.conf
Listen {{ http_port }} //调用http_port变量的值作为服务端口

在SLS文件中为变量赋值

[root@salt-master ~]# cat /srv/salt/httpd.sls
copy config file:
file.managed:
- source: salt://files/httpd.conf
- name: /etc/httpd/conf/httpd.conf
- template: jinja //标识源文件为一个jinja模板文件
- defaults: //为模板中的变量赋值
http_port: 6666

start httpd deamon:
service.running:
- name: httpd
- enable: True
- require:
- file: copy config file
- watch:
- file: copy config file

同时支持调用grains数据组件中的数据,进一步增加灵活性
Listen {{ grains[“ip4_interfaces”][“ens33”][0] }}:{{ http_port }}


五,salt minion 和salt master之间重新建立认证

修改了minion端的id之后 比如修改了hostname之后, minion端会将minion的id 存放在/etc/salt/minion_id 文件中,重启不会改变。

所以要重新认证就需要以下2步:

  • 清空minion_id

> /etc/salt/minion_id

  • 删除minion存放masterkey的文件pki文件夹下所以的东西

rm -rf /etc/salt/pki/*

  • 重启minion

service salt-minion restart
在master端:
删除pki文件之后,重启即可:
rm -rf /etc/salt/pki/*
service salt-master restart
之后就可以salt-key看到新的minion id了。