Ansible按创建日期过滤AWS AMI ID及报错解决与范围查询
问题与解决方案
原Ansible代码
- name: 收集所有带有Version标签的AMI信息 amazon.aws.ec2_ami_info: filters: "tag:Version": "*" register: ec2ami_result - debug: msg: "{{ ec2ami_result }}" - set_fact: AMI_newid: "{{ ec2ami_result | json_query('images[?(@.creation_date=='2020-06-30T05:17:36.000Z')].image_id') }}"
报错信息
fatal: [localhost]: FAILED! => {"msg": "template error while templating string: expected token ',', got 'integer'. String: {{ ec2ami_result | json_query('images[?(@.creation_date=='2020-06-30T05:17:36.000Z')].image_id') }}"}
问题
- 如何修复上述报错?
- 如何获取指定日期(例如2020-05-20)之前创建的所有image_id?
修复方案
1. 修复json_query的引号冲突问题
报错核心是字符串嵌套引号语法冲突:json_query参数用单引号包裹,内部日期字符串也用了单引号,导致Ansible模板解析时识别错误。以下两种方式均可解决:
方式一:转义内部单引号
- set_fact: AMI_newid: "{{ ec2ami_result | json_query('images[?(@.creation_date==\\'2020-06-30T05:17:36.000Z\\')].image_id') }}"
方式二:外层用单引号,内部json_query参数用双引号
- set_fact: AMI_newid: '{{ ec2ami_result | json_query("images[?(@.creation_date=='2020-06-30T05:17:36.000Z')].image_id") }}'
2. 更高效的过滤方式:直接在模块中过滤
相比先拉取所有AMI再用json_query二次过滤,直接利用amazon.aws.ec2_ami_info模块的filters参数过滤,能减少数据传输量,效率更高:
获取指定时间点创建的AMI
- name: 收集指定时间创建的带Version标签的AMI信息 amazon.aws.ec2_ami_info: filters: "tag:Version": "*" creation-date: "2020-06-30T05:17:36.000Z" register: ec2ami_result - set_fact: AMI_newid: "{{ ec2ami_result.images | map(attribute='image_id') | list }}"
获取指定日期之前创建的所有AMI
如果要获取2020-05-20之前创建的AMI,可使用AWS的日期范围过滤语法[*, 目标日期],表示小于等于目标日期的范围:
- name: 收集2020-05-20之前创建的带Version标签的AMI信息 amazon.aws.ec2_ami_info: filters: "tag:Version": "*" creation-date: "[*, 2020-05-20]" register: ec2ami_result - set_fact: AMI_old_ids: "{{ ec2ami_result.images | map(attribute='image_id') | list }}"
按年份批量过滤
如果需要获取某一年(比如2020年)的所有AMI,可使用通配符简化过滤规则:
- name: 收集2020年创建的带Version标签的AMI信息 amazon.aws.ec2_ami_info: filters: "tag:Version": "*" creation-date: "2020-*"
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

