Targeting -- 在SaltStack中選擇目標機器

yinchuan發表於2013-05-29

參考連結:官方文件 Targeting

Targeting

Targeting

通過客戶端的hostname,系統資訊,預定義的分組或複合條件來選擇執行命令或配置狀態的目標機器。

比如說命令salt web1 apache.signal restart只會重啟web1上的apache服務。

在State系統也類似,以下的top file只讓客戶端web1執行webserver.sls

base:
  'web1':
    - webserver

Salt目前有5種方式來選擇目標機器,靈活而強大。

  • 匹配minion id
    • 使用shell萬用字元
    • 正則(Perl風格)
    • minion列表
  • Grains
    • 可用的Grains
    • 在客戶端配置檔案中定義Grains
    • 編寫Grains
  • 節點分組
  • 複合匹配
  • 批量執行

匹配minion id

minion id

客戶端(minion)的唯一標誌符。預設值是主機的FQDN,也可以在配置檔案中修改。

每一個客戶端都需要唯一標誌符。minion第一次啟動時選擇FQDN作為標誌符。預設值可以在minion配置檔案中用id來覆蓋。

Tip

minion id和minion keys

minion id 是 minion 公/私鑰對的名字,如果修改了 minion id ,master 需要重新接受新的key,否則 minion 不能通過 master 的認證。操作和新增新的 minion 一樣。

shell萬用字元 Globbing

Salt預設使用shell風格萬用字元('*','?','[]')來匹配minion id。在State系統中的top file也一樣。

Note

使用 salt 命令時必須將'*'放在單引號中,或是用'\'轉義,不然 shell 會在 salt 之前擴充套件'*'。

匹配所有客戶端:

salt '*' test.ping

匹配所有example.net域或者example域的客戶端:

salt '*.example.net' test.ping
salt '*.example.*' test.ping

匹配example.net域中的webN客戶端(web1.example.net, web2.example.net … webN.example.net):

salt 'web?.example.net' test.ping

匹配web1web5

salt 'web[1-5]' test.ping

匹配web-xweb-yweb-z

salt 'web-[x-z]' test.ping

正規表示式 Regular Expressions

Salt可以使用Perl風格的正規表示式來匹配minion id,使用選項-E

匹配web1-prodweb1-devel

salt -E 'web1-(prod|devel)' test.ping

Statetop file,需要將匹配方式作為第一個選項。以下例子在和上面相同的客戶端上執行webserver中的內容。

base:
  'web1-(prod|devel)':
  - match: pcre
  - webserver

minion列表 Lists

最基本的,可以列出每一個minion id來指定多個目標機器,使用選項'-L'。

salt -L 'web1,web2,web3' test.ping

使用 Grains

Grains

minion啟動時收集的關於系統的靜態資訊。

需要注意的是,grainsminion啟動時載入的,在執行過程中不會發生變化,所以是靜態資料。grains中包含諸如執行的核心版本,作業系統等資訊。

grains示例

匹配所有系統是CentOS的客戶端:

salt -G 'os:CentOS' test.ping

匹配所有64位CPU的機器,並返回CPU核心數:

salt -G 'cpuarch:x86_64' grains.item num_cpus

有哪些可用的grains?

grains在客戶端上執行,收集客戶端的資訊,所有不同的客戶端可以有不同的grains。使用grains.ls模組列出目標機器上所有可用的grains的名字。

salt '*' grains.ls

grains.item列出所有grains的名字及內容。

salt '*' grains.items

在客戶端配置檔案中定義grains

內建的grains不一定滿足需求,可以在minion的配置檔案中靜態定義grains

grains:
  roles:
    - webserver
    - memcache
  deployment: datacenter4
  cabinet: 13
  cab_u: 14-15

重啟minion服務後,grains.ls就可以列出roles等自定義的grainsgrains資料不僅可以用salt命令查詢,還可以在state系統和Targeting中用來匹配目標機器。

編寫Grains

minion配置檔案中定義的grains是靜態的,不能夠動態的在minion上生成。可以用Python非常方便的寫動態的grainsminion啟動時,會執行grains包所帶的模組及自定義grains模組中的公開函式,返回的結果就是grainsgrains模組中的函式必須返回一個dict,其中keygrains的名字,value是值。

Note

這裡的動態 grains 是指 minion 啟動時動態生成,事先並不知道內容,在啟動後,這些值依然是不變的。

很明顯,自定義的grains並不是直接放在minion上,而是放在master配置檔案中定義的file_roots下的_grains目錄中。執行state.highstatesaltutil.sync_grainssaltutil.sync_all時,會將_grains中的檔案分發到客戶端上。

假定file_roots/srv/salt,增加自定義grain的操作如下:

# mkdir /srv/salt/_grains
# vim /srv/salt/_grains/custom_grain.py
    def custom_grains():
        ''' 
            only a test grain.
            you could use any Python code to generate the grains list dynamicly.
        '''
        grains = {'role' : 'LB'}
        return grains
# salt '*' saltutil.sync_grains
# salt '*' grains.item role

由於是作為模組匯入,custom_grain.py中不需要#!/usr/bin/env python行,也不需要有執行許可權。

節點組 Node Groups

Node group

masternodegroups用複合條件定義的一組minion。 複合匹配在下面的內容有詳細介紹。

nodegroups配置示例:

nodegroups:
  group1: 'L@foo.domain.com,bar.domain.com,baz.domain.com or bl*.domain.com'
  group2: 'G@os:Debian and foo.domain.com'

使用-N選項:

salt -N group1 test.ping

top file中用- match: nodegroup來指定使用節點組匹配。

base:
  group1:
    - match: nodegroup
    - webserver

複合匹配 Compound matchers

Compound matcher

用布林操作符連線的多個目標條件。

複合匹配可以用前面討論的幾種方式實現更精確的匹配。複合匹配預設使用Globbing,要使用其他匹配方式的話,需要加上型別字首字母,現在實現的字母詳細列表,請參考文件

複合匹配中也可以使用andornot操作符,比如說,下面的命令匹配主機名以webserv開始且執行Debian系統的minion,還匹配主機名滿足正則web-dc1-srv.*minion

salt -C 'webserv* and G@os:Debian or E@web-dc1-srv.*' test.ping

本例中,G表示用shell萬用字元匹配grainsE表示用正則匹配minion id。 這個例子在top file中如下:

base:
  'webserv* and G@os:Debian or E@web-dc1-srv.*':
    - match: compound
    - webserver

注意not不能用於第一個條件,需要用如下命令:

salt -C '* and not G@kernel:Darwin' test.ping

批量執行 Batch Size

在指定數量或百分比的機器上執行命令。

salt \* -b 10 test.ping

salt -G 'os:RedHat' --batch-size 25% apache.signal restart

第一條命令在所有的客戶端上執行test.ping,但同一時間只有10臺機器執行此命令,當有minion返回執行結果是,再讓下一個minion執行。 第二條命令在系統是RedHat的客戶端中重啟apache服務,但同一時間只有25%的機器執行重啟,直到所有目標機器執行完成。

Batch Size並不減少總的數量,只是限制同時執行任務的機器數量。這非常有用,比如,在負載均衡web叢集中,可以只用一條命令分批的重啟web服務。

相關文章