如何从Ansible host_var字典中动态取值到Playbook变量
解决方案
方法1:直接变量插值生成指定vhost的web_dir
host_vars/dev-web中的vhosts变量会被Ansible自动加载到dev-web主机的变量空间,你可以直接用Jinja2模板语法替换域名部分:
- hosts: dev-web become: yes vars: # 针对dev1生成路径 web_dir_dev1: "/opt/abc/{{ vhosts.dev1.name }}/xyz" # 针对dev2生成路径 web_dir_dev2: "/opt/abc/{{ vhosts.dev2.name }}/xyz"
如果需要灵活切换目标vhost,可以用一个变量来控制:
- hosts: dev-web become: yes vars: target_vhost: "dev1" # 修改为dev2即可切换到xyz.com路径 web_dir: "/opt/abc/{{ vhosts[target_vhost].name }}/xyz"
当target_vhost设为dev1时,web_dir解析为/opt/abc/example.com/xyz;设为dev2时解析为/opt/abc/xyz.com/xyz。
方法2:批量生成所有vhost对应的路径
如果需要一次性处理vhosts下的所有条目,可通过set_fact结合循环自动生成变量:
- hosts: dev-web become: yes tasks: - name: 生成各vhost对应的web_dir变量 set_fact: "web_dir_{{ item.key }}": "/opt/abc/{{ item.value.name }}/xyz" loop: "{{ vhosts | dict2items }}" - name: 验证生成的变量(可选) debug: var: "{{ 'web_dir_' + item.key }}" loop: "{{ vhosts | dict2items }}"
执行后会自动生成web_dir_dev1和web_dir_dev2两个变量,分别对应各自的域名路径。
注意事项
- 确保
host_vars/dev-web文件路径和命名正确,Ansible会自动加载对应主机的host_vars文件,无需额外配置。 - 必须用双引号包裹包含变量的字符串,单引号会导致变量无法被解析。
内容的提问来源于stack exchange,提问作者maheshs
相关产品推荐
相关产品推荐

