参考文档:
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_idweb01 就要删除/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`` cronweb01:
- 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 />
示例3: 安装部署MySQL
install mysql software:pkg.installed:- name: mariadb-serverservice.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 httpinstall httpd:pkg.installed:- name: httpdcopy httpd configure:file.managed:- source: salt://files/httpd.conf- name: /etc/httpd/conf/httpd.conf- require:- pkg: install httpdstart 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了。
