【问题标题】:Ansible lookup values from complex structure?来自复杂结构的 Ansible 查找值?
【发布时间】:2017-02-02 18:13:28
【问题描述】:

我正在编写一个 Ansible 剧本,我使用 ec2_vpc_subnet_facts 在 VPC 中注册有关子网的事实,例如:

- ec2_vpc_subnet_facts:
    region: "{{ ec2_region }}"
    filters:
      vpc-id: "{{ vpc.vpc.id }}"
  register: vpc_subnet_facts

因此得到一个结构,如(删除不相关的属性):

"vpc_subnet_facts": {
    "changed": false,
    "subnets": [
        {
            ...
            "id": "subnet-0bb50753",
            ...
            "tags": {
                "Name": "mytag1"
            },
            ...
        },
        {
            ...
            "id": "subnet-0bb50754",
            ...
            "tags": {
                "Name": "mytag2"
            },
            ...
        }
    ]
}

稍后在 playbook 中,创建 EC2 实例时的想法是根据 ec2modules vpc_subnet_idattribute 的标签值查找子网 ID,即让 mytag1 查找关联的子网 ID subnet-0bb50753 .

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

问候,奥拉

【问题讨论】:

    标签: amazon-web-services amazon-ec2 ansible ansible-playbook amazon-vpc


    【解决方案1】:

    selectattrjinja filter 是你的朋友:

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

    这里做了什么:从vpc_subnet_facts.subnets 中创建一个元素子集,其中tags.Name=='mytag1',取第一个元素,取id 字段。

    【讨论】:

    • | first/take first element是什么意思?是不是如果有多个属性等于“mytag1”那么取第一个
    • 在这种情况下:如果有多个子网tags.Name=='mytag1' 取第一个。即使您知道总会有一个且只有一个这样的元素,selectattr 的结果是列表类型,但您希望确切的项目访问其.id
    猜你喜欢
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    相关资源
    最近更新 更多