提问人:Jordan Borisov 提问时间:1/26/2017 最后编辑:CommunityJordan Borisov 更新时间:10/5/2023 访问量:49200
在 ansible 中计算动态变量名称
Evaluate dynamic variable name in ansible
问:
我有 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') }}"
答:
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
评论