官方文档参考
docs.saltstack.cn 版本较旧
docs.saltstack.com
一、Grains工具:
https://docs.saltstack.cn/topics/grains/index.html
Saltstack里的Grains功能,讲的是minion端的静态变量,在master端通过Grains可以获得minion对应的变量值。
salt附带一个接口,用于获取有关底层系统的信息。这被称为“Grains界面”,因为它提供了含salt的信息颗粒。收集操作系统、域名、IP地址、内核、操作系统类型、内存和许多其他系统属性的Grains。
Grains界面可用于salt模块和组件,以便在正确的系统上自动使用正确的salt命令。
Grains数据是相对静态的,但如果系统信息发生更改(例如,如果网络设置发生更改),或者如果为自定义Grains指定了新值,则Grains数据将刷新。
1.打开server2的grains工具包
[root@server2 salt]# pwd
/etc/salt
[root@server2 salt]# vim minion
[root@server2 salt]# systemctl restart salt-minion
[root@server1 salt]# salt '*' grains.items ## *表示全部设备,也可指明server2,server3没有开故不显示
[root@server1 salt]# salt server2 grains.item roles ##只显示server2
2.编写server3角色
[root@server1 salt]# salt server3 saltutil.sync_grains
[root@server3 salt]# pwd
/etc/salt
[root@server3 salt]# vim grains
[root@server3 salt]# cat grains
roles: nginx
[root@server1 salt]# salt '*' grains.item roles
[root@server1 salt]# mkdir /srv/salt/_grains
[root@server1 salt]# cd /srv/salt/_grains
[root@server1 _grains]# vim my_grains.py
#!/usr/bin/env python
def my_grains():
grains = {'foo': 'bar', 'hello': 'world'}
grains['salt'] = 'stack'
return grains
[root@server1 _grains]# salt '*' saltutil.sync_grains
[root@server1 _grains]# salt '*' grains.item hello
[root@server1 _grains]# salt '*' grains.item salt
[root@server1 _grains]# salt '*' grains.item os ##操作系统
server2/3上都可以查看到推送的脚本
[root@server1 salt]# vim top.sls
base:
'roles:apache':
- match: grain
- apache.service
'roles:nginx':
- match: grain
- nginx.service
[root@server1 salt]# salt '*' state.highstate
[root@server1 _grains]# salt '*' grains.item fqdn ##用户名
二、Pillar工具:
https://docs.saltstack.cn/topics/pillar/index.html
Pillar是Salt用来分发全局变量到所有minions的一个接口。Pillar data的管理类似于Salt State Tree。
[root@server1 pillar]# ls
top.sls web
[root@server1 pillar]# cat top.sls
base:
'*':
- web.vars
[root@server1 pillar]# cd web/
[root@server1 web]# ls
vars.sls
[root@server1 web]# cat vars.sls
{% if grains['fqdn'] == 'server2' %}
webserver: httpd
state: master
{% elif grains['fqdn'] == 'server3' %}
webserver: nginx
state: backup
{% endif %}
[root@server1 pillar]# salt '*' saltutil.refresh_pillar
# 当pillar数据在master端更新时,minion端需要刷新本地数据,刷新pillar数据
[root@server1 pillar]# salt -I 'webserver:nginx' test.ping
[root@server1 pillar]# salt -I 'webserver:httpd' test.ping