Saltstack-实战-自动化运维工具

2018年4月13日12:38:18 1 924 views
摘要

SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,一般可以理解为简化版的puppet和加强版的func。SaltStack基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建。通过部署SaltStack环境,我们可以在成千上万台服务器上做到批量执行命令,根据不同业务特性进行配置集中化管理、分发文件、采集服务器数据、操作系统基础及软件包管理等,SaltStack是运维人员提高工作效率、规范业务配置与操作的利器。

Saltstack-实战-自动化运维工具
一、Master与Minion认证
1、minion在第一次启动时,会在/etc/salt/pki/minion/(该路径在/etc/salt/minion里面设置)下自动生成minion.pem(private key)和 minion.pub(public key),然后将 minion.pub发送给master。
2、master在接收到minion的public key后,通过salt-key命令accept minion public key,这样在master的/etc/salt/pki/master/minions下的将会存放以minion id命名的 public key,然后master就能对minion发送指令了。
SaltStack master启动后默认监听4505和4506两个端口。4505(publish_port)为saltstack的消息发布系统,4506(ret_port)为saltstack客户端与服务端通信的端口。如果使用lsof 查看4505端口,会发现所有的minion在4505端口持续保持在ESTABLISHED长连接状态
二、saltstack安装部署
基本环境

2.2.2.148    master/node2      2.2.2.149    minion/node3

  1. [root@node2 servers]# uname -ar
  2. Linux node2 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
  3. [root@node2 servers]# cat /etc/redhat-release
  4. CentOS Linux release 7.3.1611 (Core)
 部署安装:
