如何正确编辑/删除Ansible dict /变量中的元素?

时间:2019-01-17 15:31:06

标签: ansible jinja2

所以我有一个变量,我们将其称为“值”,并且您知道它由以下内容组成:

 "delta": "0:00:00.021861",
    "end": "2019-01-17 10:16:50.303568",
    "failed": false,
    "rc": 0,
    "start": "2019-01-17 10:16:50.281707",
    "stderr": "",
    "stderr_lines": [],
    "stdout": A, B, C, D, E, F, G"
    "stdout_lines": A, B, C, D, E, F, G"

现在,我需要编辑该变量,所以我运行了一个with_items循环,如下所示:

- set_fact:
    new_value: "{{ new_value | default([]) | union([item])}}"
    when: ...if letter is a vowel...
  with_items: "{{ value.stdout_lines }}"

然后我这样做:

- set_fact:
    value: new_value

问题是,现在它不再像以前那样是同一类型的对象,它只是一个普通的旧列表,因为我循环遍历了'.stdout_lines'

是否有办法解决此问题,以便'new_value'也具有所有以前的信息,例如:“ delta”,“ end”,“ stderr”等?

1 个答案:

答案 0 :(得分:0)

您不能编辑现有事实,但是可以根据需要设置一个新的事实。

---
- hosts: localhost
  gather_facts: no
  tasks:
    - set_fact:
        value:
           delta: '0:00:00.021861'
           end: '2019-01-17 10:16:50.303568'
           start: '2019-01-17 10:16:50.281707'
           stdout_lines: ['A', 'B', 'C', 'D', 'E', 'F', 'G']

    - set_fact:
        new_value: "{{ value.stdout_lines | select('match', '[AE]') | list }}"

    - set_fact:
        value: "{{ value | combine({'stdout_lines': new_value}) }}"

    - debug:
        msg: "{{ value }}"

在这里,我们使用combine过滤器以新值覆盖原始词典的一部分。