Ansible aws_ec2动态清单中如何使用环境变量配置过滤规则
以下三个方案均为轻量实现,不需要编写自定义动态清单脚本,也不需要维护多份环境隔离的清单文件,可按实际需求复杂度选择:
方案1:开启清单模板渲染(最小改动适配现有配置)
你写的Jinja2 lookup语法本身没有问题,不生效是因为Ansible默认关闭了inventory文件的模板渲染开关,不需要修改现有清单逻辑,只要打开这个开关即可。
临时生效可以在执行命令时注入环境变量:
ANSIBLE_INVENTORY_TEMPLATE_FILES=True ansible-inventory -i inventory/aws_ec2.yaml --graph
要长期生效就在项目根目录的ansible.cfg里添加如下配置:
[inventory] template_inventory_files = True
配置完成后你原来写的tag:Cust_code: "{{ lookup('env','CUSTOMER_CODE') }}"就能正常读取环境变量过滤主机,这个特性在Ansible 2.11及以上版本稳定支持。
方案2:通过额外变量传值(无配置兼容所有Ansible版本)
如果不想修改Ansible配置,可以直接在执行命令时把提前export的环境变量作为额外参数传入,连lookup语法都可以省掉:
- 先把清单里的filter写法简化为
tag:Cust_code: "{{ CUSTOMER_CODE }}" - 执行命令时带上
-e参数透传环境变量:
ansible-inventory -i inventory/aws_ec2.yaml --graph -e "CUSTOMER_CODE=$CUSTOMER_CODE"
日常使用可以把这个命令封装成shell alias,切换环境只要提前export对应的CUSTOMER_CODE值即可,没有额外维护成本。
方案3:自动分组替代预过滤(长期维护成本最低)
这是长期使用最省事的方案,直接利用aws_ec2插件自带的自动分组能力,不在清单加载阶段做过滤,而是按Cust_code标签自动生成主机组,执行任务时按需指定目标组即可,还能顺便把你现在维护的两份同环境清单合并成一份。
完整配置示例:
plugin: aws_ec2 regions: - cn-north-1 # 替换为你实际使用的AWS区域 # 按Cust_code标签自动生成分组,组名格式为cust_xxx keyed_groups: - key: tags.Cust_code prefix: cust # 普通主机默认用私有IP连接 compose: ansible_host: private_ip_address # 标记跳板机主机组 groups: bastion: tags.Role == 'bastion' # 单独给跳板机覆盖连接地址,使用公网IP hostvars: bastion: ansible_host: public_ip_address
配置完成后执行ansible-inventory --graph就能看到自动生成的cust_01、cust_02这类分组,执行任务时加-l cust_01参数就能筛选对应客户的主机,不需要提前设置环境变量,也不需要维护多份清单,跳板机的特殊连接配置也能在同一份清单里统一管理。
内容的提问来源于stack exchange,提问作者tepic

