【问题标题】:Ansible - Map an array of objects to a different array of objectsAnsible - 将对象数组映射到不同的对象数组
【发布时间】:2018-05-31 15:33:29
【问题描述】:

有没有办法将 Ansible Playbook 中的对象数组映射到不同的对象数组?假设我们有一个源数组:

arr:
  - value: a
  - value: b
  - value: c

我们想要的是根据第一个数组中的对象得到一个不同的数组,比方说:

arr2:
  - const: 1
    var: a
  - const: 1
    var: b
  - const: 1
    var: c

这可以通过以下元素模板实现:

const: 1
var: {{ value }}

有没有办法将这样的模板应用于数组中的每个元素?我没有找到合适的map 过滤器,因为lookup('template', ...) 不能在map 中使用。

【问题讨论】:

标签: ansible yaml jinja2 templating


【解决方案1】:

根据你的回答(我必须说它让我大开眼界,我找不到能表达我无限感激之情的词语)我想出了一个我认为更优雅的解决方案。

我尽量避免使用set_facts 模块,因为结果将具有相当高的优先级。我更喜欢坚持角色默认值以及主机和组库存变量。

另外,我更习惯 jinja2 模板而不是 Ansible 过滤器。

- hosts: localhost
  gather_facts: no
  vars:
    arr:
      - value: a
      - value: b
      - value: c
    arr2: "{{ lookup('template', 'template.yaml.j2') | from_yaml }}"

  tasks:
    - debug:
        var: "arr2"

template.yaml.j2 文件将包含迭代:

{% for item in arr %}
- const: 1
  var: {{ item.value }}
{% endfor %}

这为真正疯狂的变量操作打开了大门,同时保持剧本非常简单。

希望它能像帮助我一样帮助别人!

【讨论】:

    【解决方案2】:

    正如 Konstantin Suvorov 在评论中提到的,它可以使用递归数组构建来完成。我就是这样做的:

    #role test
    ---
    - hosts: localhost
      gather_facts: no
      vars:
        arr:
          - value: a
          - value: b
          - value: c
    
      tasks:
        - set_fact:
            arr2: "{{ (arr2 | default([])) + [ lookup('template', 'template.yaml.j2') | from_yaml ] }}"
          with_items: "{{ arr }}"
        - debug:
            msg: "{{ arr2 }}"
    
    
    #template.yaml.j2
    const: 1
    var: {{ item.value }}
    

    【讨论】:

      猜你喜欢
      • 2022-11-24
      • 2021-04-18
      • 1970-01-01
      • 2020-03-19
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      相关资源
      最近更新 更多