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

How do I concatenate all items from listB onto all items from listA?

我正在尝试弄清楚如何创建一个 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

可能可以通过多种方式实现。

这是 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(' ')