1. 程式人生 > >《SaltStack技術入門與實踐》—— Grains

《SaltStack技術入門與實踐》—— Grains

eve pre 而在 cnblogs idt ron 創建 ebs ger

Grains

本章節參考《SaltStack技術入門與實踐》,感謝該書作者: 劉繼偉、沈燦、趙舜東

  前幾章我們已經了解SaltStack各個組件以及通過一個案例去熟悉它的各種應用,從這章開始我們通過Python語言去擴展SaltStack組件。雖然SaltStack自帶的各種組件在功能上已經很成熟了,但是有時候無法滿足企業各種復雜的環境。本章的主要內容就是如何去擴展SaltStack各個組件。

一、查看Grains相關的命令及用法

[root@saltmaster ~]# salt ‘irora200‘ sys.list_functions grains
www.361way.com:
    
- grains.append - grains.delval - grains.fetch - grains.filter_by - grains.get - grains.get_or_set_hash - grains.has_value - grains.item - grains.items - grains.ls - grains.remove - grains.set - grains.setval - grains.setvals

  每個命令的幫助信息又可以通過sys.doc查看,如下:

[root@saltmaster ~]# salt ‘irora200‘ sys.doc grains

二、獲取主機item信息

2.1、查看可以獲取的items項

[root@saltmaster ~]# salt ‘irora200‘ grains.ls
www.361way.com:
    - SSDs
    - biosreleasedate
    - biosversion
    - cpu_flags
    - cpu_model
    - cpuarch
    - disks
    - dns
    - domain
    - fqdn
    - fqdn_ip4
    
- fqdn_ip6 - gid - gpus - groupname ………………省略

2.2、查看所有的itmes項

[root@saltmaster ~]# salt ‘irora200‘ grains.items
www.361way.com:
    ----------
    SSDs:
    biosreleasedate:
        01/01/2011
    biosversion:
        0.5.1
    cpu_flags:
        - fpu
        - de
        - pse
        ……… 省略
   cpu_model:
        Intel Xeon E312xx (Sandy Bridge)
    cpuarch:
        x86_64
        ……… 省略

  這裏的輸出是上面grains.ls 一一對應,輸出結果較上面更詳細。

2.3、查看某項或多項item值

[root@saltmaster ~]# salt ‘irora200‘ grains.item ipv4
www.361way.com:
    ----------
    ipv4:
        - 10.211.1.10
        - 127.0.0.1
        - 192.168.0.222
# 一次查看多項
[root@saltmaster ~]# salt ‘irora200‘ grains.item os osrelease osfinger
www.361way.com:
    ----------
    os:
        RedHat
    osfinger:
        Red Hat Enterprise Linux Server-6
    osrelease:
        6.6

  默認定義好的Granis 的取值可以參看salt grains core.py文件。

三、自定義Grains

  三種自定義Grains的方法,這裏一一說明下:

  1. 通過Minion配置文件配置
  2. 通過Grains模塊定義Grains
  3. 使用自定義python腳本獲取grains信息

3.1、通過Minion配置文件配置

  在Minion端我們可以通過查看/etc/salt/minion配置文件中,查找grains可以查看到相關註釋的示例。不過便於配置管理,我們不一般不會選擇在該文件上進行修改,而在minion include的目錄下/etc/salt/minion.d目錄下單獨創建grains.conf文件。就以官方給出的示例,將minion配置文件中配置示例復到/etc/salt/minion.d/grains.conf中,並將註釋去掉,如下:

[[email protected] ~]# cat /etc/salt/minion.d/grains.conf
grains:
roles:
- webserver
- memcache
deployment: datacenter4
cabinet: 13
cab_u: 14-15

  配置增加完成後重啟salt-minion服務生效。通過saltmaster端查看結果如下:

[root@saltmaster ~]# salt ‘irora200‘ grains.item roles
www.361way.com:
----------
roles:
- webserver
- memcache

  這裏有兩點一定需要註意:1、grains.conf 裏的配置需要是YAML格式2、配置修改後需要重啟salt-minion服務才能生效

3.2、通過Grains模塊定義Grains

  上面使用list_functions 列出所有的函數時,對應的是有grains.append、grains.setval等方法,這裏就是利用該方法進行的操作。示例如下:

[root@saltmaster ~]# salt ‘irora200‘ grains.append hosttype ‘online‘
irora200:
----------
hosttype:
- online
[root@saltmaster ~]# salt ‘irora200‘ grains.item hosttype
irora200:
----------
hosttype:
- online
[root@saltmaster ~]# salt ‘irora200‘ grains.setvals "{‘idc‘:‘ZJ‘,‘city‘:‘hangzhou‘}"
irora200:
----------
city:
hangzhou
idc:
ZJ
[root@saltmaster ~]# salt ‘irora200‘ grains.item idc city
irora200:
----------
city:
hangzhou
idc:
ZJ

  這樣配置後,會在minion主機端生成配置文件grains ,如下:

