2017-02-22 63 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

相关问题