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

