參考:http://www.cnblogs.com/shhnwangjian/p/5985868.html
salt 的grains主要是存儲靜態的數據,主要是minion端的一些數據,比如,hostname,內存大小、IP,CPU等一些數據,主要是存儲在minion端的。
minion在啟動時會讀取grains數據,如果有新的grains數據需要重啟minion服務,或者在master端使用salt的命令進行刷新。
自定義grains數據的優先順序
https://docs.saltstack.com/en/latest/topics/grains/index.html#precedence
- Core grains.
- Custom grains in
/etc/salt/grains. - Custom grains in
/etc/salt/minion. - Custom grain modules in
_grainsdirectory, synced to minions.
后面的grains信息會覆蓋前面的信息。
_grains會覆蓋前面所有的
先來查看一下有哪些grains數據
查看獲取grains信息
在master端查看
使用grains.ls 列出有效的grains
[root@cong-33 ~]# salt 'cong-55' grains.ls ##列出grains的key信息 cong-55: - GameType - SSDs - cloud - cpu_flags - cpu_model - cpuarch - disks - dns - domain - fqdn - fqdn_ip4 - fqdn_ip6 。。。。。。。 。。。。。。。
grains.items列出所有grains的信息
[root@cong-33 ~]# salt 'cong-55' grains.items cong-55: ---------- GameType: 3D SSDs: cloud: qc cpu_flags: - fpu - vme ............ ............
獲取指定的grains的key的信息
[root@cong-33 ~]# salt 'cong-55' grains.get shell ##獲取shell環境 cong-55: /bin/bash [root@cong-33 ~]# salt 'cong-55' grains.item mem_total ##獲取內存總大小 cong-55: ---------- mem_total: 2517 [root@cong-33 ~]#
在minion端使用salt-call來獲取
[root@cong-55 ~]# salt-call grains.ls local: - GameType - SSDs - cloud - cpu_flags - cpu_model - cpuarch - disks - dns 。。。。。。。。 [root@cong-55 ~]# salt-call grains.items local: ---------- GameType: 3D SSDs: cloud: qc cpu_flags: - fpu 。。。。。。。 。。。。。。 [root@cong-55 ~]# salt-call grains.get shell local: /bin/bash [root@cong-55 ~]# salt-call grains.item mem_total local: ---------- mem_total: 2517 [root@cong-55 ~]#
自定義配置grains信息
這些都是默認的grains信息,我們可以自定義添加指定的grains信息。
在minion端的配置grains
minion添加grains信息
為了方便管理我們在/etc/salt/minon的主配置文件中另增一個配置文件專門用來配置grains信息的,這樣好管理。
[root@cong-55 ~]# grep -v ^$ /etc/salt/minion|grep -v ^# default_include: minion.d/*.conf ##相對路徑,我們在這個目錄下創建以.conf結尾的文件就可被salt-minion讀取了 master: 192.168.1.33 id: cong-55 [root@cong-55 ~]#
配置grains文件
[root@cong-55 ~]# cat /etc/salt/minion.d/grains.conf grains: roles: - gameserver - mysql - redis GameType: 3D cloud: qc [root@cong-55 ~]#
配置完成,重啟minion服務
[root@cong-55 ~]# /etc/init.d/salt-minion restart
查看指定的grains的key是否可以獲取
[root@cong-33 ~]# salt 'cong-55' grains.item GameType cong-55: ---------- GameType: 3D [root@cong-33 ~]# salt 'cong-55' grains.item roles cong-55: ---------- roles: - gameserver - mysql - redis [root@cong-33 ~]#
自定義的grains的信息都可以配置好了。
不重啟minion讓grains也可以生效
上面在minion端配置好后需要重啟服務才可以生效,也可以不重啟minion服務生效的。直接在master端刷新grains的數據就可以了
minion端配置grains
[root@cong-55 ~]# cat /etc/salt/minion.d/grains.conf grains: roles: - gameserver - mysql - redis GameType: 3D cloud: qc GameName: TestGame [root@cong-55 ~]#
在master刷新數據,並獲取新的grains key的值
[root@cong-33 ~]# salt 'cong-55' saltutil.sync_grains ##saltutil.refresh_grains 命令也可以刷新 cong-55: - grains.my_grains ##這個是我在master配置的grains信息,下面再說 [root@cong-33 ~]# salt 'cong-55' grains.item GameName ##刷新后可以獲取指定的grains信息 cong-55: ---------- GameName: TestGame [root@cong-33 ~]#
在master配置grains信息
參考:http://www.cnblogs.com/shhnwangjian/p/5985868.html
在master配置grains信息需要在指定的file_roots目錄下的_grains目錄中創建grains的信息文件才可以.
file_roots目錄默認是 /src/salt/ 而grains的信息是在file_roots目錄下的_grains目錄里面。
file_roots的值可以通過配置文件/etc/salt/master來配置指定。還可以配置多個環境的file_roots的值
file_roots配置:

然后我們在file_roots目錄下創建一個_grains目錄,然后在創建grains的信息文件
[root@cong-33 ~]# mkdir /srv/salt/_grains/ -p
配置grains信息
[root@cong-33 ~]# cd /srv/salt/_grains/ [root@cong-33 _grains]# ls my_grains.py [root@cong-33 _grains]# cat my_grains.py #!/usr/bin/env python #_*_ coding: utf-8 _*_ def my_grains(): grains = {} grains['name'] = 'cong' grains['edu'] = 'shhnwangjian' return grains #my_grains #print my_grains() [root@cong-33 _grains]#
上面的grains文件使用python編寫的,
然后我們在master通過命令來刷新grains就可以了
[root@cong-33 _grains]# salt 'cong-55' saltutil.refresh_grains cong-55: True [root@cong-33 _grains]# salt 'cong-55' grains.get name cong-55: cong [root@cong-33 _grains]# salt 'cong-55' grains.get edu cong-55: shhnwangjian [root@cong-33 _grains]#
下面說一下grains的簡單使用吧。
我們可以根據grains的信息來做sls文件的編寫,比如grains得出OS是redhat類型的系統就執相對應的操作,類似apache在redhat平台和debin平台的名稱就不一樣,我們就可以根據grains的OS信息來獲取系統的平台,再做處理。
-G 使用grains信息,匹配內存為2517的minion ,執行ls /tmp 命令
[root@cong-33 _grains]# salt -G 'mem_total:2517' cmd.run 'ls /tmp' cong-55: mysql.sock yum.log yum_save_tx-2017-11-21-11-24msqElI.yumtx [root@cong-33 _grains]#
匹配內存為2517的minion,獲取匹配minion的系統類型
[root@cong-33 _grains]# salt -G 'mem_total:2517' grains.get os cong-55: CentOS
pillar也是salt存儲信息的,下面pillar例子根據minion的os系統類型來設置pillar的參數的值。
centos系統的apache key 的值就是httpd
debin系統的apache key的值就是 apache2
這樣我們能在安裝apache時可以根據這個來獲取名稱,在使用安裝命令來安裝軟件
[root@cong-33 _grains]# cat /srv/salt/pillar/httpd.sls {% if grains['os'] == 'CentOS' %} apache: httpd {% elif grains['os'] == 'Debian' %} apache: apache2 {% endif %} [root@cong-33 _grains]#
