在ansible中遍历字典列表时,有什么方法可以删除特定的键值?

时间:2020-08-27 14:11:21

标签: ansible

我有以下CSV格式的数据

instance_id,Tag1,Tag2,Tag3,Tag4
instance1,否,测试,精简版,否
instance2,是,开发,企业,是

当我使用以下方法读取此数据时:-

    read_csv:  
       path: <csv path>  
    register: instance
  - debug: var=instance

调试后,我得到:

    ok: [localhost] => {  
        "instance": {  
            "changed": false,  
            "dict": {},  
            "failed": false,  
            "list": [  
                {  
                    "Tag1": "no",  
                    "Tag2": "test",  
                    "Tag3": "lite",  
                    "Tag4": "no",  
                    "instance_id": "instance1"  
                },  
                {  
                    "Tag1": "yes",  
                    "Tag2": "dev",  
                    "Tag3": "enterprise",  
                    "Tag4": "yes",  
                    "instance_id": "instance2"  
                }  
            ]  
       }  
   }  

现在,我想在相应的instance1和instance2上更新Tag1,Tag2,Tag3,Tag4。 我尝试过:-

  ec2_tag:
     region: us-west-1
     resource: "{{ instances.instance_id }}"
     state: present
     tags: "{{ instance.list[0] }}"


  loop: "{{ instance.list }}"
  loop_control:
         loop_var: instances

我得到了期望的结果,但是我也得到了instance_id作为标签。参见下面的示例

我的AWS控制台上的instance1的标签为:
标记1:否
Tag2:测试
Tag3:精简版
Tag4:否
instance_id:instance1 {我不想将此作为我的标签的标签}

类似地,例如instance2,我得到了各自的标签:
标记1:是
Tag2:dev
标记3:企业
Tag4:是的
instance_id:instance2 {我不希望它作为我附加到实例的标签}

1 个答案:

答案 0 :(得分:2)

您可以基于使用selectattr / rejectattr jinja2 builtin filters对其中一个属性进行的测试来跳过字典元素列表,如以下剧本所示。请注意,在一个简单的示例中,我使用了与rejectattr相等的方法,但是您可以使用所需的任何其他测试(请参见jinja2 builtin testsansible specific ones)并切换到使用{如果更方便,则使用相同的语法。

selectattr

给出:

---
- hosts: localhost
  gather_facts: false
  
  vars:
    my_csv:
      - field1: a
        field2: b
        field3: c
      - field1: d
        field2: value to skip
        field3: f
      - field1: x
        field2: y
        field3: z

  tasks:
    - name: rejectattr demo
      debug:
        msg: "{{ my_csv | rejectattr('field2', 'eq', 'value to skip') | list }}"