参考文档:
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)。
- saltstack角色:
salt-master:管理端软件
salt-minion:被管理端软件
salt-syndic: salt代理
- 支持分布式部署:
- 支持证书的方式认证:安全。
- 结合zeroMQ消息队列,python模块设计
- 提供salt-api方便编程语言的调用
- 提供进程,网络,用户,服务,软件等管理模块
二,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命令的使用
Usage: `salt ``[``options``]`` ``'``<target>``'`` ``<``function``>`` ``[``arguments``] `<br /> options选项:支持多种匹配minion的写法
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) -S 支持以网段的方式匹配minion <br /> [root@salt-master ~]_# salt -S '192.168.183.0/24' test.ping_
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) -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状态文件
通过使用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 _
3) 查看方法的使用 <br /> [root@salt-master ~]_# __salt 'web01' sys.state_doc user.present_
遵循yaml语法: 1) 同级别代码要有相同缩进; 建议4个空格
2) key: value, 冒号后必须要有一个空格
3) 一个键对应多个值时,每个值单独占一行, 每个值需要有一个-横线 key:
- value1
- value2
- 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) 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
base: #base环境下
"*": #定义执行的对象
- usrcreate #执行的文件,必须在定义的环境下
[root@salt-master ~]_# salt '*' state.highstate _
示例2:推送文件功能
cat /srv/salt/files/pushfile.sls
push file:
file.managed:
- source: salt://files/file01.test
- name: /opt/file01.test
- user: nobody
- group: nobody
- mode: 0600
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
install mysql software:
pkg.installed:
- name: mariadb-server
service.running:
- name: mariadb
- enable: True
资源的依赖关系
1、unless #一般用于防止重复执行
cmd.run模块的参数 #只有unless后的命令执行失败,name参数对应的命令才执行
cat /srv/salt/unless_test.sls
install dhcp:
cmd.run:
- name: yum install -y dhcp
- unless: rpm -q dhcp #有点想if条件判断
salt '*' state.sls unless_test
2、定义资源的依赖关系
require 我依赖谁 #换行 模块名 :操作排名
requirein 我被谁依赖
[root@salt-master ~]# cat /srv/salt/httpd.sls _
[root@m01 ~]# salt '*' cmd.run 'systemctl stop nginx'
lb01:
web01:
web02:
[root@m01 ~]# salt '*' state.sls http
install httpd:
pkg.installed:
- name: httpd
copy httpd configure:
file.managed:
- source: salt://files/httpd.conf
- name: /etc/httpd/conf/httpd.conf
- require:
- pkg: install httpd
start httpd deamon:
service.running:
- name: httpd
- enable: True
- require:
- pkg: install httpd
- 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
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模板
支持在文件模板中使用变量,增加配置文件的灵活性 <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了。