【问题标题】:How do I concatenate all items from listB onto all items from listA?如何将列表中的所有项目连接到 listA 中的所有项目?
【发布时间】:2017-02-22 21:51:15
【问题描述】:

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

【问题讨论】:

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


    【解决方案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(' ')
    

    【讨论】:

    • 谢谢!这有点难看,但绝对有效!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多