grains与pillar最主要的区别:静态取值方式 grains ,保留在minion端; pillar保留在master端
grains简介
- grains是Saltstack最重要的组件之一,grains的作用是收集被控主机的基本信息,这些信息通常都是一些静态的数据,包括CPU、内核、操作系统、虚拟化等,在服务器端可以根据这些信息进行灵活定制,管理员可以利用这新信息对不同业务进行个性化配置。
- Grains是SaltStack当中的一个数据系统,当Minion启动时Grains会把Minion的数据收集起来,比如操作系统版本、CPU 位数等。由于采用的是静态收集,只有当Minion发生重启时数据才会发生变化,在Grains的实际运用中常用于对多台Minion做操作时进行一些条件匹配,比如有上百台Minion服务器,只需要对操作系统为CentOS的做一些操作等。
grains模块的应用
- 罗列出所有Minion的所有信息,命令执行后可以看到出现了很多信息,我们可以用这些信息来作为一些过滤条件。
[root@server1 files]# salt server2 grains.items #取全部的保留字,包括值
[root@server1 files]# salt server2 grains.item os
[root@server1 files]# salt server2 grains.item fqdn #取完整的主机名 包括域名等
[root@server1 files]# salt server2 grains.item nodename #只取主机名
[root@server1 files]# salt server2 grains.ls #列出所有保留字
- 通过grains来做信息过滤,使用-G选项:
[root@server1 ~]# salt -G 'cpuarch:x86_64' cmd.run 'uptime' #在所有64位CPU服务器上执行uptime
执行结果:
- 当grains.items里的模块不满足当前情况,还可以自定义Grains,比如在server2(minion)添加一个apache模块
- 第一种,修改配置文件
server2:
vim /etc/salt/minion
129 grains:
130 roles:
131 - apache
[root@server2 salt]# systemctl restart salt-minion
- server1采集:
[root@server1 files]# salt server2 grains.item roles
[root@server2 salt]# ps ax 看到salt-minion的进程
- 第二种: 建立一个新的文件grains
server3:
[root@server3 logs]# vim /etc/salt/grains
roles:
- nginx #或者写成键值对的形式 roles: nginx
- 重启服务后查看采集的结果:
[root@server3 logs]# systemctl restart salt-minion
[root@server1 files]# salt server3 grains.item roles
- 不重启服务第一次推看不到结果,可以在server1执行指令刷新。
[root@server1 files]# salt server3 saltutil.sync_grains #同步到指定的minion
[root@server1 files]# salt server3 grains.item roles
- 第三种:在server1新建目录/srv/salt/_grains
[root@server1 ~]# mkdir /srv/salt/_grains
[root@server1 ~]# cd /srv/salt/_grains/
[root@server1 _grains]# vim my_grains.py
def my_grains():
grains = {}
grains['hello'] = 'world' #定义键值对
grains['salt'] = 'stack'
return grains
- 刷新并测试。
[root@server1 _grains]# salt server2 saltutil.refresh_modules #同步 让模块生效
在server2查看:
[root@server2 salt]# cd /var/cache/
[root@server2 cache]# ls
httpd ldconfig man salt yum
[root@server2 cache]# cd salt/
[root@server2 salt]# tree . #tree 查看,并没有生效
[root@server1 _grains]# salt server2 grains.item hello 没有同步
[root@server1 _grains]# salt server2 saltutil.sync_grains
[root@server1 _grains]# salt server2 grains.item hello 成功同步
server2查看:tree .
- 测试。
[root@server1 _grains]# salt -G 'roles:apache' test.ping
[root@server1 _grains]# salt -G 'roles:nginx' test.ping
不成功可以刷新一下:
[root@server1 _grains]# salt server3 saltutil.refresh_modules
[root@server1 _grains]# salt server3 grains.item roles
[root@server1 _grains]# salt -G 'hello:world' test ping
[root@server1 _grains]# salt server2 grains.item hello
[root@server1 _grains]# salt server2 grains.item salt
- 或者修改
top.sls
文件
[root@server1 salt]# vim top.sls
base:
'roles:apache':
- match: grain
- apache.install
'roles:nginx':
- match: grain
- nginx.service
[root@server1 salt]# salt '*' state.highstate
[root@server1 salt]# salt -G "roles:nginx" test.ping
[root@server1 salt]# salt -G "hello:world" test.ping
server2:
Minion did not return. [No response]
server3:
Minion did not return. [No response]
ERROR: Minions returned with non-zero exit code
[root@server1 salt]# salt -G "os:RedHat" test.ping 系统内的很快
[root@server1 salt]# salt -G "hello:world" test.ping
[root@server2 salt]# systemctl restart salt-minion
[root@server3 logs]# systemctl restart salt-minion
如果显示没有响应 在2和3重启服务可以解决。
pillar模块的应用
pillar,只在master端
[root@server1 ~]# vim /etc/salt/master
828 pillar_roots: #编辑配置文件,打开有关pillar设置行
829 base:
830 - /srv/pillar
[root@server1 ~]# mkdir /srv/pillar #新建配置文件中的目录
[root@server1 pillar]# mkdir web
[root@server1 pillar]# cd web/
[root@server1 web]# ls
[root@server1 web]# vim vars.sls #编辑变量的.sls文件
{% if grains['fqdn'] == 'server2' %}
webserver: httpd
{% elif grains['fqdn'] == 'server3' %}
webserver: nginx
{% endif %}
- 编辑top.sls文件。
[root@server1 web]# cd ..
[root@server1 pillar]# ls
web
[root@server1 pillar]# vim top.sls
base:
'*':
- web.vars
- 刷新,并测试。
[root@server1 pillar]# salt '*' saltutil.refresh_pillar #刷新
[root@server1 pillar]# salt '*' pillar.items
[root@server1 pillar]# salt server2 pillar.item webserver
[root@server1 pillar]# salt server3 pillar.item webserver