重复的Ansible角色仅适用于绝对参数

时间:2018-05-22 04:15:20

标签: ansible

我有这样的剧本

[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)

根据依赖规则,这应该只调用一次。

问题:为什么依赖角色在传递参数时会运行两次?

1 个答案:

答案 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 }}"