在 ansible 中计算动态变量名称

Evaluate dynamic variable name in ansible

提问人:Jordan Borisov 提问时间:1/26/2017 最后编辑:CommunityJordan Borisov 更新时间:10/5/2023 访问量:49200

问:

我有 vars,我放了这样的东西:

vars/main.yml
hello_port: 80
world_port: 81

在我的 ansbile 文件中,我加载了 vars

vars_files:
  - ./vars/main.yml

这是我初始化m_name的方式:

 - name: set_fact
     set_fact:
        m_name:
          - 'hello'
          - 'world'

在那之后,我有使用with_items进行迭代的任务:

 - debug:
      msg: "{{ (item + '_port') }}"
   with_items: "{{ m_name }}"

但我有作为输出

hello_port
world_port

不是他们的价值观。


好的,我发现如果我使用 debug var,它就可以工作了。但是,如果我想将此表达式作为 shell 任务中的示例,它不会对其进行评估。有没有办法评估动态创建的变量名称 - 获取值?"{{ (item + '_port') }}"

Ansible 动态变量

评论


答:

8赞 Ben Tse 1/29/2018 #1
{{ hostvars[inventory_hostname][item + '_port'] }}

http://docs.ansible.com/ansible/latest/faq.html#how-do-i-access-a-variable-name-programmatically

30赞 abc 7/22/2018 #2

https://docs.ansible.com/ansible/2.5/plugins/lookup/vars.html

- name: Show value of 'variablename'
  debug: 
    msg: "{{ lookup('vars', 'variabl' + myvar)}}"
  vars:
    variablename: hello
    myvar: ename
5赞 henry 1/26/2019 #3

我想你正在寻找:

{{ vars[item ~ '_port'] }}

评论

0赞 GKE 1/26/2019
除了答案之外,请解释为什么它会起作用。
1赞 henry 1/29/2019
我不完全知道它为什么起作用的实现,但我在模板中使用为存储在 Vault 加密文件中的不同生产阶段设置密码。password="{{ vars['password_' ~ stage] }}"
0赞 Vsevolod 3/27/2021
哇!它实际上比 lookup('vars', item ~ '_port') 更好。
0赞 Chen A. 4/29/2021
@henry我找不到任何关于.你还记得你在哪里找到它吗?我试图了解它实际上在做什么。vars[..]
3赞 John Mahowald 12/3/2021
vars 未记录在案,并且是内部实现细节。hostvars magic dict 或 vars lookup 被记录在其他答案中。
1赞 Oleg Zagrebelsky 9/8/2021 #4

我想最好的方法是使用varnames_lookup

- name: List variables that start with qz_
  debug: msg="{{ lookup('varnames', '^qz_.+')}}"

https://docs.ansible.com/ansible/latest/collections/ansible/builtin/varnames_lookup.html