如何将值分配给变量?

时间:2019-04-30 19:05:15

标签: ansible

我们来写一本剧本:

---
- 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何时将值分配给变量,并且在特定情况下会进行重新分配?

2 个答案:

答案 0 :(得分:2)

y的值未更改。 y的值是Jinja模板表达式{{x.split("-SNAPSHOT")[0]}}。 Ansible执行这些表达式的lazy evaluation,因此无论何时使用y都会对其进行评估。由于表达式的值取决于x,因此如果您更改x,它将计算为新值。

答案 1 :(得分:0)

您已将y设置为字符串,即{{x.split("-SNAPSHOT")[0]}}

仅当您实际使用变量时,所有取消引用都会发生。