什麼是Grains
Grains是服務器的一系列粒子信息,也就是服務器的一系列物理,軟件環境信息。在執行salt的sls時候可以根據Grains信息的不同對服務器進行匹配分組,例如可以根據系統是centos服務器跟系統是redhat環境的安裝不同的軟件包。
Grains是什麼樣子
下面是一臺Dell R420的粒子信息
[root@yw_home ~]# salt 192.168.0.100 grains.items 192.168.0.100: biosreleasedate: 03/11/2013 biosversion: 1.5.2 cpu_flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid cpu_model: Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz cpuarch: x86_64 defaultencoding: UTF8 defaultlanguage: en_US domain: localdomain external_ip: 192.168.0.100 fqdn: localhost.localdomain fqdn_ip4: 127.0.0.1 fqdn_ip6: ::1 gpus: {'model': 'G200eR2', 'vendor': 'unknown'} host: localhost hwaddr_interfaces: {'lo': '00:00:00:00:00:00', 'em1': '保密隱去', 'em2': '保密隱去'} id: 192.168.0.100 ip_interfaces: {'lo': ['127.0.0.1'], 'em1': ['192.168.0.100'], 'em2': []} ipv4: 127.0.0.1 192.168.0.100 ipv6: ::1 fe80::92b1:1cff:fe50:d4ac kernel: Linux kernelrelease: 2.6.32-431.el6.x86_64 localhost: 192.168.0.100 manufacturer: Dell Inc. master: 192.168.0.100 mem_total: 64377 nodename: 192.168.0.100 num_cpus: 24 num_gpus: 1 os: CentOS os_family: RedHat osarch: x86_64 oscodename: Final osfinger: CentOS-6 osfullname: CentOS osmajorrelease: 6 5 osrelease: 6.5 path: /sbin:/usr/sbin:/bin:/usr/bin productname: PowerEdge R420 ps: ps -efH pythonpath: /usr/bin /usr/lib64/python26.zip /usr/lib64/python2.6 /usr/lib64/python2.6/plat-linux2 /usr/lib64/python2.6/lib-tk /usr/lib64/python2.6/lib-old /usr/lib64/python2.6/lib-dynload /usr/lib64/python2.6/site-packages /usr/lib64/python2.6/site-packages/gtk-2.0 /usr/lib/python2.6/site-packages /usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg-info pythonversion: 2.6.6.final.0 saltpath: /usr/lib/python2.6/site-packages/salt saltversion: 2014.1.0 saltversioninfo: 2014 1 0 serialnumber: 保密隱去 server_id: 保密隱去 shell: /bin/sh virtual: physical
從上面的信息可以看出,grains其實是一系列的服務器信息,從信息裏可以看到服務器是一臺dell r420型號的物理機器,系統是centos6.5,cpu是E5-2420 24核。通常我們進行採購都是一批次的產品,所以使用grains可以輕易的進行批量管理。當然,也可以通過自定義grains來分組管理我們的服務器。
怎麼運用Grains
第一種,命令行中使用,salt 命令中使用grains
#對系統是CentOS的服務器進行ping測試操作 #os:CentOS ; 就是對應上面grains.items顯示出來的os值是CentOs的對象進行匹配 salt -G 'os:CentOS' test.ping #對cpu架構是x86_64的服務器顯示CPU的個數 salt -G 'cpuarch:x86_64' grains.item num_cpus #對字典值的對象進行匹配 salt -G 'ip_interfaces:em1:192.168.0.*'
第二種,在SLS中使用grains
# 在top.sls中使用grais 'os:CentOS': - match: grain - webserver
上面是在top.sls中定義對系統是CentOs的服務器執行webserver.sls定義的狀態信息.
進階,自定義Grains
Grains的四種存在形式
Core grains. 在 /etc/salt/grains 自定義grains。 在 /etc/salt/minion 自定義grains。 在 _grains 目錄自定義grain,同步到minions。
自定義的grains編寫格式參考上面grains.items顯示出來的格式
直接值對應
os:CentOS
字典格式
ip_interfaces: {'lo': ['127.0.0.1'], 'em1': ['192.168.0.100'], 'em2': []}
分多行值的列表格式
osmajorrelease: 6 5
Core Grains : 是salt定義好的grains,後面三種自定義的grains,如果名稱跟Core grains定義的一樣,將會覆蓋掉Core grains定義的值.
/etc/salt/grains : 單獨的grains來放置自定義的grains可以更加好的獨立***。
roles: - webserver - memcache deployment: datacenter4 cabinet: 13 cab_u: 14-15
* 上面的內容定義了四個grain。 roles是一個列表,還有deployment,cabinet,cab_u三個值
* 需要重啓minion才能生效
/etc/salt/minion : 這個的定義跟在/etc/salt/grains中的定義一樣,只不過要多個grains的聲明
grains : roles: - webserver - memcache deployment: datacenter4 cabinet: 13 cab_u: 14-15
* 需要重啓minion才能生效
_grains 目錄自定義grain :
假設使用默認的master 的file_roots配置路徑 /srv/salt ,那麼_grains的位置是/srv/salt/_grains
# mkdir /srv/salt/_grains # vim /srv/salt/_grains/my_grain.py ## 添加下面內容 def my_grains(): grains = {'roles' : ['phpserver','webserver']} return grains # salt '192.168.0.100' saltutil.sync_grains # salt '192.168.0.100' grains.item roles
這裏是通過定以一個grains模塊注入給minion一個roles信息。
如果查詢grains.items roles無法查出相關信息,可以重啓下master,再重新測試
下面給給出一個Core grains定義的一個例子,使用了比較複雜的方式來定義grains,更多的信息點擊這裏
saltutil.sync_grainsdef _windows_cpudata(): ''' Return some CPU information on Windows minions ''' # Provides: # num_cpus # cpu_model grains = {} if 'NUMBER_OF_PROCESSORS' in os.environ: # Cast to int so that the logic isn't broken when used as a # conditional in templating. Also follows _linux_cpudata() try: grains['num_cpus'] = int(os.environ['NUMBER_OF_PROCESSORS']) except ValueError: grains['num_cpus'] = 1 grains['cpu_model'] = platform.processor() return grains
分發自定義的grains到客戶端
### 下面的三個操作均會將自定義的grains分發到192.168.0.100上 #salt '192.168.0.100' state.highstate #salt '192.168.0.100' saltutil.sync_all #salt '192.168.0.100' saltutil.sync_grains