如何将vars/main.yml中的变量替换至Ansible Inventory中?
问题根源
你遇到的核心问题是Ansible的执行顺序逻辑:Ansible会先完成inventory文件的解析,之后才会加载playbook中定义的vars_files。所以你在inventory里写的{{PACKAGE_SERVER}},在inventory解析阶段还没有被替换成实际IP,导致Ansible把这个模板字符串当作了主机名去尝试连接,自然会出现"无法解析主机名"的错误。
解决方案
针对你「在inventory和多个playbook之间共享通用配置」的需求,这里推荐两种最贴合场景的优雅解决方式:
方式1:用全局group_vars共享变量
把通用变量放到group_vars/all.yml中,Ansible在加载inventory的时候会自动读取这个文件里的变量,inventory就能直接引用它们。
修改步骤:
- 创建
group_vars目录,新建group_vars/all.yml文件,将vars/main.yml的内容迁移进去:
# group_vars/all.yml # Server internal ip BASE_SERVERIP: '192.168.10' # Package Server: Simply shares a directory with spack and packages PACKAGE_SERVER: '{{BASE_SERVERIP}}.2'
- 保留inventory文件内容不变:
[master] 192.168.10.1 ansible_connection=local [package_clients] 192.168.10.[3:29] [package_server] {{PACKAGE_SERVER}}
- 修改
site.yaml,去掉vars_files引用(变量已通过group_vars全局加载):
--- - name: Configuring package server (exports spack packages) hosts: package_server gather_facts: false tasks: - name: Printing package server name debug: msg: "PACKAGE_SERVER variable -> {{PACKAGE_SERVER}}" - name: Creating package dir file: path: /packages state: directory
方式2:配置Ansible全局加载变量文件
如果你不想移动现有变量文件,也可以修改ansible.cfg,让Ansible在inventory加载阶段就读取你的vars/main.yml:
[ssh_connection] pipelining = True control_path = /tmp/ansible-ssh-%%h-%%p-%%r [defaults] interpreter_python = python3 # 新增该行,指定inventory加载时要读取的变量文件 vars_files = ./vars/main.yml
这样inventory解析时就能拿到PACKAGE_SERVER变量的值,你的原有文件结构不需要做大改动,仅修改配置文件即可。
验证效果
执行命令ansible-playbook -i inventory site.yml --check,现在inventory里的{{PACKAGE_SERVER}}会被正确替换成192.168.10.2,任务能够正常执行。
内容的提问来源于stack exchange,提问作者iluvatar
相关产品推荐
相关产品推荐

