Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon ec2 易变条件匹配_Amazon Ec2_Ansible_Ansible Playbook_Ansible 2.x - Fatal编程技术网

Amazon ec2 易变条件匹配

Amazon ec2 易变条件匹配,amazon-ec2,ansible,ansible-playbook,ansible-2.x,Amazon Ec2,Ansible,Ansible Playbook,Ansible 2.x,我试图从ec2库存信息列表中筛选出一部分信息。在这种情况下,匹配特定条件的子网列表: - name: Get the VPC ID ec2_vpc_subnet_facts: region: "{{ aws_region }}" register: subnet_facts - debug: "var=subnet_facts.subnets" - debug: "var={{ item }}" with_items: "{{ subnet_facts.subnets }

我试图从ec2库存信息列表中筛选出一部分信息。在这种情况下,匹配特定条件的子网列表:

- name: Get the VPC ID
  ec2_vpc_subnet_facts:
    region: "{{ aws_region }}"
  register: subnet_facts

- debug: "var=subnet_facts.subnets"

- debug: "var={{ item }}"
  with_items: "{{ subnet_facts.subnets }}"
  when: "'Public Subnet' in item.tags.Name"
  register: public_subnets
不幸的是,我得到了一个错误:

"The conditional check ''Public Subnet' in item.tags.Name' failed. The error was: error while evaluating conditional ('Public Subnet' in item.tags.Name): 'item' is undefined"
这是根据条件筛选信息列表的最佳方法吗


我查看了Ansible过滤器,但它们似乎不适合我的需要。

我遇到了完全相同的问题,我编写了一个非常小的插件来解决它。以下是该插件的代码:

from jinja2.utils import soft_unicode

'''
USAGE:
 - debug:
     msg: "{{ vpc.subnets | get_public_subnets_ids('Type','Public') }}"
'''

class FilterModule(object):
    def filters(self):
        return {
            'get_public_subnets_ids': get_public_subnets_ids,
        }

def get_public_subnets_ids(list, tag_key, tag_value):
    subnets_ids = []
    for item in list:
        for key, value in item['resource_tags'].iteritems():
            if key == tag_key and value == tag_value:
                subnets_ids.append(item['id'])

    return subnets_ids
你可以找到这个插件的详细用法
希望能对您有所帮助。

感谢您的回复和链接(我已阅读)。我唯一的问题是配置。我根据您的示例创建了一个动作插件,并在我的ansible.cfg文件中添加了'action\u plugins=~/ansible/playbooks/action\u plugins/',但我看到“模板字符串时模板错误:没有名为'get\u public\u subnets\u id'的过滤器”。我错过了什么配置步骤,以至于ansible脚本能够识别插件/函数?我发现了,我没有注意。它被定义为FilterModule,而不是ActionModule。它需要进入filter\u plugins目录,而不是action\u plugins目录