如何用ec2_ami_find模块筛选早于X天/月的EC2 AMI?
如何筛选早于指定天数/月数的EC2 AMI
当然可以实现这个需求!你的现有配置没能正常工作,主要是几个容易踩的小问题导致的,我来帮你拆解并给出修正方案:
问题出在哪?
- 日期格式不兼容:EC2 AMI的
creationDate是ISO8601格式(比如2023-10-05T14:23:12.000Z),但你用date +%Y%m%d%H%M%S生成的是纯数字串(比如20230408123456),这两种格式没法直接做大小比较,导致筛选逻辑完全不起作用。 - json_query语法错了:在json_query的表达式里,不需要再套一层Jinja2的
{{ }},直接引用变量就行。 - set_fact用错地方了:set_fact是用来定义变量的,不能直接写
msg输出内容,要输出得用debug模块。
修复你的现有配置(基于ec2_ami_find)
先把你的代码修正过来,解决上述问题:
- name: 获取所有自有AMI ec2_ami_find: owner: self region: us-west-1 sort: creationDate sort_order: descending register: ec2_ami - name: 计算180天前的ISO8601格式日期 set_fact: cutoff_date: "{{ ansible_date_time.iso8601 | to_datetime | subtract(days=180) | to_datetime_string('%Y-%m-%dT%H:%M:%SZ') }}" - name: 筛选早于截止日期的AMI set_fact: old_amis: "{{ ec2_ami.results | json_query('[?creationDate < `' + cutoff_date + '`]') }}" - name: 输出筛选结果 debug: msg: "{{ old_amis }}"
更推荐的方案:用官方推荐的amazon.aws.ec2_ami_info模块
要注意ec2_ami_find已经被标记为弃用了,官方现在推荐用amazon.aws.ec2_ami_info模块,它支持直接通过filters参数在AWS端完成日期筛选,不需要后续用json_query处理,更简洁高效:
- name: 获取早于180天的自有AMI amazon.aws.ec2_ami_info: owner: self region: us-west-1 filters: # 用AWS的日期筛选语法,指定早于180天前的日期 creation-date: "<{{ ansible_date_time.iso8601 | to_datetime | subtract(days=180) | to_datetime_string('%Y-%m-%d') }}" register: old_amis - name: 输出结果 debug: msg: "{{ old_amis.images }}"
额外提示
- 如果要筛选早于X个月的AMI,只需要把
subtract(days=180)改成subtract(months=6)就行(Ansible的日期过滤器支持days/months/years这类参数)。 - 用
amazon.aws.ec2_ami_info的filters直接筛选,比本地用json_query处理更高效,因为筛选逻辑在AWS服务器端就完成了,减少了本地的数据处理量。
内容的提问来源于stack exchange,提问作者machinebit
相关产品推荐
相关产品推荐

