如何在Ansible INI清单中定义主机变量并通过playbook命令传值
解决方案
原生INI格式的静态Ansible清单默认不支持解析Jinja2变量,直接在主机名位置写{{is_host}}无法被Ansible识别,可通过以下方案实现动态主机名注入
方案1:流水线预渲染清单模板(最适配Azure DevOps场景)
无需调整Ansible版本和现有playbook逻辑,和现有流水线流程适配度最高:
- 把原INI清单保存为模板文件
inventory.j2,内容为:
{{is_host}} ansible_host=10.0.0.8 ansible_user=root
- 在Azure DevOps流水线的Ansible执行任务前,添加1步Shell任务,用流水线中获取到的动态主机名渲染模板生成正式清单文件:
# 先将流水线获取到的主机名赋值给IS_HOST环境变量,再执行渲染 export IS_HOST="流水线动态获取的主机名" envsubst < inventory.j2 > inventory
- 后续Ansible任务直接选择生成的
inventory作为清单文件即可,原有执行命令无需修改。
方案2:playbook内动态添加主机(无需修改清单文件)
直接在playbook开头添加预任务,把目标主机动态加载到内存清单,即使原清单文件为空也可以正常运行:
- hosts: localhost connection: local gather_facts: no tasks: - name: 注入动态目标主机 add_host: name: "{{ is_host }}" ansible_host: 10.0.0.8 ansible_user: root groups: target_servers # 原有任务直接作用于动态生成的主机组 - hosts: target_servers tasks: - name: Creating yml file in tmp directory file: path: "/tmp/ansible-playbook.yml" state: touch
执行命令无需调整,还是用原来的ansible-playbook命令传入is_host变量即可。
方案3:使用支持Jinja2解析的YAML清单
Ansible 2.10及以上版本支持直接解析带Jinja2语法的YAML格式清单,操作如下:
- 创建清单模板文件
inventory.yml.j2,内容为:
all: hosts: {{ is_host }}: ansible_host: 10.0.0.8 ansible_user: root
- 修改
ansible.cfg开启清单Jinja2解析支持:
[defaults] inventory_allow_jinja = True
- 执行playbook时直接指定该模板作为清单文件即可,无需提前渲染。
内容的提问来源于stack exchange,提问作者Muhammad Zeeshan
相关产品推荐
相关产品推荐