[root@irora200 salt]# cat /etc/salt/grains
city: hangzhou
hosttype:
- online
idc: ZJ

  如下圖所示,我們做了一個實驗,如果/etc/salt/minion.d/grains.conf中已經存在的自定義items ,再通過執行grains.append 或 grains.setval 去執行時,發現會以grains.conf中的為準,雖然在/etc/salt/grains中也有內容生成。而且執行grains.append操作後,/etc/salt/minion.d/grains.conf中已存在的值會覆蓋/etc/salt/grains中的重復值。即下例中deployment的值在/etc/salt/grains中的變化為datacenter1(setval操作後) --datacenter4(append操作後,並沒有變成datacenter5)。

技術分享圖片

  所以會上例中不難看出,/etc/salt/minion.d/grains.conf (或/etc/salt/minion) > /etc/salt/grains配置中的優先級。

  註:該處也適用通過分發文件到minion的/etc/salt/grains ,不過分發文件和命令執行的區別是,分發文件必須要minion端重啟salt-minion服務後才能生效。而通過grains 命令執行是立即生效的。

四、擴展Grains

  在前面我們已經了解了Grains組件的相關知識,在SaltStack案例章節中也了解了如何去使用它。雖然Grains呢個收集得到minion的各種靜態信息,但是為了滿足更加復雜應用,系統Grains能根據我們的需求去采集一些信息,例如在大批量機器中我們區分每臺機器的業務角色,這個時候我們就可以自定義一個Grains,讓Minion通過外部數據(CMDB)去采集自己的業務匯報給Master。在大規模的配置中我們就可以利用這個Grains去更加方便地管理配置各個角色的設備。

4.1、理解擴展Grains流程

  首先我們了解擴展Grains流程。第1步,我們需要在Master上編寫一個Python腳本。這個腳本的主要內容就是去定義如何收集你想要的信息。在腳本的最後把采集到的各種信息返回。第2步,需要把這個腳本sync同步到所有的Minions上。如果你采用前面章節使用的靜態文件Grains同步方式,接下來我們重啟Minions服務。因為sync同步Griains腳本的時候Minion就會去采集刷新Grains。所以我們這裏就不需要重啟Minions服務就可以收集到最新的Grains值了。

下面我們來看一個例子:

[root@salt-master-1 ~]# cat /srv/salt/_grains/example.py
#!/usr/bin/env python
def grains():
    local = {}
    test = { key1: value1, key2: value2, key3: value3 }
    local[list] = [1,2,3,4]
    local[string] = str
    local[dict] = test
    return local

  下面我們把這個腳本同步到minion上去:

[root@salt-master-1 salt]# salt ‘salt-minion-1‘ saltutil.sync_grains

  然後我們可以去Minion上查看這個腳本,這個腳本會同步到Minion配置文件裏面定義的cachedir目錄extmods/grains下:

[root@salt-master-1 salt]# salt ‘salt-minion-1‘ cmd.run ‘ls /var/cache/salt/minion/extmods/grains/‘

  如果你想在Master上查看使用腳本定義的Grains信息,可以通過如下命令:

[root@salt-master-1 salt]# salt ‘salt-minion-1‘ grains.item list string dict

4.2、擴展Grains案例

  下面我們通過一個我曾經在實際工作中使用的自定義Grains案例吧。下面案例的內容可能對大家工作中沒多大影響。這裏引入這個案例只是為了大家能更好低理解擴展Grains的流程:

cat /srv/salt/_grains/get_time.py
#!/usr/bin/python
#coding: utf-8
from datetime import datetime
def get_server_time():
  grains = {}
  grains[server_time] = datetime.now().strftime(%Y-%m-%d %H:%M:%S)
  return grains
# 使用sync_grains命令同步腳本到minion主機上去
salt * saltutil.sync_grains
salt * grains.item server_time

  執行同步命令後,自定義腳本會上傳到minion的/var/cache/salt/minion/extmods/grains目錄下。

五、總結

  1. grains組件在saltstack中是一個非常重要的組件,我們執行的時候主機的正則匹配,主機端信息的獲取等都會用到該組件 。不過grains也有自身的局限性,就是主要存儲靜態數據,後面還會提到另一個組件pillar ,兩者可以做一個很好的互補;
  2. 能過了解grains三個自定義方式的優化級配置,我們可以根據需要定義在哪一個文件中指定什麽信息;
  3. 在/srv/salt/_grains目錄下的自定義腳本,在執行完成後,強烈建議移到一個bak目錄下。使該目錄下是沒有文件,並且再執行一次salt ‘*‘ saltutil.sync_grains操作。使minion主機上自定義模塊目錄是幹凈的,這樣做的好處是可以避免和另外兩個文件有配置沖突,也避免腳本之間有重復的名字定義,造成取回的結果不對。

《SaltStack技術入門與實踐》—— Grains