如何在Ansible中按通配符筛选JSON并提取image-id列表
Ansible筛选云实例并提取image-id可行方案
以下是实现需求的具体步骤和Playbook示例:
核心逻辑说明
通过链式调用Ansible过滤器,先筛选display-name符合指定命名规则且lifecycle-state为RUNNING的实例,再提取这些实例的image-id组成列表:
- 用
selectattr结合match(严格匹配正则)筛选命名格式;若需模糊匹配包含该模式的字符串,可替换为search - 用
selectattr结合equalto筛选运行状态的实例 - 用
map提取目标字段,list转换为列表格式
完整Playbook示例
- name: 筛选目标云实例并提取image-id hosts: localhost vars: # 模拟云实例JSON数据 cloud_instances: - display-name: "Application-Sandbox-dev-01" lifecycle-state: "RUNNING" image-id: "ami-123456" - display-name: "Application-Sandbox-test-02" lifecycle-state: "STOPPED" image-id: "ami-7890ab" - display-name: "Application-Sandbox-prod-03" lifecycle-state: "RUNNING" image-id: "ami-cdefgh" - display-name: "Web-Server-Prod-01" lifecycle-state: "RUNNING" image-id: "ami-ijklmn" tasks: - name: 生成符合条件的image-id列表 set_fact: target_image_ids: >- {{ cloud_instances | selectattr('display-name', 'match', '^Application-Sandbox-.+-.+$') | selectattr('lifecycle-state', 'equalto', 'RUNNING') | map(attribute='image-id') | list }} - name: 输出结果 debug: var: target_image_ids
关键细节解释
- 正则表达式说明:
^Application-Sandbox-.+-.+$对应需求中的Application-Sandbox-*-*:^和$确保字符串严格匹配命名格式,避免匹配到包含该模式的其他字符串.+匹配至少一个任意字符,替代通配符*的作用
- 过滤器顺序:先筛选命名再筛选状态,可减少后续处理的数据量
- 格式兼容:如果你的云实例数据是通过模块(如
ec2_instance_info)获取的,直接替换cloud_instances为对应模块的返回变量即可
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

