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
相关产品推荐
相关产品推荐

