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

Ansible:如何通过传入变量名引用顶层字典变量

Ansible动态引用顶层字典变量的正确方式

之前使用嵌套字典domain_details时,执行ansible-playbook sample.yml -f 1 -e domain_name=domain_1后,在Playbook中通过domain_details[domain_name]可以成功提取对应子字典。但将domain_1、domain_2改为顶层字典变量后,尝试用[domain_name]调用时,仅得到由变量名组成的列表(如['domain_1']),无法获取对应的字典内容。

原嵌套字典示例

domain_details:
  domain_1:
    port: 8001
    primary_machine: host_1
    secondary_machine: host_2
    domain_user: example_user
    domain_group: example_group
  domain_2:
    port: 8010
    primary_machine: host_3
    secondary_machine: host_4
    domain_user: example_user
    domain_group: example_group

修改后的顶层字典示例

domain_1:
  port: 8001
  primary_machine: host_1
  secondary_machine: host_2
  domain_user: example_user
  domain_group: example_group
domain_2:
  port: 8010
  primary_machine: host_3
  secondary_machine: host_4
  domain_user: example_user
  domain_group: example_group

问题Playbook片段及输出

- hosts: localhost
  any_errors_fatal: false
  gather_facts: false
  serial: 1

  tasks:
    - debug: 
        msg: | 
          {{ [domain_name] | type_debug }}
          {{ [domain_name] }}

执行后输出:

ok: [localhost] => {
    "msg": "list\n['domain_1']\n"
}

解决方案

要通过动态变量名获取顶层字典,需使用Ansible内置的vars字典——它存储了当前Playbook中所有可用变量。将[domain_name]替换为vars[domain_name]即可直接引用对应顶层变量。

修改后的Playbook片段

- hosts: localhost
  any_errors_fatal: false
  gather_facts: false
  serial: 1

  tasks:
    - debug: 
        msg: | 
          {{ vars[domain_name] | type_debug }}
          {{ vars[domain_name] }}

执行后输出

ok: [localhost] => {
    "msg": "dict\n{'port': 8001, 'primary_machine': 'host_1', 'secondary_machine': 'host_2', 'domain_user': 'example_user', 'domain_group': 'example_group'}\n"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 03:20:17