如何解决在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 {我不希望它作为我附加到实例的标签}
解决方法
您可以基于使用selectattr
/ rejectattr
jinja2 builtin filters对其中一个属性进行的测试来跳过字典元素列表,如以下剧本所示。请注意,在一个简单的示例中,我使用了与rejectattr
相等的方法,但是您可以使用所需的任何其他测试(请参见jinja2 builtin tests和ansible 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 }}"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。