【问题标题】:How to access a programmatically constructed ansible variable?如何访问以编程方式构造的 ansible 变量?
【发布时间】:2022-05-02 20:30:38
【问题描述】:

我已经使用另外两个定义的 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_variable 设置为 var1_var2,而我想获取 vars/main.yml 中定义的值 即some value

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
}

【问题讨论】:

  • 即使这在技术上是可行的,但请注意,您正在创建难以阅读、测试和维护的代码!你确定你的问题不能用标准的dict/list/collection更好地解决吗?
  • @jangroth 如果我能够在任务的vars 中使用字典,我可以避免整个方法。 stackoverflow.com/questions/50477012/…

标签: ansible ansible-inventory ansible-facts


【解决方案1】:

更新答案:

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

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_fact 将其值分配给其他变量时,它不会从 vars/main.yml 中查找其值 使用 -vvv 标志运行剧本。 - set_fact: ultimate_variable: "{{ final_variable }}"
  • 现在明白了。更新答案
  • vars是全局变量的集合吗?如果是,则可能会导致问题,因为可能会在另一台主机上为某些任务定义相同的变量。
  • vars 可能是您可以访问的最高级别的全局变量,它甚至包含hostvars。通过“可以在另一台主机上为某些任务定义相同的变量”,您的意思是如果有人定义了自己的 vars?你可以在 main.yml 中定义你自己的vars 变量,它实际上是vars.vars,所以我认为它不会导致问题。尝试打印vars,你会看到它的结构。
【解决方案2】:

您也可以跳过中间变量定义:

 - include_vars: "vars/main.yml"

  - set_fact:
      variable1: "var1"
      variable2: "var2"

  - set_fact: 
      ultimate_variable: "{{ lookup('vars', variable1 ~ '_' ~ variable2) }}"

  - debug:
      var: ultimate_variable

【讨论】:

    猜你喜欢
    • 2016-06-08
    • 1970-01-01
    • 2012-10-07
    • 2015-09-03
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多