saltstack的使用(二)
master与salt之间的通信模式
saltstack的工作原理
一、如何使用saltstack?
- 我们首先打开master的配置文件
[root@salt-master ~]# vim /etc/salt/master
(省略若干…………)
416 file_roots:
417 base:
418 – /srv/salt
可以知道/srv/salt就是配置文件放置的位置
2.这个目录是不存在的,需要创建,进入,然后写一个sls模块,可以理解为:
比如说我是神笔马良,我要画一个东西,那么总该有个位置让我来画吧,写状态配置,现在我要写一个配置,意思就是安装一个Apache,然后把这个服务启动起来,固定写法就是.sls
(注意空格,写完以后进行检查,方法就是:set list à显示所有字符)
[root@salt-master ~]# mkdir /srv/salt
[root@salt-master ~]# vim /srv/salt/apache.sls
apache-install:$ ß$表示空格,是我使用命令:set:list以后出现的
pkg.installed:$
– names:$
– httpd$
– httpd-devel$
$
apache-services:$
service.running:$
– name:httpd
– enable: True$
– reload: True$
上面的意思就是:
实现2个功能,安装和启动
其中:
pkg.installed 中pkg是模块 installed是方法 names 安装2个包,会使用yum安装上
apache-services 是一个名称 service.running中service是一个模块,running是方法,name(注意没有s)名称,必须指定,不然minion找不到就会报错,因为它不知道需要启动谁,最后2个就是开机自启动和可以重载。
我们来实战演示一遍
master端执行命令:
[root@salt-master salt]# salt ‘*’ state.sls apache
解析这条语句的意思:
salt: 命令
‘*’: 所有minion
state.sls: 模块有个sls的方法
apache: 附件的一个参数
在执行上面命令以后,我们可以在另外一台机器上面进行查看,究竟它做了一些什么
minion端:
# ps aux |grep yum
root 16332 0.7 0.3 265904 63960 ? S 09:59 0:01 /usr/bin/python /usr/bin/yum -y install httpd-devel ß正在yum安装Apache服务
root 16959 0.0 0.0 103248 864 pts/1 S+ 10:04 0:00 grep yum
我们可以看看返回结果:
salt-master: ß这个是因为我在master端也安装了一个minion,意思就是说这个主机也归master管理
———-
ID: apache-install ßID名称
Function: pkg.installed ß模块+方法
Name: httpd ß名称
Result: True ß返回结果,成功
Comment: Package httpd is already installed.
Started: 10:12:34.672798
Duration: 868.51 ms
Changes:
执行成功以后,我们去minion端去查看这个是否把服务启动起来
[root@salt-minion ~]# lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 16969 root 4u IPv6 3912882 0t0 TCP *:http (LISTEN)
httpd 16973 apache 4u IPv6 3912882 0t0 TCP *:http (LISTEN)
httpd 16974 apache 4u IPv6 3912882 0t0 TCP *:http (LISTEN)
httpd 16975 apache 4u IPv6 3912882 0t0 TCP *:http (LISTEN)
httpd 16976 apache 4u IPv6 3912882 0t0 TCP *:http (LISTEN)
httpd 16977 apache 4u IPv6 3912882 0t0 TCP *:http (LISTEN)
httpd 16978 apache 4u IPv6 3912882 0t0 TCP *:http (LISTEN)
httpd 16979 apache 4u IPv6 3912882 0t0 TCP *:http (LISTEN)
httpd 16980 apache 4u IPv6 3912882 0t0 TCP *:http (LISTEN)
我们测试一下刚才那个state能不能重复使用,我手动把服务停,然后再执行哪条语句
[root@salt-minion ~]# /etc/init.d/httpd stop
Stopping httpd: [ OK ]
[root@salt-minion ~]# lsof -i:80
在master执行语句
[root@salt-master salt]# salt ‘*’ state.sls apache
然后在查看服务
[root@salt-minion ~]# lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 17098 root 4u IPv6 3916533 0t0 TCP *:http (LISTEN)
httpd 17101 apache 4u IPv6 3916533 0t0 TCP *:http (LISTEN)
httpd 17102 apache 4u IPv6 3916533 0t0 TCP *:http (LISTEN)
httpd 17103 apache 4u IPv6 3916533 0t0 TCP *:http (LISTEN)
httpd 17104 apache 4u IPv6 3916533 0t0 TCP *:http (LISTEN)
httpd 17105 apache 4u IPv6 3916533 0t0 TCP *:http (LISTEN)
httpd 17106 apache 4u IPv6 3916533 0t0 TCP *:http (LISTEN)
httpd 17107 apache 4u IPv6 3916533 0t0 TCP *:http (LISTEN)
httpd 17108 apache 4u IPv6 3916533 0t0 TCP *:http (LISTEN)
那么有个问题:
如果我一台机器有多个状态呢,这个时候我们就要使用高级状态了。
需要去写一个topfile,默认情况下,我们使用高级状态会有一个入口文件,这个入口文件里,我可以写清楚,这台机器是什么状态,那台机器是什么状态,那么我执行语句的时候就直接来入口文件读取就行了,这样呢我就你不用配置了。
默认情况下叫做top.sls 默认必须放在base环境下,目录在/srv/salt下
[root@salt-master salt]# pwd
/srv/salt
[root@salt-master salt]# cat top.sls
base:
‘*’:
– apache
解释一下上面语句的意思:
所有的机器都要执行Apache这个状态模块
[root@salt-master salt]# salt ‘*’ state.highstate
需要注意的是:如果minion端事先已经安装了服务,那么它不会重复安装
它的执行过程就是:先从入口文件开始读,即topfile开始读,它要你干嘛你就去干嘛
至此,我们上面就演示了2个内容,一是远程执行,二是状态管理
二、什么是base环境?
base环境就是基础环境,所有机器都要执行的状态才会写到base环境里:
比如说我所有机器都要初始化,都要安装zabbix-agent,所有机器都需要调整内核参数,所有机器都要安装epel包,这些都是要放在base环境里面的。
三、grains和pillar
接下来我们要了解的就是saltstack的数据系统:grains和pillar
grains:
谷物的意思,它是一个组件,存放在minion端,用于minion启动的时候收集系统信息,只有在minion启动的时候才会进行收集,然后就不会变化,只有再次重启,才会再次进行收集,如果更改了一些信息,那么必须重启才会去收集。
用于信息的查询:比如说我所有机器的base环境
[root@salt-master salt]# salt ‘*’ grains.ls ß把所有的grains的名称列出来
salt-master:
– SSDs
– cpu_flags
– cpu_model
[root@salt-master salt]# salt ‘*’ grains.items ß把所有grains的内容显示出来
下面贴2个取值的效果对比
[root@salt-master salt]# salt ‘*’ grains.item fqdn
salt-master:
———-
fqdn:
salt-master
salt-minion:
———-
fqdn:
salt-minion
[root@salt-master salt]# salt ‘*’ grains.get fqdn
salt-master:
salt-master
salt-minion:
salt-minion
比如说,我现在想去查看我所有机器的IP
[root@salt-master salt]# salt ‘*’ grains.get ip_interfaces
salt-master:
———-
eth1:
– 10.10.20.138
– fe80::250:56ff:fe95:30a3
lo:
– 127.0.0.1
– ::1
salt-minion:
———-
eth0:
– 10.10.20.135
– fe80::250:56ff:fe95:5a05
lo:
– 127.0.0.1
– ::1
[root@salt-master salt]# salt ‘*’ grains.get ip_interfaces:eth0
salt-master:
salt-minion:
– 10.10.20.135
– fe80::250:56ff:fe95:5a05
第二个场景:可以用来匹配minion
比如说我们环境很复杂,有centos也有debain,但是呢我只想在centOS上面执行命令,那么就可以使用grains的os的值来区别是不是centos
这里需要加一个参数 – G
[root@salt-master salt]# salt -G os:centos cmd.run ‘w’
salt-master:
11:25:32 up 36 days, 17:02, 2 users, load average: 0.08, 0.02, 0.01
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
admin pts/0 192.168.2.72 09:27 1.00s 1.12s 0.03s sshd: admin [pr
admin pts/1 192.168.2.72 09:59 1:11m 0.08s 0.03s sshd: admin [pr
salt-minion:
11:25:32 up 35 days, 56 min, 1 user, load average: 0.10, 0.03, 0.01
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
xiedi pts/3 192.168.2.72 09:27 19:54 0.16s 0.07s sshd: xiedi [pr
同时,我们还可以自定义grains。这个需要修改配置文件来进行定义
[root@salt-minion ~]# vim /etc/salt/minion
83 grains:
84 roles:
85 – webserver
86 – memcache
重启生效
[root@salt-minion ~]# /etc/init.d/salt-minion restart
验证
[root@salt-master salt]# salt -G ‘roles:memcache’ cmd.run ‘echo hahah’
salt-minion:
hahah
同样我们可以写一个memcache.sls来安装它
这个是在配置文件里面进行的修改,如果你觉得不方便,那么也可以在建立一个/etc/salt/grains,它默认会在这个里面去读取
[root@salt-minion ~]# cat /etc/salt/grains
web: nginx
[root@salt-minion ~]# /etc/init.d/salt-minion restart ß记住一定要重启minion服务
Stopping salt-minion daemon: [ OK ]
Starting salt-minion daemon: [ OK ]
[root@salt-master salt]# salt -G web:nginx cmd.run ‘w’ ß这个错误是因为我们有重启minion服务
No minions matched the target. No command was sent, no jid was assigned.
ERROR: No return received
[root@salt-master salt]# salt -G web:nginx cmd.run ‘w’
salt-minion:
11:35:04 up 35 days, 1:05, 1 user, load average: 0.10, 0.04, 0.01 ß重启以后正常
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
xiedi pts/3 192.168.2.72 09:27 10.00s 0.20s 0.07s sshd: xiedi [pr
ß需要注意的地方就是:因为我在配置文件定义了roles,那么在文件 /etc/salt/grains里面的定义名称就不能相同
grains的用法
- 收集系统底层信息
- 远程执行匹配minion
- 在top file里面来匹配minion,匹配哪些机器需要执行什么状态
举例:
[root@salt-master salt]# cp /srv/salt/top.sls{,.ori}
[root@salt-master salt]# cat /srv/salt/top.sls
base:
‘web:nginx’:
– match: grain
– apache
ß意思就是我用grains来进行匹配,告诉它,所有的grain web的值是nginx的执行apache这个状态
[root@salt-master salt]# salt ‘*’ state.highstate ß执行命令
扩展:
可以基于grains写一个cmdb,用于收集信息,然后入库。
pillar:
pillar是一个字典,可以用Python来进行定制,它也是 一个key-value
用途:
1、 敏感数据,设密码
2、 处理变量,差异性
实战:
第一步:如何定义pillar的数据
打开master的配置文件,设置一个入口
[root@salt-master salt]# vim /etc/salt/master
529 pillar_roots:
530 base:
531 – /srv/pillar
pillar也有top file ,它可以指定哪个minion能看到哪个,必须要放在base环境下
第二步:我们创建它,然后写一个jinjia模板
[root@salt-master salt]# mkdir /srv/pillar
[root@salt-master salt]# cat /srv/pillar/apache.sls
{% if grains[‘os’] == ‘CentOS’ %}
apache: httpd
{% elif grains[‘os’] == ‘Debian’ %}
apache: apache2
{% endif %}
pillar是可以引用grains的,上面的意思就是:
如果机器是centOS,那么看到的Apache名称就叫做httpd
如果机器是Debian,那么看到的Apache名称就叫做Apache2
然后,我们写一个top.sls来执行哪个minion可以看到apache.sls
例如:我只希望salt-minion看到apache.sls
[[root@salt-master salt]# cat /srv/pillar/top.sls
base:
‘salt-minion’:
– apache
意思就是,只让salt-minion这个机器看这个模块
验证
[root@salt-master salt]# salt ‘*’ pillar.items
salt-minion:
———-
apache:
httpd
salt-master:
———-
例如:我希望所有的机器都能看到apache.sls
[root@salt-master salt]# cat /srv/pillar/top.sls
base:
‘*’:
– apache
[root@salt-master salt]# salt ‘*’ pillar.items
salt-master:
———-
apache:
httpd
salt-minion:
———-
apache:
httpd
pillar主要是用在配置管理,我们可以用pillar来定义一些参数,来定位具体的主机
刷新以后再执行命令
[root@salt-master salt]# salt ‘*’ saltutil.refresh_pillar
salt-master:
True
salt-minion:
True
[root@salt-master salt]# salt -I ‘apache:httpd’ test.ping
salt-master:
True
salt-minion:
True
四、grain与pillar的区别
名称 | 存储位置 | 数据类型 | 数据采集更新方式 | 应用 |
grains | minion端 | 静态数据 | minion启动时收集,也可以使用saltutil.sync_grains进行刷新 | 存储minion基本数据。比如用于匹配minion,自身数据可以用来做资产管理等。 |
pillar | master端 | 动态数据 | 在master端定义,指定给对应的minion。可以使用saltutil.refresh_pillar刷新 | 存储master指定的数据,只有指定的minion可以看到。用于敏感数据保存。 |
五、远程执行
举个例子:
[root@salt-master salt]# salt ‘*’ cmd.run ‘w’
salt-master:
13:45:23 up 36 days, 19:22, 2 users, load average: 0.01, 0.01, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
admin pts/0 192.168.2.72 09:27 1.00s 1.35s 0.03s sshd: admin [pr
admin pts/1 192.168.2.72 09:59 3:31m 0.08s 0.03s sshd: admin [pr
salt-minion:
13:45:23 up 35 days, 3:16, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
xiedi pts/3 192.168.2.72 09:27 1:38m 0.22s 0.07s sshd: xiedi [pr
命令解释:
salt : 命令
‘*’: 指定目标
cmd.run: 模块+方法
‘w’: 参数
这些结果我们可以放到数据库或者memcache里面
通过上面的例子,可以总结为:目标、模块、返回。
目标
官网: https://docs.saltstack.com/en/latest/#salt-in-depth
- 基于minion 的ID来进行匹配
https://docs.saltstack.com/en/latest/topics/targeting/globbing.html#targeting-glob
[root@salt-master salt]# salt ‘salt-minion’ cmd.run ‘w’
salt-minion:
13:56:36 up 35 days, 3:27, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
xiedi pts/3 192.168.2.72 09:27 1:49m 0.22s 0.07s sshd: xiedi [pr
- IP匹配
[root@salt-master salt]# salt -S ‘10.10.20.135’ test.ping
salt-minion:
True
- 混合使用
匹配目标,选几个常用的即可,可以直接下载官方文档PDF,需要使用的时候查看即可。
模块
service模块
https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.service.html#module-salt.modules.service
1、查看服务是否运行
[root@salt-master salt]# salt ‘*’ service.available sshd
salt-master:
True
salt-minion:
True
2、返回所有活动的TCP链接
[root@salt-master salt]# salt ‘*’ network.active_tcp
模块的访问控制ACL
生产中使用时,salt针对用户和模块支持访问控制,需要在master里面进行配置
[root@salt-master salt]# vim /etc/salt/master
245 #client_acl:
246 # larry:
247 # – test.ping
248 # – network.*
修改为
245 client_acl:
246 xiedi:
247 – test.ping
248 – network.*
重启master让其生效
[root@salt-master salt]# /etc/init.d/salt-master restart ß重启以后等一会在执行命令
创建用户xiedi 给密码123456 给权限
[root@salt-master salt]# chmod 755 /var/cache/salt/ /var/cache/salt/master/ /var/cache/salt/master/jobs/ /var/run/salt /var/run/salt/master/ ß给用户权限
#chmod 777 /var/log/salt/master
[root@salt-master ~]# su – xiedi
[xiedi@salt-master ~]$ salt ‘*’ test.ping
salt-master:
True
salt-minion:
True
[xiedi@salt-master ~]$ salt ‘*’ cmd.run ‘echo haha’ ß权限限制了
Failed to authenticate! This is most likely because this user is not permitted to execute commands, but there is a small possibility that a disk error occurred (check disk/inode usage).
基于minion来加模块
比如:我只希望这个用户只能在salt-minion上面执行命令test.ping
第一步:修改master配置
[root@salt-master ~]# vim /etc/salt/master
249 user01:
250 – salt-minion:
251 – test.ping
第二步:重启并验证
[root@salt-master ~]# su – user01
[user01@salt-master ~]$ salt ‘salt-minion’ test.ping
salt-minion:
True
[user01@salt-master ~]$ salt ‘salt-minion’ cmd.run ‘w’ ß尝试使用别的命令,提示执行不了
Failed to authenticate! This is most likely because this user is not permitted to execute commands, but there is a small possibility that a disk error occurred (check disk/inode usage).
设置黑名单
修改master的配置文件
[root@salt-master ~]# vim /etc/salt/master
259 #client_acl_blacklist:
260 # users:
261 # – root
262 # – ‘^(?!sudo_).*$’ # all non sudo users ß 禁止root命令,禁止未使用 sudo
263 # modules:
264 # – cmd ß禁止使用cmd命令
返回
我们知道,执行完saltstack的任何命令,可以将结果返回到某个地方,可以返回到MySQL数据库
现在,我们来测试将输出结果到MySQL数据库
第一步:安装MySQL数据库
yum install mysql-server mysql mysql-devel
第二步:安装python-mysqldb这个包,不然写不进去
[root@salt-master ~]# yum install MySQL-python
第三步: 创建库和表
CREATE DATABASE `salt`
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
USE `salt`;
CREATE TABLE `jids` (
`jid` varchar(255) NOT NULL,
`load` mediumtext NOT NULL,
UNIQUE KEY `jid` (`jid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `salt_returns` (
`fun` varchar(50) NOT NULL,
`jid` varchar(255) NOT NULL,
`return` mediumtext NOT NULL,
`id` varchar(255) NOT NULL,
`success` varchar(10) NOT NULL,
`full_ret` mediumtext NOT NULL,
`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
KEY `id` (`id`),
KEY `jid` (`jid`),
KEY `fun` (`fun`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `salt_events`;
CREATE TABLE `salt_events` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`tag` varchar(255) NOT NULL,
`data` varchar(1024) NOT NULL,
`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `tag` (`tag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
use salt;
show tables;
grant all on salt.* to salt@’%’ identified by ‘salt’;
flush privileges;
上面的意思就是:
我们创建了一个salt数据库,库里面有3张表,返回就写到salt表里面
记住,返回数据是minion直接返回的,所以所有的minion都要安装MySQL-python这个包,要保证minion跟数据库是通的
第四步:修改minion的配置文件,在末尾添加如下
# vim /etc/salt/minion
#by xiedi
mysql.host: ‘10.10.20.138’
mysql.user: ‘salt’
mysql.pass: ‘salt’
mysql.db: ‘salt’
mysql.port: 3306
重启minion服务,刷新pillar,然后执行命令
[root@salt-master ~]# salt ‘*’ saltutil.refresh_pillar
salt-master:
True
salt-minion:
True
[root@salt-master ~]# salt ‘*’ test.ping –return mysql
salt-master:
True
salt-minion:
True
连上master的数据库
[root@salt-master ~]# mysql -h 10.10.20.138 -u salt –psalt
查看执行的命令,是否在数据库salt的表salt_returns里
mysql> use salt
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+—————-+
| Tables_in_salt |
+—————-+
| jids |
| salt_events |
| salt_returns |
+—————-+
3 rows in set (0.00 sec)
mysql> select * from salt_returns;
+———–+———————-+——–+————-+———+—————————————————————————————————————————————–+———————+
| fun | jid | return | id | success | full_ret | alter_time |
+———–+———————-+——–+————-+———+—————————————————————————————————————————————–+———————+
| test.ping | 20151211154012198042 | true | salt-master | 1 | {“fun_args”: [], “jid”: “20151211154012198042”, “return”: true, “retcode”: 0, “success”: true, “fun”: “test.ping“, “id”: “salt-master”} | 2015-12-11 15:40:12 |
+———–+———————-+——–+————-+———+—————————————————————————————————————————————–+———————+
1 row in set (0.00 sec)
原文链接:saltstack用法介绍,转载请注明来源!