Ansible set_fact jinja2用于映射列表和整数

时间:2019-05-13 22:28:21

标签: ansible jinja2

我试图在Ansible中编写一个“ set_fact”语句,该语句基本上试图将一个列表值与对应的整数映射到同一项目输出变量中。我在引用附加和求值表达式以将列表值与相应值(另一个值)绑定时遇到语法错误

我已经尝试如代码片段中所示,使用带有lambda的map来映射值。基本上,“结果”采用的格式。

results = [{_ ansible_item_label = [0,item1],status = int1},{_ansible_item_label = [0,item2],status = int2},{_ansible_item_label = [0,item3],status = int3}]

- name: Matching item to values
      set_fact:
        append: "{{ append|default([]) + map(lambda x, y: x+ ':' +y, item._ansible_item_label, item.status) }}"
      with_items: "{{results|list}}"
      loop_control:
        label: "{{ item._ansible_item_label}}"
      register: append

预期数据类型:字典 预期结果:{“ item1”:“ int1”,“ item2”:“ int2”,“ item3”:“ int3”}并且,如果没有地位价值,我们将如何有效地处理它。

1 个答案:

答案 0 :(得分:0)

首先,我认为您不能在Jinja中使用带有地图的Lambda(但我会很高兴地证明是错误的)。无论如何,没有必要。如下所示,您可以使用简单的ansible表达式来实现结果。

然后,您会遇到一个实现错误:将set_fact的结果注册到您已经设置的相同var中,将覆盖内容并运行set_fact(即成功+所有其他信息)。

要处理没有状态的元素,只需使用default

这是我制作的测试剧本:

---
- name: Create dictionary from other 
  hosts: localhost

  vars:
    result:
      - _ansible_item_label:
          - 0
          - item1
        status: int1
      - _ansible_item_label:
          - 0
          - item2
        status: int2
      - _ansible_item_label:
          - 0
          - item3

  tasks:
    - name: Create other dict
      set_fact:
        append: >-
          {{
            append
            | default([])
            | combine({item._ansible_item_label.1: item.status|default('no status')})
          }}
      loop: "{{ result }}"

    - name: Show result
      debug:
        var: append

结果

PLAY [Create dictionary from other] *********************************************************

TASK [Gathering Facts] **********************************************************************
ok: [localhost]

TASK [Create other dict] ********************************************************************
ok: [localhost] => (item={'_ansible_item_label': [0, 'item1'], 'status': 'int1'})
ok: [localhost] => (item={'_ansible_item_label': [0, 'item2'], 'status': 'int2'})
ok: [localhost] => (item={'_ansible_item_label': [0, 'item3']})

TASK [Show result] **************************************************************************
ok: [localhost] => {
    "append": {
        "item1": "int1",
        "item2": "int2",
        "item3": "no status"
    }
}

PLAY RECAP **********************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0
相关问题