如何访问通过编程构造的Ansible变量的定义值?
解决Ansible动态构造变量名并获取对应值的问题
你现在遇到的问题很典型:你成功构造出了目标变量的名字字符串var1_var2,但Ansible只是把它当成普通字符串返回了,没有去解析这个名字对应的实际变量值。下面给你两种简单有效的解决办法:
方法1:通过vars字典访问
Ansible会把所有加载的变量都存储在vars这个内置字典里,你可以直接通过键名(也就是你构造的变量名字符串)来获取对应的值。修改最后一个set_fact任务即可:
- set_fact: ultimate_variable: "{{ vars[final_variable] }}"
方法2:使用vars lookup插件
Ansible的vars lookup插件专门用来动态获取变量值,用法也很直观:
- set_fact: ultimate_variable: "{{ lookup('vars', final_variable) }}"
修改后的完整Playbook示例
--- - name: Construct and get the value hosts: localhost tasks: - include_vars: "vars/main.yml" - set_fact: variable1: "var1" variable2: "var2" - set_fact: final_variable: "{{ variable1 }}_{{ variable2 }}" # 二选一即可 - set_fact: ultimate_variable: "{{ vars[final_variable] }}" # - set_fact: # ultimate_variable: "{{ lookup('vars', final_variable) }}"
验证效果
运行修改后的Playbook,你会看到ultimate_variable的值变成了some value,也就是vars/main.yml里var1_var2对应的定义值。
为什么原来的方式不行?
你之前写的{{ final_variable }},Ansible只会解析final_variable这个变量的内容——也就是你构造的字符串var1_var2,而不会自动把这个字符串当作变量名去查找对应的值。上面两种方法都是明确告诉Ansible:“去找到名字是这个字符串的变量,把它的值给我”。
内容的提问来源于stack exchange,提问作者user3086551
相关产品推荐
相关产品推荐

