2016-11-29 42 views
1

我有一個劇本通過使用VARS聲明的詞典生成EC2:然後登記所述IP地址爲一組,以在後面使用。Ansible字典和標籤

的字典是這樣的:

servers: 
    serv1: 
    name: tag1 
    type: t2.small 
    region: us-west-1 
    image: ami-**** 
    serv2: 
    name: tag2 
    type: t2.medium 
    region: us-east-1 
    image: ami-**** 
    serv3: 
    [...] 

我想標籤適用於這個劇本中最簡單的方法,所以我可以使用標籤創建只是其中的一些。例如,使用--tags tag1,tag3運行劇本只會啓動EC2匹配serv1和serv3。

詞典中應用的標籤似乎並不可能,我想避免這樣做乘法的任務,如:

  • Creatinge EC2
  • 註冊的相關信息
  • 獲取私有IP從以前註冊的相關信息
  • 添加主機到羣組

雖然我已經有一個工作循環的情況下我wa nt立刻創建所有的EC2,有沒有什麼辦法可以實現這一點(不依賴--extra-vars,這需要key = value)?例如,通過只保留運行EC2循環之前標記的內容來過濾字典?

+0

林不知道我明白你的問題,但你可以指定'-e',例如'-e複雜的JSON項目「{‘測試’:‘一’,‘二’]}」' – user2599522

+0

我會加一個例子,但我想避免-e使它儘可能簡單的使用它。標籤是完美的,因爲用逗號分隔的關鍵字。 – Hiruma

回答

1

我找到了一種方法,以符合我的需求,又不觸及到如果其他人可能有類似的需求,我會分享它。 我需要根據標籤來結合字典,所以我的「主」字典不會是靜態的。

變量變成了:

- serv1: 
    - name: tag1 
    type: t2.small 
    region: us-west-1 
    image: ami-**** 
- serv2: 
    - name: tag2 
    type: t2.medium 
    region: us-east-1 
    image: ami-**** 
- serv3: 
[...] 

因此不是重複我的任務,我用set_fact標籤這樣的:

- name: Combined dict 
# Declaring empty dict 
    set_fact: 
    servers: [] 
    tags: ['always'] 
- name: Add Server 1 
    set_fact: 
    servers: "{{ servers + serv1 }}" 
    tags: ['tag1'] 
- name: Add Server 2 
    set_fact: 
    servers: "{{ servers + serv2 }}" 
    tags: ['tag2'] 
[..] 

20行,而不是爲每個服務器乘任務,將字典中的變量更改爲列表,幾個標籤和所有好:)現在,如果我添加一個新的服務器,它將只需要幾行。

1

我懷疑你可以開箱即用。並不確定這是個好主意。
由於標籤用於過濾Ansible中的任務,因此您必須使用tags: always標記所有任務。

您可以自定義過濾器插件實現這一點,例如(./filter_plugins/apply_tags.py):

try: 
    from __main__ import cli 
except ImportError: 
    cli = False 

def apply_tags(src): 
    if cli: 
    tags = cli.options.tags.split(',') 
    res = {} 
    for k,v in src.iteritems(): 
     keep = True 
     if 'name' in v: 
     if v['name'] not in tags: 
      keep = False 
     if keep: 
     res[k] = v 
    return res 
    else: 
    return src 

class FilterModule(object): 

    def filters(self): 
     return { 
      'apply_tags': apply_tags 
     } 

而在你的劇本:

- debug: msg="{{ servers | apply_tags }}" 
    tags: always 
+0

'__main__'是指什麼? – pepoluan