来自复杂结构的Ansible查找值?

Ola*_*der 1 amazon-ec2 amazon-web-services amazon-vpc ansible ansible-playbook

我正在开发一个Ansible playbook,我用它ec2_vpc_subnet_facts在VPC中注册有关子网的事实,如:

- ec2_vpc_subnet_facts:
    region: "{{ ec2_region }}"
    filters:
      vpc-id: "{{ vpc.vpc.id }}"
  register: vpc_subnet_facts
Run Code Online (Sandbox Code Playgroud)

从而得到一个像(删除不相关的属性)的结构:

"vpc_subnet_facts": {
    "changed": false,
    "subnets": [
        {
            ...
            "id": "subnet-0bb50753",
            ...
            "tags": {
                "Name": "mytag1"
            },
            ...
        },
        {
            ...
            "id": "subnet-0bb50754",
            ...
            "tags": {
                "Name": "mytag2"
            },
            ...
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

稍后在剧本中,当创建EC2实例时,想法是基于ec2模块vpc_subnet_id属性的标签值查找子网ID ,即mytag1查找关联的子网ID subnet-0bb50753.

我目前的方法是tag => subnet-ID使用结果创建一个字典set_facts,ec2_vpc_subnet_facts但我对替代品感兴趣.

问候,奥拉

Kon*_*rov 5

selectattr jinja filter是你的朋友:

- debug: msg="{{ (vpc_subnet_facts.subnets | selectattr('tags.Name','equalto','mytag1') | first).id }}"
Run Code Online (Sandbox Code Playgroud)

这里做了什么:从vpc_subnet_facts.subnets哪里创建元素的子集tags.Name=='mytag1',取第一个元素,取id场.