如何将listB中的所有项目连接到listA中的所有项目?

时间:2017-02-22 21:51:16

标签: ansible jinja2 ansible-2.x ansible-template

我试图找出如何创建一个Ansible列表,该列表是将listB中的每个字符串附加到listA中的每个字符串的结果,有效地将两个字符串列表相乘。

在python中,我这样做:

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

在其他语言中,我将一个for循环嵌套在另一个语言中。

我无法在Ansible中找出与此类似的东西。

我这样做的原因是允许角色自动确定主机所在的站点。我的所有主机至少有一个以物理位置和站点类型命名的组(开发,登台,生产) 。例如,纽约生产基地的团队就是" nyc-prod"。我需要我的剧本才能从主持人所在群组的完整列表中挑选出网站名称。

给定所有可能站点的列表,我可以将该列表与主机所在的组列表相交,并且生成的单元素列表将包含当前主机的站点。

我可以通过手动将所有可能的网站类型组合的列表写入角色中的group_vars/allvars/main.yml来强制执行此操作,但是如果有大量网站,则会将其大量增加到大量必须维护的列表。所以我的方法是尝试以编程方式从更短的物理站点列表和类型列表构建列表。

如果我可以在jinja模板中嵌入任意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 个答案:

答案 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(' ')