Ansible:从dict中删除项

Ansible:从dict中删除项,ansible,ansible-2.x,ansible-facts,Ansible,Ansible 2.x,Ansible Facts,我试图从列表中删除该项。但我没有得到预期的结果。请帮帮我,我做错了什么 名单如下: "get_ec2_id.instances[0].tags": { "Name": "test-db-system-2", "aws:cloudformation:logical-id": "DBInstance", "aws:cloudformation:stack-id": "arn:aws:cloudformation:us-east-1:123456789012:stack

我试图从列表中删除该项。但我没有得到预期的结果。请帮帮我,我做错了什么

名单如下:

    "get_ec2_id.instances[0].tags": {
    "Name": "test-db-system-2",
    "aws:cloudformation:logical-id": "DBInstance",
    "aws:cloudformation:stack-id": "arn:aws:cloudformation:us-east-1:123456789012:stack/test-db-system-2/0115v0a0-5d44-17e8-a024-503ama4a5qd1",
    "aws:cloudformation:stack-name": "test-db-system-2",
    "dbsystem:stack": "test-db-system-2",
    "dbsystem:type": "db"
}
}

我正在尝试使用以下过滤器从列表中删除所有“aws:cloudformation”标记:

    "{{ get_ec2_id.instances[0].tags | reject('search','aws:') | list }}"
我得到以下结果:

    ok: [10.52.8.101] => {
"instances_tags": [
    "dbsystem:type",
    "dbsystem:stack",
    "Name"
]
    }
但我的预期结果如下:

      "instances_tags": [
    "dbsystem:stack": "test-db-system-2",
    "dbsystem:type": "db"
    "Name" : "test-db-system-2",
]
  }
请帮助我解决此问题。

使用以下方法:

---
- name: dictionary
  hosts: localhost
  gather_facts: False
  connection: local



  vars:
    get_ec2_id:
      instances:
        tags:
          Name: "test-db-system-2"
          "aws:cloudformation:logical-id": "DBInstance"
          "aws:cloudformation:stack-id": "arn:aws:cloudformation:us-east-1:123456789012:stack/test-db-system-2/0115v0a0-5d44-17e8-a024-503ama4a5qd1"
          "aws:cloudformation:stack-name": "test-db-system-2"
          "dbsystem:stack": "test-db-system-2"
          "dbsystem:type": "db"
    dict2: {}

  tasks:

    - name: Fact1
      set_fact:
        dict: "{{ get_ec2_id.instances.tags }}"

    - name: Debug1
      debug:
        var: dict

    - name: Fact2
      set_fact:
        dict2: "{{ dict2 | combine({item.key: item.value}) }}"
      when: "{{ item.key.find('aws:') }}"
      with_dict: "{{ dict }}"

    - name: Debug2
      debug:
        var: dict2
输出:

TASK [Debug2] ******************************************************************
ok: [localhost] => {
    "dict2": {
        "Name": "test-db-system-2", 
        "dbsystem:stack": "test-db-system-2", 
        "dbsystem:type": "db"
    }
}

更通用的解决方案,其中输入为dict,黑名单为列表:

---
- set_fact:
    blacklist:
      - bad1
      - bad2
- set_fact:
    output: {}
- name: remove blacklisted items from input
  set_fact:
    output: "{{ output | combine({item.key: item.value}) }}"
  when: item.key not in blacklist
  loop: "{{ input | dict2items }}"
使用。比如说

-设置事实:
dict2:“{{get_ec2_id.instances[0]。标记|
口述2项|
rejectattr('key','search','aws:')|
列表| items2dict}”
-调试:
变量:dict2
给予

“dict2”:{
“名称”:“test-db-system-2”,
“dbsystem:stack”:“test-db-system-2”,
“dbsystem:类型”:“db”
}

然后,下面的任务将字典转换为字典列表(如果这确实是您期望的结果)

-设置事实:
instances_标记:“{{instances_标记|默认值([]))+
[{item.key:item.value}]}”
循环:{{dict2 | dict2items}”
-调试:
var:instances\u标记
给予

“实例\u标记”:[
{
“名称”:“test-db-system-2”
},
{
“dbsystem:stack”:“test-db-system-2”
},
{
“dbsystem:类型”:“db”
}
]

这是您正在使用的系统的实际名称吗?另外,你要从一个dict开始,并将它强制到一个列表中。我不确定这可能会产生什么样的意外后果。如果从过滤器中删除
|list
,会发生什么情况?这不是一个列表! 您的期望值也是一个不正确的JSON。@smiller171如果我从过滤器中删除一个列表,我将得到下面的输出。“好的:[10.52.8.101]=>{“instances_tags”:“}”@techraf,输出是一个数组?稍微解释一下或者一些链接会更好。否则,这就像是一粒要吞下的药丸。谢谢你。除了“键”和“搜索”之外,
rejectattr
还提供了哪些其他选项?这些文档没有显示任何内容。这些参数描述得非常清楚:“通过对每个对象的指定属性应用测试来过滤对象序列,并在测试成功时拒绝这些对象”。第一个参数是字典的任何属性,第二个参数是任何测试,例如。“如果未指定测试,则属性的值将作为布尔值进行计算”。测试一下。