首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表达式不会在嵌套变量中计算。

表达式不会在嵌套变量中计算。
EN

Stack Overflow用户
提问于 2016-10-03 14:02:09
回答 1查看 720关注 0票数 0
代码语言:javascript
复制
$ ls play.d/roles/debug/*
play.d/roles/debug/tasks:
main.yml

play.d/roles/debug/vars:
main.yml
代码语言:javascript
复制
$ cat play.d/roles/debug/tasks/main.yml 
- debug: msg="{{ name }}"
- debug: msg="{{ vars[name]['test_var'] }}"
- debug: msg="{{ vars['nested_var']['test_var'] }}"
- debug: msg="{{ test_var }}"
代码语言:javascript
复制
$ cat play.d/roles/debug/vars/main.yml 
test_var: "{{ 'value-1' if cpu == 'x64' else 'value-2' }}"

nested_var:
  test_var: "{{ 'value-1' if cpu == 'x64' else 'value-2' }}"
代码语言:javascript
复制
$ cat play.d/debug.yml
- hosts: all
  gather_facts: yes
  roles:
    - debug
代码语言:javascript
复制
$ cat inv.d/inv
[all:vars]
cpu = 'x64'

[test-srv]
52.19.xxx.xxx

通过这个非常简单的设置,我希望Ansible应该评估内联条件,而不管它们的位置(顶级还是嵌套的)。然而,嵌套变量似乎成为表达式的文字字符串:

代码语言:javascript
复制
# ansible-playbook -i inv.d/inv play.d/debug.yml -e name=nested_var -l test-srv

PLAY [all] ******************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [52.19.xxx.xxx]

TASK: [debug | debug msg="{{ name }}"] **************************************** 
ok: [52.19.xxx.xxx] => {
    "msg": "nested_var"
}

TASK: [debug | debug msg="{{ vars[name]['test_var'] }}"] ********************** 
ok: [52.19.xxx.xxx] => {
    "msg": "{{'value-1' if cpu == 'x64' else 'value-2'}}"
}

TASK: [debug | debug msg="{{ vars['nested_var']['test_var'] }}"] ************** 
ok: [52.19.xxx.xxx] => {
    "msg": "{{'value-1' if cpu == 'x64' else 'value-2'}}"
}

TASK: [debug | debug msg="{{ 'value-1' if cpu == 'x64' else 'value-2' }}"] **** 
ok: [52.19.xxx.xxx] => {
    "msg": "value-1"
}

PLAY RECAP ******************************************************************** 
52.19.xxx.xxx               : ok=5    changed=0    unreachable=0    failed=0

谁做错了,我还是Ansible?有什么想法吗?

代码语言:javascript
复制
# ansible --version
ansible 1.9.2
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-03 14:54:41

我不知道您试图实现什么,但您利用了一种通过vars哈希访问变量的非法方式。

这个vars散列的特殊之处在于,Ansible模板引擎将不使用模板,而是按原样返回它的值。

对于Anble2.x,本文描述了这里

因此,在{{ vars[name]['test_var'] }}的情况下,它将首先解析name->'nested_var',但不会解析vars['nested_var']['test_var']并将其返回为文本字符串。

如果您的变量被定义为宿主事实(库存-主机/组变量、set_fact设置的动态事实),则可以访问host_vars 幻数变量 (如host_vars[inventory_hostname][dynamic_name]['subelement'] )来动态访问变量。

如果您的变量是play/角色绑定的,就像在您的例子中一样,我可以建议使用带有预定义名称的根-散列,例如:

代码语言:javascript
复制
known_name:
  nested_var: # this key name is known known in advance
    subelement: "{{ 'value-1' if cpu == 'x64' else 'value-2' }}"

在这里,您可以通过known_name[dynamic_name]['subelement']访问动态元素。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39833498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档