我有以下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 {我不希望它作为我附加到实例的标签}
答案 0 :(得分:2)
您可以基于使用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 }}"