我们有一本剧本:
---
- name: testplaybook
hosts: 127.0.0.1
connection: local
become: yes
vars:
x: 'latest'
y: '{{x.split("-SNAPSHOT")[0]}}'
tasks:
- name: 1st debug x, y
debug:
msg: 'x={{x}}, y={{y}}'
- set_fact: x='1.0.1-SNAPSHOT'
- name: 2nd debug x, y
debug:
msg: 'x={{x}}, y={{y}}'
输出是:
TASK [1st debug x, y]
**************************************************************
task path: /var/tmp/test_ansible/testPlaybook.yml:17
ok: [127.0.0.1] => {
"msg": "x=latest, y=latest"
}
TASK [set_fact]
****************************************************************
task path: /var/tmp/test_ansible/testPlaybook.yml:20
ok: [127.0.0.1] => {"ansible_facts": {"x": "1.0.1-SNAPSHOT"}, "changed": false}
TASK [2nd debug x, y]
**********************************************************
task path: /var/tmp/test_ansible/testPlaybook.yml:21
ok: [127.0.0.1] => {
"msg": "x=1.0.1-SNAPSHOT, y=1.0.1"
}
问题是,为什么y被改变了。
何时ansible为变量赋值并在特定情况下进行重新分配?
y
的价值没有改变。 y
的值是Jinja模板表达式{{x.split("-SNAPSHOT")[0]}}
。 Ansible执行这些表达式的lazy evaluation,因此当您使用y
时会对此进行评估。由于表达式的值依赖于x
,因此如果更改x
,它将计算为新值。
您已将y
设置为字符串,即{{x.split("-SNAPSHOT")[0]}}
。
只有当您实际使用该变量时,才会发生所有解除引用。