一、grains
簡介
Grains是SaltStack的一個組件,存放在SaltStack的minion端。
當salt-minion啓動時會把收集到的數據靜態存放在Grains當中,只有當minion重啓時纔會進行數據的更新。
由於grains是靜態數據,因此不推薦經常去修改它。
應用場景:
- 信息查詢,可用作CMDB。
- 在target中使用,匹配minion。
- 在state系統中使用,配置管理模塊。
信息查詢
用於查詢minion端的IP、FQDN等信息
默認可用的grains:
[root@server1 salt]# salt server3 grains.ls
server3:
- SSDs
- biosreleasedate
- biosversion
- cpu_flags
- cpu_model
- cpuarch
- cwd
- disks
- dns
- domain
- fqdn
- fqdn_ip4
- fqdn_ip6
- fqdns
- gid
- gpus
- groupname
- host
- hwaddr_interfaces
- id
- init
- ip4_gw
- ip4_interfaces
- ip6_gw
- ip6_interfaces
- ip_gw
- ip_interfaces
- ipv4
- ipv6
- kernel
- kernelrelease
- kernelversion
- locale_info
- localhost
- lsb_distrib_codename
...等
這些信息是以鍵值對的形式保存的,可以使用以下命令查看鍵值對的信息:
[root@server1 salt]# salt server3 grains.items
也可以查看其中一項的信息:
[root@server1 salt]# salt server3 grains.item os #查看系統
server3:
----------
os:
RedHat
[root@server1 salt]# salt server3 grains.item nodename #查看主機名
server3:
----------
nodename:
server3
[root@server1 salt]# salt server3 grains.item shell #查看shell類型
server3:
----------
shell:
/bin/sh
自定義grains項
1.在/etc/salt/minion中定義:
[root@server3 ~]# vim /etc/salt/minion
以上表示定義了一個key爲roles
,value爲apache
的grains。
重啓salt-minion,否則數據不會更新:
[root@server3 ~]# systemctl restart salt-minion
在master查看:
[root@server1 salt]# salt server3 grains.item roles
server3:
----------
roles:
apache
也可以通過-G
選項使用定義的grains信息對主機進行匹配:
[root@server1 salt]# salt -G 'roles:apache' test.ping
server3:
True
2.在/etc/salt/grains中定義:
在server2:
[root@server2 salt]# vim /etc/salt/grains
[root@server2 salt]# cat /etc/salt/grains
roles: nginx
這種定義方式不需要重啓minion端,但是需要同步:
[root@server1 salt]# salt server2 saltutil.sync_grains
server2:
同步後查看:
[root@server1 salt]# salt server2 grains.item roles
server2:
----------
roles:
nginx
定義成功。
3.在salt-master端創建_grains目錄:
以上兩種定義方式都需要在minion端操作,這種方式只需要在master端操作即可。
[root@server1 salt]# mkdir /srv/salt/_grains
[root@server1 salt]# ls
apache _grains _modules nfs nginx top.sls
[root@server1 salt]# cd _grains/
[root@server1 _grains]# vim my_grain.py
[root@server1 _grains]# cat my_grain.py
def my_grain():
grains = {}
grains['salt'] = 'stack'
grains['hello'] = 'world'
return grains
在_grains
目錄中編輯py文件定義grains
,定義後需要進行同步:
[root@server1 _grains]# salt '*' saltutil.sync_grains
server2:
- grains.my_grain
server3:
- grains.my_grain
同步後就可以進行查看:
[root@server1 _grains]# salt '*' grains.item salt
server3:
----------
salt:
stack
server2:
----------
salt:
stack
[root@server1 _grains]# salt '*' grains.item hello
server2:
----------
hello:
world
server3:
----------
hello:
world
定義成功,但是這種方式還是將定義信息同步到minion端:
[root@server2 salt]# cd /var/cache/salt/
[root@server2 salt]# tree .
那麼有沒有一種方式將信息只保存在master端呢,答案就是pillar。
使用grains
在target中匹配minion:
[root@server1 salt]# salt -G 'roles:apache' test.ping
server3:
True
在top文件中匹配:
[root@server1 salt]# vim top.sls
[root@server1 salt]# cat top.sls
base:
'roles:apache':
- match: grain
- apache
'roles:nginx':
- match: grain
- nginx
以上表示匹配到'roles:apache' grain的節點執行apache目錄的文件,匹配到'roles:nginx' grain的節點執行nginx目錄的文件,
推送前注意在節點上設置對應的grains。
[root@server1 salt]# salt '*' state.highstate
二、pillar
簡介
pillar和grains一樣也是一個數據系統,但是應用場景不同。
pillar是將信息動態的存放在master端,主要存放私密、敏感信息(如用戶名密碼等),而且可以指定某一個minion纔可以看到對應的信息。
pillar更加適合在配置管理中運用。
聲明pillar
pillar的默認路徑是/srv/pillar
,這個路徑需要我們自己建立,
[root@server1 srv]# mkdir /srv/pillar
[root@server1 srv]# ls
pillar salt
編輯定義文件:
[root@server1 srv]# cd pillar/
[root@server1 pillar]# vim web.sls
[root@server1 pillar]# cat web.sls
{% if grains['fqdn'] == 'server3' %}
webserver: httpd
{% elif grains['fqdn'] == 'server2' %}
webserver: nginx
{% endif %}
port: 80
以上文件內容表示給server3定義pillar webserver: httpd
,給server2定義pillar webserver: nginx
,port: 80
是共有信息,表示所有節點都有。
編輯top文件:
[root@server1 pillar]# vim top.sls
[root@server1 pillar]# cat top.sls
base:
'*':
- web
以上文件內容表示對所有節點匹配web.sls文件中的pillar信息。
pillar與grains不同的是,由於其是動態的,因此pillar定義後直接就可以使用:
[root@server1 pillar]# salt '*' pillar.items
server3:
----------
port:
80
webserver:
httpd
server2:
----------
port:
80
webserver:
nginx
但是此時執行以下兩條查看指令卻沒有返回:
[root@server1 pillar]# salt '*' pillar.item port
server2:
----------
port:
server3:
----------
port:
[root@server1 pillar]# salt -I 'webserver:nginx' test.ping
我們可以執行以下指令使其正常:
[root@server1 pillar]# salt '*' saltutil.refresh_pillar #刷新pillar數據
server2:
True
server3:
True
[root@server1 pillar]# salt '*' pillar.item port
server3:
----------
port:
80
server2:
----------
port:
80
[root@server1 pillar]# salt -I 'webserver:nginx' test.ping
server2:
True
在文件中使用pillar
[root@server1 pillar]# cd ../salt/
[root@server1 salt]# ls
apache _grains _modules nfs nginx top.sls
[root@server1 salt]# cd apache/
[root@server1 apache]# ls
httpd.conf init.sls
[root@server1 apache]# vim init.sls
[root@server1 apache]# cat init.sls
apache:
pkg.installed:
- pkgs:
- {{ pillar['webserver'] }}
service.running:
- name: httpd
- reload: true
- enable: true
- watch:
- file: /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://apache/httpd.conf
調用時使用{{ pillar['webserver'] }}
的方式,表示讀取推送節點的webserver pillar信息。
推送:
[root@server1 apache]# salt server3 state.sls apache
可以看到匹配的信息是httpd。