如何访问以编程方式构造的ansible变量?

如何访问以编程方式构造的ansible变量?,ansible,ansible-inventory,ansible-facts,Ansible,Ansible Inventory,Ansible Facts,我用另外两个定义的ansible变量构造了一个ansible变量。构造的变量在vars/main.yml中定义,我想访问vars/main.yml中定义的值。 vars/main.yml --- var1_var2: "some value" 现在,我构造变量 --- - name: Construct and get the value hosts: localhost tasks: - include_vars: "vars/main.yml" - set_fact:

我用另外两个定义的ansible变量构造了一个ansible变量。构造的变量在vars/main.yml中定义,我想访问vars/main.yml中定义的值。 vars/main.yml

---
var1_var2: "some value"
现在,我构造变量

---
- 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: "{{ final_variable }}"
如果我使用-vvv标志运行playbook,我可以看到
ultimate\u variable
设置为
var1\u var2
,同时我希望获得vars/main.yml中定义的值 i、 例如,
某些值

TASK [set_fact] 

ok: [localhost] => {
"ansible_facts": {
    "variable1": "var1",
    "variable2": "var2"
},
"changed": false,
"failed": false
}

TASK [set_fact] task path: /home/ubuntu/test.yml:78

ok: [localhost] => {
"ansible_facts": {
    "final_variable": "var1_var2"
},
"changed": false,
"failed": false
}

TASK [set_fact] 

ok: [localhost] => {
"ansible_facts": {
    "ultimate_variable": "var1_var2"
},
"changed": false,
"failed": false
}
最新答复:

使用查找插件进行双重替换:

ultimate_variable:“{{lookup('vars',{{final_variable}}}}}}”

剧本:

  - include_vars: "vars/main.yml"

  - set_fact:
      variable1: "var1"
      variable2: "var2"
  - set_fact:
      final_variable: "{{ variable1 }}_{{ variable2 }}"

  - set_fact: 
      ultimate_variable: "{{ lookup('vars', '{{final_variable}}') }}"

  - debug:
      var: ultimate_variable
输出:

PLAY [localhost] ****************************************************************************************************************************************************************************************************

TASK [include_vars] *************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [set_fact] *****************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [set_fact] *****************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [set_fact] *****************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ********************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "ultimate_variable": "some value"
}

PLAY RECAP **********************************************************************************************************************************************************************************************************
localhost                  : ok=5    changed=0    unreachable=0    failed=0

希望有帮助。

当我使用另一个set_事实将其值分配给其他变量时,它不会从vars/main.yml中查找其值,请使用-vvv标志运行playbook<代码>-set_事实:最终变量:“{{final_variable}}”立即理解。更新应答器
vars
全局变量集合?如果是,则可能会导致问题,因为可能在另一台主机上为某些任务定义了相同的变量。
vars
可能是您可以访问的最高级别的全局变量,它甚至包含
hostvars
。“可以在另一台主机上为某些任务定义相同的变量”,您的意思是如果有人定义了自己的
变量
?您可以在main.yml中定义自己的
vars
变量,它实际上是
vars.vars
,因此我认为它不会导致问题。尝试打印
vars
,您将看到它的结构。即使这在技术上是可行的,也要注意您正在创建的代码很难阅读、测试和维护!你确定用标准的dict/list/collection不能更好地解决你的问题吗?@jangroth如果我能在任务的
vars
中使用字典,我就可以避免整个方法。