如何在 Saltstack 組件下收集被控主機的信息?

什麼是 grains
grains是Saltstack最重要的組件之一,grains的作用是收集被控主機的基本信息,這些信息通常都是一些靜態類數據,包括CPU、內核、操作系統、虛擬化等,在服務器端可以根據這些信息進行靈活定製,管理員可以利用這些信息對於不同的業務進行個性化設置,官方提供:grains就是用來區分不同的minion進行不同的配置,salt '' ,主要就是在'' 裏面進行匹配主機的作用。

應用場景
在state中使用 用於配置管理模塊

在target中使用,用來匹配minion,例如匹配操作系統使用-G的選項

用於信息查詢,grains保存收集到的客戶端的詳細信息

CentOS發行版主機將被“host: {{ grains['xxx'] }}”匹配,以主機saltstack_web1group_1(CentOS 6.5)爲例,最終得到“host: saltstack_web1group_1”。同時命令行的匹配操作系統發行版爲CentOS的被控端可以通過-G參數來過濾。


[root@saltstack-master ~]# salt -G 'os:CentOS' test.ping
saltstack_web1group_1:
True
saltstack_web1group_2:
True

grains常用操作命令

匹配內核版本爲2.6.32-504.el6.x86_64的minion並執行命令'uname -a'


[root@saltstack-master ~]# salt -G 'kernelrelease:2.6.32-431.el6.x86_64' cmd.run 'uname -a'
saltstack_web1group_1:
Linux saltstack_web1group_1 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
saltstack_web1group_2:
Linux saltstack_web1group_2 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

獲取所有minion的grains項信息


[root@saltstack-master ~]# salt '*' grains.ls
saltstack_web1group_1:
- SSDs
- biosreleasedate
- biosversion
- cpu_flags
- cpu_model
- cpuarch
- domain
- fqdn
- fqdn_ip4
- fqdn_ip6
- gpus
- host
--------------忽略部分內容------------------

當然也可以獲取主機單項grains數據,如獲取操作發行版本。


[root@saltstack-master ~]# salt 'saltstack_web1group_1' grains.item os
saltstack_web1group_1:
----------
os:
CentOS

定義grains數據

定義grains數據的方法有兩種,其中一種是在minion定製配置文件,另外一種是通過master擴展模塊API實現,區別是模塊更靈活,可用過Python編程動態定義,而配置文件只適合相對的固定的key與value。


[root@saltstack-master ~]# salt 'saltstack_web1group_1' grains.items
saltstack_web1group_1:
----------
SSDs:
biosreleasedate:
05/19/2017
biosversion:
6.00
cpu_flags:
- fpu
- vme
- de
--------------忽略部分內容------------------

被控端主機定製grains數據

SSH登錄一臺被控主機(minion),如SN2013-08-022,配置文件定製的路徑爲/etc/salt/minion,參數爲default_include:minion.d/*conf

創建文件【/etc/salt/minion.d/hostinfo.conf】


[root@saltstack_web1group_1 ~]# cd /etc/salt/minion.d/
[root@saltstack_web1group_1 minion.d]# vim hostinfo.conf
grains:
roles:
- webserver
- memcache
deployment: datacenter4
cabinet: 14
[root@saltstack_web1group_1 minion.d]# service salt-minion restart
Stopping salt-minion daemon: [確定]
Starting salt-minion daemon: [確定]

重啓minion服務,驗證結果在master上運行:salt 'saltstack_web1group_1' grains.itemroles deployment cabinet,觀察配置的key和value。


[root@saltstack-master ~]# salt 'saltstack_web1group_1' grains.item roles deployment cabinet
saltstack_web1group_1:
----------
cabinet:
14
deployment:
datacenter4
roles:
- webserver
- memcache

主控制端擴展模塊定製grains數據

首先在主控制端編寫Python代碼,然後將該Python文件同步到被控制端上,最後刷新生效(即編譯Python源代碼文件成字節碼pyc)。在主控端base目錄(見/etc/salt/master配置文件的file_roots項,默認base配置在/srv/salt)下生成_grains目錄,執行install -d /srv/salt/_grains開始編寫代碼,實時獲取被控主機系統允許最大打開文件數(ulimit -n)的grains數據。


[root@saltstack-master ~]# install -d /srv/salt/_grains
[root@saltstack-master ~]# cd /srv/salt/_grains
[root@saltstack-master _grains]# vim grains_openfile.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import os,sys,commands

#定義一個獲取最大打開文件數的函數,函數名稱沒有要求,符合python函數命名規則即可
def Grains_openfile():
'''
return os max open file of grains value
'''
grains = {} #初始化一個字典,變量名一定要用grains,以便Saltstack識別

_open_file=65535 #初始化一個默認值

try:
getulimit = commands.getstatusoutput('source /etc/profile;ulimit -n')
except Exception,e:
pass

if getulimit[0]==0:
_open_file=int(getulimit[1])
grains['max_open_file'] = _open_file #將獲取的ulimit -n的結果進行賦值,其中'max_open_file'就是grains項,——open_file就是grains的值
return grains

grains_openfile()定義一個獲取最大打開文件數的函數,函數名稱沒有要求,符合Python函數命名規則即可。

grains={} 初始化一個grains字典,變量名一定要用grains,以便saltstack識別

grains['max_open_file']=_open_file 將獲取的Linux ulimit -n的結果值賦予grains['max_open_file'],其中"max_open_file"就是grains的項,_open_file就是grains的值。

在主控端同步模塊:salt 'saltstack_web1group_1' saltutil.sync_grains 或 salt 'saltstack_web1group_1' saltutil.sync_all,此時文件已經同步到被控端主機以下目錄中。


[root@saltstack-master _grains]# salt 'saltstack_web1group_1' saltutil.sync_all
saltstack_web1group_1:
----------
beacons:
grains:
- grains.grains_openfile
modules:
output:
renderers:
returners:
sdb:
states:
utils:
[root@saltstack_web1group_1 minion.d]# ll /var/cache/salt/minion/extmods/grains/
總用量 4
-rw-------. 1 root root 774 3月 20 16:36 grains_openfile.py
[root@saltstack_web1group_1 minion.d]# ll /var/cache/salt/minion/files/base/_grains/
總用量 4
-rw-------. 1 root root 774 3月 20 16:36 grains_openfile.py

/var/cache/salt/minion/extmods/grains/

爲擴展模塊文件最終存放位置,刷新模塊後將在同路徑下生成字節碼pyc;/var/cache/salt/minion/files/base/_grains/ 爲臨時存放位置

刷新模塊salt 'saltstack_web1group_1' sys.reload_modules

在/var/cache/salt/minion/extmods/grains/位置的一個編譯後的字節碼文件grains_openfile.py文件,爲python可執行的格式。


[root@saltstack-master _grains]# salt 'saltstack_web1group_1' sys.reload_modules
saltstack_web1group_1:
True
[root@saltstack_web1group_1 minion.d]# ll /var/cache/salt/minion/extmods/grains/
總用量 4
-rw-------. 1 root root 774 3月 20 16:36 grains_openfile.py

校驗結果爲可以在主控端查看grains信息。

執行salt 'saltstack_web1group_1' grains.item max_open_file
結果顯示”max_open_file:65535”,這就是前面定製的主機grains信息。


[root@saltstack-master _grains]# salt 'saltstack_web1group_1' grains.item max_open_file
saltstack_web1group_1:
----------
max_open_file: 65535
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章