如何在Ansible循环中用when语句跳过已存在的AWS弹性IP创建
实现弹性IP存在性检查后再创建的Ansible Playbook
看起来你已经搞定了按指定数量创建AWS弹性IP的基础功能,现在需要加入检查逻辑,避免重复创建已经存在于本地配置文件中的IP对吧?我帮你完善了Playbook,补上了这部分关键逻辑:
完整Playbook代码
- name: 设置需要创建的弹性IP数量 set_fact: number_of_ips: 3 - name: 加载本地配置文件中的已有弹性IP列表 include_vars: file: "profiles/{{ ec2_tag_environment }}/file_with_variables" name: existing_ip_config # 可选步骤:收集AWS账号下当前已有的弹性IP,做双重验证 - name: 获取AWS中已存在的弹性IP信息 ec2_eip_info: profile: "{{ aws_profile }}" region: "{{ aws_region }}" register: existing_aws_eips - name: 合并本地配置和AWS已有的IP列表 set_fact: all_existing_eips: "{{ existing_ip_config.existing_eips + (existing_aws_eips.addresses | map(attribute='public_ip') | list) }}" - name: 循环创建弹性IP(跳过已存在的) ec2_eip: profile: "{{ aws_profile }}" region: "{{ aws_region }}" state: present reuse_existing_ip_allowed: no # 禁止复用已有IP,确保分配全新的 register: new_eip_result until: new_eip_result.public_ip not in all_existing_eips retries: "{{ number_of_ips }}" delay: 2 loop: "{{ range(number_of_ips) | list }}"
关键逻辑说明
- 本地配置加载:通过
include_vars加载对应环境的配置文件,假设你的配置文件里有一个existing_eips数组,存储着你不想重复创建的IP地址(比如已经分配给其他服务器的IP)。 - 双重IP校验:把本地配置的IP和AWS账号中已有的IP合并成一个列表,确保无论IP是记录在本地还是已经存在AWS上,都不会被重复创建。
- 循环创建+检查:
- 按照
number_of_ips指定的次数循环 - 创建IP后立即检查返回的
public_ip是否在已有列表中 - 如果重复了,就通过
until参数重试,直到拿到全新的IP reuse_existing_ip_allowed: no让AWS强制分配未使用的新IP,减少重试概率
- 按照
本地配置文件示例(file_with_variables)
# 这里存放你不想重复创建的弹性IP列表 existing_eips: - 1.2.3.4 - 5.6.7.8
这样调整后,就能完美实现你要的“存在则跳过创建”的需求啦。
内容的提问来源于stack exchange,提问作者Elieyal
相关产品推荐
相关产品推荐

