【问题标题】:Ansible role of duplicate works for the absolute parameters only重复的 Ansible 角色仅适用于绝对参数
【发布时间】:2018-10-31 18:00:37
【问题描述】:

我有这样的剧本

test_playbook/
├── dep_test.yaml
├── my_hosts_file
└── roles
    ├── common
    │   └── vars
    │       └── main.yaml
    ├── dep_test
    │   ├── meta
    │   │   └── main.yaml
    │   └── tasks
    │       └── main.yaml
    ├── dep_test_a
    │   └── tasks
    │       └── main.yaml
    └── dep_test_b
        ├── meta
        │   └── main.yaml
        └── tasks
            └── main.yaml

文件内容如下。

dep_test.yaml

- hosts: my_host
  gather_facts: no
  roles:
      - common
      - dep_test

my_hosts_file

[my_host]
localhost

roles/common/vars/main.yaml

python_version: "3"

roles/dep_test/tasks/main.yaml

- name: debug test
  debug:
      msg: test debug

roles/dep_test/meta/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"]

roles/dep_test_a/tasks/main.yaml

- name: Dep test a
  debug:
      msg: "Dependency test a called with {{ pyenv_versions }}"

roles/dep_test_b/tasks/main.yaml

- name: Dep test b
  debug:
      msg: "Dependency test b called with {{ python_versions }}"

roles/dep_test_b/meta/main.yaml

dependencies:
    - role: dep_test_a
#     pyenv_versions: "{{ python_versions }}"
      pyenv_versions: ["3"]

当我将参数作为["3"] 传递时,它工作正常并应用Role Duplication and Execution

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"] 更改为使用变量形式 common/vars/main.yamlpython_version 时,它会失败 Duplication rule 并使用重复的参数执行相同的角色。

修改后的代码是

roles/dep_test/meta/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"]

roles/dep_test_b/meta/main.yaml

dependencies:
    - role: dep_test_a
      pyenv_versions: "{{ python_versions }}"
#     pyenv_versions: ["3"]

Playbook 执行输出。

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

角色dep_test_a 使用相同的参数[u'3'] 调用了2 次​​p>

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

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

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

【问题讨论】:

  • @techraf,如果您检查行为,角色 a 在设置变量时运行两次,但在值被硬编码时不会运行。我只能考虑在调用角色之前不匹配的变量,因此角色与预先匹配的值不匹配,这就是它重新运行角色的原因。
  • @techraf 很抱歉造成混乱,我用问题更新了我的帖子。

标签: ansible


【解决方案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 }}"

【讨论】:

  • 感谢您的回答,如果我们提到依赖关系并在主要剧本中添加该角色(如您所做的那样),有什么区别吗?
  • 不,不会有区别。
猜你喜欢
  • 2012-02-03
  • 1970-01-01
  • 2014-12-07
  • 2016-05-30
  • 2021-03-19
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 2019-10-19
相关资源
最近更新 更多