我有这样的剧本
[my_host]
localhost
文件内容如下。
dep_test.yaml
python_version: "3"
my_hosts_file
- name: debug test
debug:
msg: test debug
角色/普通/瓦尔/ main.yaml
dependencies:
- role: dep_test_a
# pyenv_versions: ["{{ python_version }}"]
pyenv_versions: ["3"]
- role: dep_test_b
# python_versions: ["{{ python_version }}"]
python_versions: ["3"]
角色/ dep_test /任务/ main.yaml
- name: Dep test a
debug:
msg: "Dependency test a called with {{ pyenv_versions }}"
角色/ dep_test /间/ main.yaml
- name: Dep test b
debug:
msg: "Dependency test b called with {{ python_versions }}"
角色/ dep_test_a /任务/ main.yaml
dependencies:
- role: dep_test_a
# pyenv_versions: "{{ python_versions }}"
pyenv_versions: ["3"]
角色/ dep_test_b /任务/ main.yaml
["3"]
角色/ dep_test_b /间/ main.yaml
ansible-playbook dep_test.yaml -i my_hosts_file -u root --ask-pass
SSH password:
PLAY [my_host] ****************************************************************************************************
TASK [dep_test_a : Dep test a] ************************************************************************************
ok: [localhost] => {
"msg": "Dependency test a called with [u'3']"
}
TASK [dep_test_b : Dep test b] ************************************************************************************
ok: [localhost] => {
"msg": "Dependency test b called with [u'3']"
}
TASK [dep_test : debug test] **************************************************************************************
ok: [localhost] => {
"msg": "test debug"
}
PLAY RECAP ********************************************************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0
当我将参数作为["3"]
传递时,它可以正常工作并应用Role Duplication and Execution
common/vars/main.yaml
当我将参数从python_version
更改为使用变量形式Duplication rule
的{{1}}时,它会使dependencies:
- role: dep_test_a
pyenv_versions: ["{{ python_version }}"]
# pyenv_versions: ["3"]
- role: dep_test_b
python_versions: ["{{ python_version }}"]
# python_versions: ["3"]
失败,并使用重复的参数执行相同的角色。
更改后的代码将是
角色/ dep_test /间/ main.yaml
dependencies:
- role: dep_test_a
pyenv_versions: "{{ python_versions }}"
# pyenv_versions: ["3"]
角色/ dep_test_b /间/ main.yaml
ansible-playbook dep_test.yaml -i my_hosts_file -u root --ask-pass
SSH password:
PLAY [my_host] ****************************************************************************************************
TASK [dep_test_a : Dep test a] ***********************************************************************************
ok: [localhost] => {
"msg": "Dependency test a called with [u'3']"
}
TASK [dep_test_a : Dep test a] ************************************************************************************
ok: [localhost] => {
"msg": "Dependency test a called with [u'3']"
}
TASK [dep_test_b : Dep test b] ************************************************************************************
ok: [localhost] => {
"msg": "Dependency test b called with [u'3']"
}
TASK [dep_test : debug test] **************************************************************************************
ok: [localhost] => {
"msg": "test debug"
}
PLAY RECAP ********************************************************************************************************
localhost : ok=4 changed=0 unreachable=0 failed=0
Playbook执行输出。
dep_test_a
角色[u'3']
使用相同的参数调用了2次TASK [dep_test_a : Dep test a] ***********************************************************************************
ok: [localhost] => {
"msg": "Dependency test a called with [u'3']"
}
TASK [dep_test_a : Dep test a] ************************************************************************************
ok: [localhost] => {
"msg": "Dependency test a called with [u'3']"
}
dep_test
一个用于dep_test_b
角色中的依赖项,另一个用于 x = decimal.Decimal(2000.0)
。
根据依赖规则,这应该只调用一次。
问题:为什么依赖角色在传递参数时会运行两次?
答案 0 :(得分:1)
问题:为什么依赖角色在传递参数时会运行两次?
答案:因为Ansible使用延迟评估,因此在使用变量之前不会触发Jinja2模板。
将变量传递给角色不被视为用法,因此它会传递并比较模板,而不是值。
您两次调用dep_test_a
角色:
- role: dep_test_a
pyenv_versions: ["{{ python_version }}"]
和
- role: dep_test_a
pyenv_versions: "{{ python_versions }}"
["{{ python_version }}"]
不等于"{{ python_versions }}"
,因此Ansible会执行两次角色。
顺便说一下,用来说明问题中行为的代码可以缩短为:
- hosts: localhost
connection: local
gather_facts: no
vars:
my_var1: 1
my_var2: 1
roles:
- role: my_role
role_param: "{{ my_var1 }}"
- role: my_role
role_param: "{{ my_var2 }}"