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

Ansible技术问询:如何获取变量内部的变量值?

解决Ansible无法获取group_vars变量的问题

让我一步步帮你排查和解决这个问题,核心问题出在group_vars的结构和任务中变量引用的方式上:

1. 修正group_vars的结构

首先,你的group_vars文件写法不符合Ansible的规范。如果你的主机组名称是mysite1,那么对应的group_vars/mysite1.yml应该直接定义该主机组的变量,而不是把mysite1作为一个列表键。

错误的原结构:

mysite1:
  - name: 'mysite1'
    docroot: '/var/www/mysite1.com'
    codebase: ''
    db_host: '192.168.1.100'
    db_user: 'myuser'
    db_pass: 'mypass'
    db_name: 'mydb'

修正后的group_vars/mysite1.yml:

name: 'mysite1'
docroot: '/var/www/mysite1.com'
codebase: ''
db_host: '192.168.1.100'
db_user: 'myuser'
db_pass: 'mypass'
db_name: 'mydb'

这样Ansible在加载主机组mysite1时,会自动把这些变量注入到该组下所有主机的变量空间中。

2. 修正playbook任务的变量引用

你原来的任务里用with_items: site_name是错误的——site_name是你从环境变量获取的主机组名称字符串,不是一个可遍历的列表,所以无法用with_items遍历它。

直接引用group_vars中定义的变量即可,修正后的任务:

---
- debug: "msg='Host site name {{ name }} db_host {{ db_host }}'"

可选:如果需要管理多站点配置

如果你原本的需求是在group_vars中维护多个站点的配置,然后根据site_name筛选,那可以调整结构为:

在group_vars/all.yml中定义所有站点的列表:

sites:
  - name: 'mysite1'
    docroot: '/var/www/mysite1.com'
    codebase: ''
    db_host: '192.168.1.100'
    db_user: 'myuser'
    db_pass: 'mypass'
    db_name: 'mydb'
  # 可以添加更多站点
  - name: 'mysite2'
    docroot: '/var/www/mysite2.com'
    db_host: '192.168.1.101'
    ...

然后任务中用selectattr筛选对应站点:

---
- debug: "msg='Host site name {{ item.name }} db_host {{ item.db_host }}'"
  with_items: "{{ sites | selectattr('name', 'equalto', site_name) | list }}"

运行验证

设置环境变量后运行playbook:

export MY_SITE=mysite1
ansible-playbook deploy.yml

这样就能正确输出对应的站点名称和数据库地址了。

内容的提问来源于stack exchange,提问作者zozo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:15:20