2017-02-22 62 views
1

我想弄清楚如何創建一個Ansible列表,它是將listB中的每個字符串附加到listA中的每個字符串上的結果,它將兩個字符串列表有效地相乘。如何將listB中的所有項目連接到listA中的所有項目上?

在Python中我應該這樣做:

["-".join((x, y)) for x in listA for y in listB] 

在其他語言中我倒是窩內另一個for循環。

我不能在Ansible中找到類似的東西。

我這樣做的理由是允許一個角色自動確定一個主機所在的站點。我的所有主機都至少在一個組中爲物理位置和站點類型命名(開發,分段,生產)。例如,紐約生產基地的小組將是「nyc-prod」。我需要我的劇本能夠從主機所在組的完整列表中挑選出站點名稱。

給定所有可能站點的列表,我可以將該列表與主機所在組的列表相交,並且生成的單元素列表將包含當前主機的站點。

我可以窮舉通過手寫的所有可能的網站類型組合的列表爲group_vars/allvars/main.yml的作用力,但其中包含大量網站的這個乘以出來,將不得不維持一個龐大的列表。所以我的方法是嘗試以程序化的方式從較短的物理站點列表和類型列表中構建列表。

如果我能在神社模板嵌入任意Python,我可以做這樣的事情在tasks/main.yml

# sites contains a list of all physical locations ['nyc', 'sfo', ...] 

- name: get groups 
    debug: 
    var: group_names 
    register: groups 

- name: find my site group 
    set_fact: 
    my_site: "{% site for site in {{groups}} if site in ['-'.join((x, y)) for x in {{sites}} for y in ['dev', 'stage', 'prod']] }%" 

- name: print the group 
    debug: 
    msg: "My site is {{ my_site }}" 

這顯然是不行的,但是。

有沒有人解決過這個問題?

注:我使用Ansible 2.2.1.0

回答

1

能以幾種方式可能實現。

下面是對的Jinja2模板修復(你應該使用Jinja2 syntax內而不是Python):

vars: 
    list1: 
    - list1element1 
    - list1element2 
    list2: 
    - list2element1 
    - list2element2 

tasks: 
    - set_fact: 
     list3: "{% for prefix in list1 %}{% for postfix in list2 %}{{ prefix }}-{{ postfix }} {% endfor %}{% endfor %}" 

    - debug: 
     var: list3.split(' ') 
+0

感謝您的!這有點難看,但絕對有效! – mpounsett

相關問題