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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 04:36:05