1

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

在python中我会这样做:

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

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

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

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

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

group_vars/all我可以通过将所有可能的站点类型组合的列表手写到角色中或角色中来强制执行此操作vars/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

4

1 回答 1

1

大概可以通过几种方式实现。

这是 Jinja2 模板的修复(你应该使用Jinja2 语法而不是 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(' ')
于 2017-02-22T22:19:35.080 回答