如何用Ansible给带指定标签的EC2实例批量创建EBS快照?
批量为带Backup标签的多EC2实例创建EBS快照
原Playbook仅能处理单个带Backup: yes标签的EC2实例,当存在多个符合条件的实例时,因硬编码取第一个实例ID(ec2_facts.instances[0].instance_id),导致仅第一个实例的/dev/sdb卷被快照。以下是修改后的完整Playbook,可实现批量处理所有符合条件的实例:
- name: "take snapshots of vms with backup:yes tag" hosts: localhost tasks: - name: "Gather facts of EC2 instances with Backup:yes tag" ec2_instance_info: region: "{{ aws_region }}" aws_access_key: "{{ ACCESS_KEY }}" aws_secret_key: "{{ SECRET_ACCESS_KEY }}" filters: "tag:Backup": "yes" register: ec2_facts - name: "Create snapshot for /dev/sdb on all target EC2 instances" ec2_snapshot: region: "{{ aws_region }}" aws_access_key: "{{ ACCESS_KEY }}" aws_secret_key: "{{ SECRET_ACCESS_KEY }}" instance_id: "{{ item.instance_id }}" device_name: "/dev/sdb" description: "Snapshot of /dev/sdb for instance {{ item.instance_id }}" # 可选:添加快照描述便于识别 loop: "{{ ec2_facts.instances }}" when: item.block_device_mappings | selectattr('device_name', 'equalto', '/dev/sdb') | list | length > 0
关键修改说明
- 移除冗余的
set_fact步骤:无需单独提取单个实例ID,直接通过循环遍历所有符合条件的实例 - 添加
loop遍历实例列表:用loop: "{{ ec2_facts.instances }}"遍历所有带Backup: yes标签的EC2实例 - 动态引用实例ID:将
instance_id改为{{ item.instance_id }},每次循环对应一个实例的ID - 添加
when条件(推荐):检查当前实例是否挂载了/dev/sdb卷,避免因实例无对应卷而执行任务报错
可选优化建议
- 统一管理AWS凭证:避免在每个模块中重复配置
aws_access_key和aws_secret_key,可通过环境变量(AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY)、AWS本地配置文件(~/.aws/credentials)或Ansible变量文件统一管理 - 为快照添加标签:便于后续识别和管理,可在
ec2_snapshot模块中添加tags参数:tags: Backup: "yes" InstanceID: "{{ item.instance_id }}"
内容的提问来源于stack exchange,提问作者ravi teja
相关产品推荐
相关产品推荐