mater:2.2.2.148
  1. [root@node2 servers]# sudo yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
  2. [root@node2 servers]# sudo yum clean expire-cache
  3. [root@node2 ~]# sudo yum install salt-minion -y
  4. [root@node2 servers]# systemctl start salt-master
  5. [root@node2 servers]# ss -tunlp|grep salt
  6. tcp    LISTEN     0      128       *:4505                  *:*                   users:(("salt-master",pid=25993,fd=16))
  7. tcp    LISTEN     0      128       *:4506                  *:*                   users:(("salt-master",pid=25999,fd=24))
  8. [root@node2 servers]# egrep -ivE "^$|^#" /etc/salt/minion
  9. master: 2.2.2.148
  10. di: 2.2.2.149  //随便命名一个id号,可以理解为给agent起的一个别名
  11. [root@node2 servers]# systemctl start salt-minion
  12. [root@node2 servers]# ps -ef | grep salt-minion
  13. root      29236      1  0 15:54 ?        00:00:00 /usr/bin/python /usr/bin/salt-minion
  14. root      29239  29236  3 15:54 ?        00:00:00 /usr/bin/python /usr/bin/salt-minion
  15. root      29243  29239  0 15:54 ?        00:00:00 /usr/bin/python /usr/bin/salt-minion
  16. root      29364  25597  0 15:55 pts/0    00:00:00 grep --color=auto salt-minion
  17. [root@node2 servers]#
  minion:2.2.2.149
  1. [root@node2 servers]# sudo yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
  2. [root@node2 servers]# sudo yum clean expire-cache
  3. [root@node2 ~]# sudo yum install salt-minion -y
  4. [root@node3 ~]# egrep -ivE "^$|^#" /etc/salt/minion
  5. master: 2.2.2.148
  6. id: 2.2.2.150  //随便命名一个id号
  7. [root@node3 ~]# systemctl start salt-minion
  8. [root@node3 ~]# ps -ef| grep salt-minion
  9. root       5492      1  0 15:57 ?        00:00:00 /usr/bin/python /usr/bin/salt-minion
  10. root       5495   5492  1 15:57 ?        00:00:00 /usr/bin/python /usr/bin/salt-minion
  11. root       5503   5495  0 15:57 ?        00:00:00 /usr/bin/python /usr/bin/salt-minion
  12. root       5574   4894  0 15:58 pts/1    00:00:00 grep --color=auto salt-minion
  13. [root@node3 ~]#
  在maser端认证客户端,并测试 :
  1. [root@node2 minion]# salt-key -a 2.2.2.148   //添加id号为2.2.2.148的minion端认证(这里就是本机咯)
  2. The following keys are going to be accepted:
  3. Unaccepted Keys:
  4. 2.2.2.148
  5. Proceed? [n/Y] Y
  6. Key for minion 2.2.2.148 accepted.
  7. [root@node2 minion]# salt-key -a 2.2.2.150 //添加id号为2.2.2.150的minion端认证(这里就是IP为2.2.2.149的minion啦)
  8. The following keys are going to be accepted:
  9. Unaccepted Keys:
  10. 2.2.2.150
  11. Proceed? [n/Y] y
  12. Key for minion 2.2.2.150 accepted.
  13. [root@node2 minion]# salt-key -L
  14. Accepted Keys:
  15. 2.2.2.148
  16. 2.2.2.150
  17. Denied Keys:
  18. node2
  19. Unaccepted Keys:
  20. node2
  21. node3
  22. Rejected Keys:
  23. 测试:
  24. [root@node2 minion]# salt "*" test.ping
  25. 2.2.2.150:
  26.     True
  27. 2.2.2.148:
  28.     True
  29. [root@node2 minion]#
  30. [root@node2 minion]# salt "*" cmd.run 'hostname -i'       //有个空格
  31. 2.2.2.148:
  32.     2.2.2.148
  33. 2.2.2.150:
  34.     2.2.2.149
  35. [root@node2 minion]#
  36. 备注:master认证的key在这里:
  37. [root@node2 minions]# pwd
  38. /etc/salt/pki/master/minions
  39. [root@node2 minions]# ll
  40. 总用量 8
  41. -rw-r--r--. 1 root root 450 4月   6 16:09 2.2.2.148
  42. -rw-r--r--. 1 root root 450 4月   6 16:11 2.2.2.150
  二、 salt 拷贝目录和文件到minion端:
  1. [root@node2 salt]#  egrep -ivE "^$|^#" /etc/salt/master       //注意格式
  2. file_roots:          //顶行写,不能有空格
  3.   base:                //较上一行有2个空格
  4.     - /srv/salt/      //较上一行有2个空格
  5. [root@node2 salt]# pwd
  6. /srv/salt
  7. [root@node2 salt]# tree
  8. .
  9. ├── nginx
  10. │   └── nginx.conf
  11. ├── pack.sls
  12. ├── softwares
  13. │   └── nginx-1.10.2-1.el6.ngx.x86_64.rpm
  14. └── top.sls
  15. 2 directories, 4 files
  16. [root@node2 salt]# salt '2.2.2.150' cp.get_dir salt://softwares/ /data/servers/salt-minion gzip=5     //拷贝目录到minion端,如果对方没有这个目录,它会自动创建这个目录
  17. 2.2.2.150:
  18.     - /data/servers/salt-minion/softwares/nginx-1.10.2-1.el6.ngx.x86_64.rpm
  19. [root@node2 salt]# salt "2.2.2.150" cp.get_file salt://nginx/nginx.conf /tmp/ gzip=5
  20. 2.2.2.150:
  21.     /tmp/nginx.conf
  22. [root@node2 salt]#
  23. 压缩分发:使用gzip的方式进行压缩,数字越大,压缩率就越高,9代表最大的压缩率
  24. 创建目录 makedirs(当分发的位置在目标主机上不存在时,自动创建该目录)
  25. salt 'node2' cp.get_file salt://getfile.txt /tmp/srv/getfile.txt makedirs=True
  1. [root@node2 salt]# salt '2.2.2.150' grains.item os
  2. 2.2.2.150:
  3.     ----------
  4.     os:
  5.         CentOS
  6. [root@node2 salt]# salt '2.2.2.150' grains.item ipv4
  7. 2.2.2.150:
  8.     ----------
  9.     ipv4:
  10.         - 2.2.2.149
  11.         - 127.0.0.1
  写一个状态文件来批量安装多个包 :
  1. [root@node2 salt]# egrep -viE "^$|^#" /etc/salt/master
  2. interface0.0.0.0         //监听地址,默认关闭,所有地址
  3. user: root                   //默认就是它,可不用打开,执行时以root的身份执行
  4. state_top: top.sls        //入口文件,这个是他默认的名字,当然可以改,默认也是关闭的
  5. file_roots:
  6.   base:                           //定义一个基本环境,必须项
  7.     - /srv/salt/               //指定根目录
  8.   prod:                         //定义一个基本环境生产环境,可不要
  9.     - /srv/salt/prod/services
  10.     - /srv/salt/prod/states
  11. [root@node2 salt]# systemctl restart salt-master
  12. [root@node2 salt]# tree -n
  13. .
  14. ├── init
  15. │   └── pkg.sls
  16. ├── pack.sls
  17. ├── prod
  18. │   └── services
  19. ├── states
  20. └── top.sls                       //同上入口文件,在根目录之下
  21. 4 directories, 3 files
  22. [root@node2 salt]# cat top.sls
  23. base:                                 //使用的环境,就是上面的base或prod环境
  24.   '*':                                   //所有的minion端
  25.     - init.pkg                     //使用init目录下的pkg这个状态文件
  26. [root@node2 salt]# cat init/pkg.sls
  27. pkg.init:                           //起一个申明名字,可以随便起,方便知道这是pkg的初始化
  28.   pkg.installed:                   //定义一个pkg的状态模块下的installed方法,不能随意改
  29.     - names:
  30.       - httpd                         //要安装的包
  31.       - nmap
  运行并输出结果:
  1. [root@node2 salt]# salt '*' state.sls init.pkg          //使用默认的state模块下的sls方法    (这个sls方法  就是init目录下的pkg.sls  方法)   
  2. 2.2.2.148:
  3. ----------
  4.           ID: pkg.install
  5.     Function: pkg.installed
  6.         Name: httpd
  7.       Result: True
  8.      Comment: The following packages were installed/updated: httpd
  9.      Started: 19:53:21.227599
  10.     Duration: 53739.382 ms
  11.      Changes:
  12.               ----------
  13.               httpd:
  14.                   ----------
  15.                   new:
  16.                       2.4.6-67.el7.centos.6
  17.                   old:
  18. ----------
  19.           ID: pkg.install
  20.     Function: pkg.installed
  21.         Name: nmap
  22.       Result: True
  23.      Comment: The following packages were installed/updated: nmap
  24.      Started: 19:54:14.999385
  25.     Duration: 6384.902 ms
  26.      Changes:
  27.               ----------
  28.               nmap:
  29.                   ----------
  30.                   new:
  31.                       2:6.40-7.el7
  32.                   old:
  33. Summary for 2.2.2.148
  34. ------------
  35. Succeeded: 2 (changed=2)
  36. Failed:    0
  37. ------------
  38. Total states run:     2
  39. Total run time:  60.124 s
  40. 2.2.2.150:
  41. ----------
  42.           ID: pkg.install
  43.     Function: pkg.installed
  44.         Name: httpd
  45.       Result: True
  46.      Comment: The following packages were installed/updated: httpd
  47.      Started: 19:53:21.224799
  48.     Duration: 56911.686 ms
  49.      Changes:
  50.               ----------
  51.               httpd:
  52.                   ----------
  53.                   new:
  54.                       2.4.6-67.el7.centos.6
  55.                   old:
  56. ----------
  57.           ID: pkg.install
  58.     Function: pkg.installed
  59.         Name: nmap
  60.       Result: True
  61.      Comment: The following packages were installed/updated: nmap
  62.      Started: 19:54:18.173684
  63.     Duration: 10796.209 ms
  64.      Changes:
  65.               ----------
  66.               nmap:
  67.                   ----------
  68.                   new:
  69.                       2:6.40-7.el7
  70.                   old:
  71. Summary for 2.2.2.150
  72. ------------
  73. Succeeded: 2 (changed=2)
  74. Failed:    0
  75. ------------
  76. Total states run:     2
  77. Total run time:  67.708 s

 salt 批量文件管理,以limit.conf 文件为例:

  1. [root@node2 init]# pwd
  2. /srv/salt/init
  3. [root@node2 init]# ll
  4. 总用量 12
  5. -rw-r--r--. 1 root root 2444 4月   6 20:18 limits.conf
  6. -rw-r--r--. 1 root root  163 4月   6 20:15 limit.sls
  7. -rw-r--r--. 1 root root   70 4月   6 19:53 pkg.sls
  8. [root@node2 init]# cat limit.sls
  9. limit-conf-config:
  10.   file.managed:                            //使用file这个模块下的managed这个方法
  11.     - name: /etc/security/limits.conf
  12.     - source: salt://init/limits.conf
  13.     - user: root
  14.     - group: root
  15.     - mode: 644
  16. [root@node2 init]# cat ../top.sls
  17. base:
  18.   '*':
  19.     - init.pkg
  20.     - init.limit
  21. [root@node2 init]# cp -ar /etc/security/limits.conf init/
  22. [root@node2 init]# echo "# this is a test file" >> limits.conf
  1. [root@node2 salt]# salt '*' state.highstate
  2. 2.2.2.148:
  3. ----------
  4.           ID: pkg.install
  5.     Function: pkg.installed
  6.         Name: httpd
  7.       Result: True
  8.      Comment: All specified packages are already installed
  9.      Started: 20:21:05.045215
  10.     Duration: 923.192 ms
  11.      Changes:
  12. ----------
  13.           ID: pkg.install
  14.     Function: pkg.installed
  15.         Name: nmap
  16.       Result: True
  17.      Comment: All specified packages are already installed
  18.      Started: 20:21:05.968777
  19.     Duration: 37.068 ms
  20.      Changes:
  21. ----------
  22.           ID: limit-conf-config
  23.     Function: file.managed
  24.         Name: /etc/security/limits.conf
  25.       Result: True
  26.      Comment: File /etc/security/limits.conf updated
  27.      Started: 20:21:06.009001
  28.     Duration: 50.399 ms
  29.      Changes:
  30.               ----------
  31.               diff:
  32.                   ---
  33.                   +++
  34.                   @@ -59,3 +59,4 @@
  35.                    #@student        -       maxlogins       4
  36.                    # End of file
  37.                   +# this is a test file
  38. Summary for 2.2.2.148
  39. ------------
  40. Succeeded: 3 (changed=1)
  41. Failed:    0
  42. ------------
  43. Total states run:     3
  44. Total run time:   1.011 s
  45. 2.2.2.150:
  46. ----------
  47.           ID: pkg.install
  48.     Function: pkg.installed
  49.         Name: httpd
  50.       Result: True
  51.      Comment: All specified packages are already installed
  52.      Started: 20:21:05.103387
  53.     Duration: 951.714 ms
  54.      Changes:
  55. ----------
  56.           ID: pkg.install
  57.     Function: pkg.installed
  58.         Name: nmap
  59.       Result: True
  60.      Comment: All specified packages are already installed
  61.      Started: 20:21:06.055605
  62.     Duration: 38.643 ms
  63.      Changes:
  64. ----------
  65.           ID: limit-conf-config
  66.     Function: file.managed
  67.         Name: /etc/security/limits.conf
  68.       Result: True
  69.      Comment: File /etc/security/limits.conf updated
  70.      Started: 20:21:06.097338
  71.     Duration: 49.897 ms
  72.      Changes:
  73.               ----------
  74.               diff:
  75.                   ---
  76.                   +++
  77.                   @@ -59,3 +59,4 @@
  78.                    #@student        -       maxlogins       4
  79.                    # End of file
  80.                   +# this is a test file                         //这个是diff与原来位置文件对比, + 表示添加的新内容
  81. Summary for 2.2.2.150
  82. ------------
  83. Succeeded: 3 (changed=1)
  84. Failed:    0
  85. ------------
  86. Total states run:     3
  87. Total run time:   1.040 s
 三、slatstack支持正则表达式:
  1. [root@node2 minions]# salt -E '2.2.2.?' test.ping
  2. 2.2.2.148:
  3.     True
  4. 2.2.2.150:
  5.     True
  6. [root@node2 minions]# salt -E '2.2.2.[148,150]' test.ping
  7. 2.2.2.148:
  8.     True
  9. 2.2.2.150:
  10.     True
  11. [root@node2 init]# salt '*' service.restart httpd
  12. 2.2.2.148:
  13.     True
  14. 2.2.2.150:
  15.     True
  四、文件的远程拷贝:
  1. [root@node2 init]# salt-cp '*' /etc/hosts /tmp/hosts.test
  2. 2.2.2.148:
  3.     ----------
  4.     /tmp/hosts.test:
  5.         True
  6. 2.2.2.150:
  7.     ----------
  8.     /tmp/hosts.test:
  9.         True
  五、slatstack的数据的返回:(MySQL为例)
  1. 官网参考:  http://docs.saltstack.cn/ref/returners/           http://docs.saltstack.cn/ref/returners/all/salt.returners.mysql.html
  2. [root@node2 init]# yum list | grep python| grep MySQL
  3. MySQL-python.x86_64                         1.2.5-1.el7                @base
  4. [root@node2 init]# yum install  -y MySQL-python
  1. 参照官网创建一个库:
  2. CREATE DATABASE `salt`
  3. DEFAULT CHARACTER SET utf8
  4. DEFAULT COLLATE utf8_general_ci;
  5. 创建表一:
  6. DROP TABLE IF EXISTS `jids`;CREATE TABLE `jids` (
  7. `jid` varchar(255) NOT NULL,
  8. `load` mediumtext NOT NULL,
  9. UNIQUE KEY `jid` (`jid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE INDEX jid ON jids(jid) USING BTREE;
  10. 创建表二:
  11. DROP TABLE IF EXISTS `salt_returns`;CREATE TABLE `salt_returns` (
  12. `fun` varchar(50) NOT NULL,
  13. `jid` varchar(255) NOT NULL,
  14. `return` mediumtext NOT NULL,
  15. `id` varchar(255) NOT NULL,
  16. `success` varchar(10) NOT NULL,
  17. `full_ret` mediumtext NOT NULL,
  18. `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  19. KEY `id` (`id`),
  20. KEY `jid` (`jid`),
  21. KEY `fun` (`fun`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  22. 创建表三:
  23. mysql> CREATE TABLE `salt_events` (
  24.     -> `id` BIGINT NOT NULL AUTO_INCREMENT,
  25.     -> `tag` varchar(255) NOT NULL,
  26.     -> `data` mediumtext NOT NULL,
  27.     -> `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  28.     -> `master_id` varchar(255) NOT NULL,
  29.     -> PRIMARY KEY (`id`),
  30.     -> KEY `tag` (`tag`)
  31.     -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  32. Query OK, 0 rows affected (0.01 sec)
  33. mysql> show tables;                                                                                                                            +----------------+
  34. | Tables_in_salt |
  35. +----------------+
  36. | jids           |
  37. | salt_events    |
  38. | salt_returns   |
  39. +----------------+
  40. 3 rows in set (0.00 sec)
  41. mysql> grant all on salt.* to 'salt'@'%' identified by 'Salt@2017';
  42. Query OK, 0 rows affected, 1 warning (0.00 sec)
  43. mysql> flush privileges;
  44. Query OK, 0 rows affected (0.01 sec)
  45. [root@node2 ~]# vim /etc/salt/master
  46. mysql.host: '2.2.2.148'
  47. mysql.user: 'salt'
  48. mysql.pass: 'Salt@2017'
  49. mysql.db: 'salt'
  50. mysql.port: 3306
  51. alternative.mysql.host: '2.2.2.148'
  52. alternative.mysql.user: 'salt'
  53. alternative.mysql.pass: 'Salt@2017'
  54. alternative.mysql.db: 'salt'
  55. alternative.mysql.port: 3306
  56. 所有的客户端minion都要加,然后重启:
  57. [root@node3 minion]# vim /etc/salt/minion
  58. mysql.host: '2.2.2.148'
  59. mysql.user: 'salt'
  60. mysql.pass: 'Salt@2017'
  61. mysql.db: 'salt'
  62. mysql.port: 3306
  63. alternative.mysql.host: '2.2.2.148'
  64. alternative.mysql.user: 'salt'
  65. alternative.mysql.pass: 'Salt@2017'
  66. alternative.mysql.db: 'salt'
  67. alternative.mysql.port: 3306
  68. [root@node2 ~]# systemctl restart salt-master.service
  69. [root@node2 minion]# systemctl restart salt-minion.service
  70. [root@node3 minion]# systemctl restart salt-minion.service
  71. 在master端:
  72. [root@node2 ~]# salt '*' test.ping --return mysql
  73. 2.2.2.150:
  74.     True
  75. 2.2.2.148:
  76.     True
  77. 然后进入mysql查看是否有数据:
  78. mysql> select * from salt_returns;
  79. +-----------+----------------------+--------+-----------+---------+---------------------------------------------------------------------------------------------------------------------------------------+---------------------+
  80. | fun       | jid                  | return | id        | success | full_ret                                                                                                                              | alter_time          |
  81. +-----------+----------------------+--------+-----------+---------+---------------------------------------------------------------------------------------------------------------------------------------+---------------------+
  82. | test.ping | 20180406223601257092 | true   | 2.2.2.148 | 1       | {"fun_args": [], "jid": "20180406223601257092", "return": true, "retcode": 0, "success": true, "fun": "test.ping", "id": "2.2.2.148"} | 2018-04-06 22:36:01 |
  83. | test.ping | 20180406223601257092 | true   | 2.2.2.150 | 1       | {"fun_args": [], "jid": "20180406223601257092", "return": true, "retcode": 0, "success": true, "fun": "test.ping", "id": "2.2.2.150"} | 2018-04-06 22:36:01 |
  84. +-----------+----------------------+--------+-----------+---------+---------------------------------------------------------------------------------------------------------------------------------------+---------------------+
  85. 2 rows in set (0.00 sec)
  86. mysql> select * from salt_events;
  87. Empty set (0.00 sec)
  88. mysql> select * from salt_events;
  89. Empty set (0.00 sec)
  在master端执行查询数据然后查看数据库:
  1. [root@node2 ~]# salt '*' cmd.run 'df -h' --return mysql
  2. 2.2.2.150:
  3.     Filesystem           Size  Used Avail Use% Mounted on
  4.     /dev/mapper/cl-root   17G  3.1G   14G  19% /
  5.     devtmpfs             901M     0  901M   0% /dev
  6.     tmpfs                912M   12K  912M   1% /dev/shm
  7.     tmpfs                912M  8.7M  904M   1% /run
  8.     tmpfs                912M     0  912M   0% /sys/fs/cgroup
  9.     /dev/sda1           1014M  139M  876M  14% /boot
  10.     tmpfs                183M     0  183M   0% /run/user/0
  11. 2.2.2.148:
  12.     Filesystem           Size  Used Avail Use% Mounted on
  13.     /dev/mapper/cl-root   17G  3.4G   14G  20% /
  14.     devtmpfs             901M     0  901M   0% /dev
  15.     tmpfs                912M   28K  912M   1% /dev/shm
  16.     tmpfs                912M  8.7M  904M   1% /run
  17.     tmpfs                912M     0  912M   0% /sys/fs/cgroup
  18.     /dev/sda1           1014M  139M  876M  14% /boot
  19.     tmpfs                183M     0  183M   0% /run/user/0
  20. [root@node2 ~]# salt '*' cmd.run 'uptime' --return mysql
  21. 2.2.2.150:
  22.      22:41:32 up 17:52,  2 users,  load average: 0.020.030.05
  23. 2.2.2.148:
  24.      22:41:32 up 1 day,  7:34,  3 users,  load average: 0.020.070.11
  25. [root@node2 ~]#
  1. mysql.host: '2.2.2.148'
  2. mysql.user: 'salt'
  3. mysql.pass: 'Salt@2017'
  4. mysql.db: 'salt'
  5. mysql.port: 3306
  6. alternative.mysql.host: '2.2.2.148'
  7. alternative.mysql.user: 'salt'
  8. alternative.mysql.pass: 'Salt@2017'
  9. alternative.mysql.db: 'salt'
  10. alternative.mysql.port: 3306
  11. master_job_cache: mysql
  12. 然后重启salt-master
  13. [root@node2 ~]# salt '*' cmd.run 'free -m'        //此时并没有加  --return mysql   数据依然能写进mysql中,这是因为加了这个选项之后,由master直接写到mysql中,不走minion端了
  14. 2.2.2.148:
  15.                   total        used        free      shared  buff/cache   available
  16.     Mem:           1823         798         231           8         794         783
  17.     Swap:          2047           0        2047
  18. 2.2.2.150:
  19.                   total        used        free      shared  buff/cache   available
  20.     Mem:           1823         505         351           8         966        1090
  21.     Swap:          2047           0        2047
  22. [root@node2 ~]#
  六、slatstack的Grains组件:(收集的静态数据,做主机的资产管理较好)
区别:
slatstack的pillar组件存储于master端,是动态的数据,一般用saltutil.refresh_pillar 刷新,而Grains组件存储于minion端,是静态数据,一般用saltutil.sync_grains 来刷新。
 只有每一次minion在重启时候才会刷新数据,也可以手动刷新数据
  1. [root@node2 ~]# salt "2.2.2.148" grains.items |more
  2. 2.2.2.148:
  3.     ----------
  4.     SSDs:
  5.     biosreleasedate:
  6.         07/02/2015
  7.     biosversion:
  8.         6.00
  9.     cpu_flags:
  10.         - fpu
  11.         - vme
  12.         - de
  13. ...........    采集的数据太多了
  14. [root@node2 ~]# salt -G  'os:CentOS' test.ping       //只ping  minon是OS的,智能匹配
  15. 2.2.2.150:
  16.     True
  17. 2.2.2.148:
  18.     True
  19. [root@node2 ~]# salt -G  'fqdn:node3' grains.get fqdn
  20. 2.2.2.150:
  21.     node3
  在minion端自定义grains:
  1. 现在我在2.2.2.148的minion端自定义一个grains:
  2. [root@node2 ~]# vim /etc/salt/minion    新增一句;     :后面有一个空格
  3. ......
  4. grains:
  5.   roles: httpd
  6.   env: prod
  7. [root@node3 ~]# vim /etc/salt/minion    新增一句;
  8. ......
  9. grains:
  10.   roles: nginx
  11.   env: prod
  12. [root@node2 ~]# systemctl restart salt-minion.service
  13. [root@node3 ~]# systemctl restart salt-minion.service
  14. 测试匹配结果:
  15. [root@node2 ~]# salt -G 'env:prod' test.ping       //因为2个都加了env:prod
  16. 2.2.2.150:
  17.     True
  18. 2.2.2.148:
  19.     True
  20. [root@node2 ~]# salt -G 'roles:httpd' test.ping
  21. 2.2.2.148:
  22.     True
  23. [root@node2 ~]# salt -G 'roles:nginx' test.ping     //只有node3加了roles:nginx,所以匹配到了
  24. 2.2.2.150:
  25.     True
  26. [root@node2 ~]#
  27. [root@node2 ~]# echo "app: umeheal" >/etc/salt/minion    //自定义的grains不不一定要写到minion的配置文件里,可以新建一个专门的grains文件
  28. [root@node2 ~]# salt '*' saltutil.sync_grains                 //强制刷新minion的grains,不用再重启minion端了
  29. 2.2.2.148:
  30. 2.2.2.150:
  31. [root@node2 ~]# salt -G 'app:umeheal' test.ping
  32. 2.2.2.148:
  33.     True
  34. [root@node2 ~]#
  35. [root@node2 salt]# cat top.sls
  36. base:
  37.   '*':
  38.     - init.pkg
  39.     - init.limit
  40.   'roles: nginx':
  41.     - match: grain                         //这一行指定支持正则匹配,没有s
  42.     -init.pkg
  七、批量安装zabbix_agent  :
  1. [root@node2 salt]# pwd
  2. /srv/salt
  3. [root@node2 salt]# cat top.sls
  4. base:
  5.   '*':
  6.     - init.zabbix_agent
  7. #    - init.limit
  8. #  'roles: nginx':
  9. #    - match: grain
  10. #    -init.pkg
  11. [root@node2 salt]# cat init/zabbix_agent.sls           //安装zabbix_agent、修改配置文件、起服务
  12. zabbix_agent:                      //这是一个id声明,在这个文件中可以写多个这样的,但是每一个名称不能一样
  13.   pkg.installed:
  14.     - name: zabbix22-agent
  15.   file.managed:
  16.     - name: /etc/zabbix_agentd.conf
  17.     - source: salt://init/files/zabbix_agentd.conf
  18.     - user: root
  19.     - group: root
  20.     - mode: 644
  21.   service.running:              //装完启动服务
  22.     - name: zabbix-agent
  23.     - enable: True       //开机自启
  24.     - reload: True        //服务的重载,要先验证一下是否支持reload这个选项,zabbix 是不支持的
  25.       - watch:
  26.         - file: zabbix_agent
  27. [root@node2 salt]# salt '*' state.highstate test=True    //test=True 是模拟测试输出结果,其实什么也没执行
  28. [root@node2 salt]# salt '*' state.highstate    //这才是真正的在执行命令
  29. 2.2.2.148:
  30. ----------
  31.           ID: zabbix_agent
  32.     Function: pkg.installed
  33.         Name: zabbix22-agent
  34.       Result: True
  35.      Comment: All specified packages are already installed
  36.      Started: 14:35:47.658907
  37.     Duration: 979.437 ms
  38.      Changes:
  39. ----------
  40.           ID: zabbix_agent
  41.     Function: file.managed
  42.         Name: /etc/zabbix_agentd.conf
  43.       Result: True
  44.      Comment: File /etc/zabbix_agentd.conf updated
  45.      Started: 14:35:48.641542
  46.     Duration: 42.656 ms
  47.      Changes:
  48.               ----------
  49.               diff:
  50.                   ---
  51.                   +++
  52.                   @@ -282,3 +282,4 @@
  53.                    # Mandatory: no
  54.                    # Default:
  55.                    # LoadModule=
  56.                   +# /srv/salt/init/files/zabbix_agentd.conf   自动化安装zabbix_agentd           //我现在的一行,+ 显示了
  57. ----------
  58.           ID: zabbix_agent
  59.     Function: service.running
  60.         Name: zabbix-agent
  61.       Result: True
  62.      Comment: Service zabbix-agent has been enabled, and is running
  63.      Started: 14:35:48.685568
  64.     Duration: 323.461 ms
  65.      Changes:
  66.               ----------
  67.               zabbix-agent:
  68.                   True
  69. Summary for 2.2.2.148
  70. ------------
  71. Succeeded: 3 (changed=2)
  72. Failed:    0
  73. ------------
  74. Total states run:     3
  75. Total run time:   1.346 s
  76. 2.2.2.150:
  77. ----------
  78.           ID: zabbix_agent
  79.     Function: pkg.installed
  80.         Name: zabbix22-agent
  81.       Result: True
  82.      Comment: The following packages were installed/updated: zabbix22-agent
  83.      Started: 14:35:47.640324
  84.     Duration: 78598.509 ms
  85.      Changes:
  86.               ----------
  87.               zabbix22:
  88.                   ----------
  89.                   new:
  90.                       2.2.21-1.el6
  91.                   old:
  92.               zabbix22-agent:
  93.                   ----------
  94.                   new:
  95.                       2.2.21-1.el6
  96.                   old:
  97. ----------
  98.           ID: zabbix_agent
  99.     Function: file.managed
  100.         Name: /etc/zabbix_agentd.conf
  101.       Result: True
  102.      Comment: File /etc/zabbix_agentd.conf updated
  103.      Started: 14:37:06.247344
  104.     Duration: 74.668 ms
  105.      Changes:
  106.               ----------
  107.               diff:
  108.                   ---
  109.                   +++
  110.                   @@ -282,3 +282,4 @@
  111.                    # Mandatory: no
  112.                    # Default:
  113.                    # LoadModule=
  114.                   +# /srv/salt/init/files/zabbix_agentd.conf   自动化安装zabbix_agentd
  115. ----------
  116.           ID: zabbix_agent
  117.     Function: service.running
  118.         Name: zabbix-agent
  119.       Result: True
  120.      Comment: Service zabbix-agent has been enabled, and is running
  121.      Started: 14:37:07.249783
  122.     Duration: 273.51 ms
  123.      Changes:
  124.               ----------
  125.               zabbix-agent:
  126.                   True
  127. Summary for 2.2.2.150
  128. ------------
  129. Succeeded: 3 (changed=3)
  130. Failed:    0
  131. ------------
  132. Total states run:     3
  133. Total run time:  78.947 s
  利用pillar自定义zabbix_agent的Server: IP
  1. 1、在vim /etc/salt/master 开启
  2. pillar_roots:
  3.   base:
  4.     - /srv/salt/pillar
  5. [root@node2 pillar]# mkdir -pv /srv/salt/pillar/init
  6. [root@node2 pillar]# systemctl restart  salt-master.service
  7. [root@node2 pillar]# grep "Server=" /srv/salt/init/files/zabbix_agentd.conf
  8. # Server=
  9. Server={{ Zabbix_Server }}                     //定义一个模板,Zabbix_Server为自定义的key名,本来是127.0.0.1
  10. [root@node2 pillar]#
  11. [root@node2 pillar]# pwd
  12. /srv/salt/pillar
  13. [root@node2 pillar]# tree
  14. .
  15. ├── init
  16. │   └── zabbix_agent.sls
  17. └── top.sls                            //pillar的入口文件
  18. 1 directory, 2 files
  19. [root@node2 pillar]# cat top.sls
  20. base:
  21.   '*':
  22.     - init.zabbix_agent                      //使用init目录下的zabbix_agent文件(或方法)
  23. [root@node2 pillar]# cat init/zabbix_agent.sls
  24. zabbix-agent:
  25.   Zabbix_Server: 2.2.2.100
  26. [root@node2 pillar]#  修改状态文件,让其使用我们定义的模板
  27. [root@node2 pillar]# vim /srv/salt/init/zabbix_agent.sls                 //这个是状态文件,刚才是使用pillar组件的文件,注意路径
  28. zabbix_agent:
  29.   pkg.installed:
  30.     - name: zabbix22-agent
  31.   file.managed:
  32.     - name: /etc/zabbix_agentd.conf
  33.     - source: salt://init/files/zabbix_agentd.conf                   //准备好的模板文件
  34.     - user: root
  35.     - group: root
  36.     - mode: 644
  37.     - template: jinja                    //使用叫jinja的模板
  38.     - defaults:
  39.       Zabbix_Server: {{ pillar['zabbix-agent']['Zabbix_Server'] }}          //这是我们刚才定义的key,就是cat init/zabbix_agent.sls的内容,要对应
  40.   service.running:
  41.     - name: zabbix-agent
  42.     - enable: True
  43.     - reload: True
  44.     - watch:
  45.       - file: zabbix_agent
  46. 启动:
  47. [root@node2 pillar]# salt '*' state.highstate
  48.            ......................
  49.   diff:
  50.                   ---
  51.                   +++
  52.                   @@ -78,7 +78,7 @@
  53.                    # Default:
  54.                    # Server=
  55.                   -Server=127.0.0.1
  56.                   +Server=2.2.2.100                                //他把原来文件中的127.0.0.1修改成我们定义的2.2.2.100 了
  57.                    ### Option: ListenPort
  58.                    #    Agent will listen on this port for connections from the server.
  59. ..........................
  60. ----------
  61. 再去客户端node3验证一下:
  62. [root@node3 ~]# grep "Server=" /etc/zabbix_agentd.conf
  63. # Server=
  64. Server=2.2.2.100
  65. [root@node3 ~]# OK ~~~~~~~~~~~~~~~~~~~
Saltstack-实战-自动化运维工具
八、salt-ssh的使用:  没有使用zeroMQ协议,走ssh协议 :
  1. [root@node2 salt]# yum install salt-ssh -y
  2. [root@node2 salt]# egrep -v "^$|^#" /etc/salt/roster
  3. 2.2.2.150:                     //minion的id
  4.   host: 2.2.2.149
  5.   user: root
  6.   passwd: 111111
  7. [root@node2 salt]#
  8. [root@node2 salt]# salt-ssh '*' test.ping
  9. 2.2.2.150:
  10.     True
  11. [root@node2 salt]#使用这个方法,不能再master的配置文件中加这一项  master_job_cache: mysql  不然报错
  12. 我们把客户端的minion服务停了,master端依然能通过salt-ssh连上客户端:
  13. [root@node3 ~]# systemctl stop salt-minion.service
  14. [root@node3 ~]# ps -ef| grep salt-minion
  15. root      12119   9596  0 16:49 pts/0    00:00:00 grep --color=auto salt-minion
  16. [root@node3 ~]#
  17. 在master端测试:
  18. [root@node2 salt]# salt-ssh '*' test.ping
  19. 2.2.2.150:
  20.     True
  21. [root@node2 salt]# salt-ssh '*' cmd.run 'df -h'
  22. 2.2.2.150:
  23.     Filesystem           Size  Used Avail Use% Mounted on
  24.     /dev/mapper/cl-root   17G  3.1G   14G  19% /
  25.     devtmpfs             901M     0  901M   0% /dev
  26.     tmpfs                912M     0  912M   0% /dev/shm
  27.     tmpfs                912M  8.7M  904M   1% /run
  28.     tmpfs                912M     0  912M   0% /sys/fs/cgroup
  29.     /dev/sda1           1014M  139M  876M  14% /boot
  30.     tmpfs                183M     0  183M   0% /run/user/0
  31. [root@node2 salt]#    就算minion停了依然能控制minion端,这是走的salt-ssh,但是速度较慢啊
  32. salt-ssh指定密钥认证:
  33. 我这里没有添加密码:
  34.     tmpfs                183M     0  183M   0% /run/user/0
  35. [root@node2 salt]# egrep -v "^$|^#" /etc/salt/roster
  36. 2.2.2.150:
  37.   host: 2.2.2.149
  38. [root@node2 salt]#
  39. [root@node2 salt]#  ssh-copy-id -i /etc/salt/pki/master/ssh/salt-ssh.rsa.pub root@2.2.2.149
  40. [root@node2 salt]# salt-ssh '*' cmd.run 'free -m'
  41. 2.2.2.150:
  42.                   total        used        free      shared  buff/cache   available
  43.     Mem:           1823         480         325           8        1017        1107
  44.     Swap:          2047
Saltstack-实战-自动化运维工具
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 微信打赏一下咯
  • 一分钱也是爱
  • weinxin
广告也精彩
暖先生
ELK全套视频
Edifier/漫步者 W830BT 无线蓝牙耳机
DJI大疆 御 Mavic Air 便携可折叠4K无人机 高清航拍
Beats Solo3 Wireless 头戴式耳机无线蓝牙b魔音霹雳红苹果耳麦潮

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:1   其中:访客  1   博主  0

    • yunan 来自天朝的朋友 搜狗浏览器 Windows 7 广东省深圳市 电信 0

      好文章 好好