You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用ec2_ami_find模块筛选早于X天/月的EC2 AMI?

如何筛选早于指定天数/月数的EC2 AMI

当然可以实现这个需求!你的现有配置没能正常工作,主要是几个容易踩的小问题导致的,我来帮你拆解并给出修正方案:

问题出在哪?

  1. 日期格式不兼容:EC2 AMI的creationDate是ISO8601格式(比如2023-10-05T14:23:12.000Z),但你用date +%Y%m%d%H%M%S生成的是纯数字串(比如20230408123456),这两种格式没法直接做大小比较,导致筛选逻辑完全不起作用。
  2. json_query语法错了:在json_query的表达式里,不需要再套一层Jinja2的{{ }},直接引用变量就行。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:50:00