了解剧本中角色的可靠标记

Joe*_*ggs 4 ansible

对剧本中的角色标记是否正常工作感到困惑,如果是,那么背后的哲学。

剧本

- hosts: Test-c7-1
  roles:
    - role: test.tag
      tags: tag2
Run Code Online (Sandbox Code Playgroud)

角色/任务

---
- debug:
    msg: "task - tag1 set"
  tags: tag1

- debug:
    msg: "task - tag2 set"
  tags: tag2

- debug:
    msg: "task - always set"
  tags: always

- debug:
    msg: "task - NO TAG"
Run Code Online (Sandbox Code Playgroud)

当传入匹配的标签时,角色就会运行,任务列表中的所有内容都会执行,而不管标签如何。

匹配标签:

ansible-playbook playbook/tagtester.yml --tags "tag2"

PLAY [Test-c7-1] ********************************************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************************************************
ok: [Test-c7-1]

TASK [test.tag : debug] *************************************************************************************************************************************************************
ok: [Test-c7-1] => {
    "msg": "task - tag1 set"
}

TASK [test.tag : debug] *************************************************************************************************************************************************************
ok: [Test-c7-1] => {
    "msg": "task - tag2 set"
}

TASK [test.tag : debug] *************************************************************************************************************************************************************
ok: [Test-c7-1] => {
    "msg": "task - always set"
}

TASK [test.tag : debug] *************************************************************************************************************************************************************
ok: [Test-c7-1] => {
    "msg": "task - NO TAG"
}

PLAY RECAP **************************************************************************************************************************************************************************
Test-c7-1                  : ok=5    changed=0    unreachable=0    failed=0
Run Code Online (Sandbox Code Playgroud)

当传递不匹配的标签时,角色仍然运行,但(不匹配的)标签被传递给任务,并且只有带有该标签(或标记为“总是”)的任务才会被执行。

不匹配的标签:

 ansible-playbook playbook/tagtester.yml --tags "tag1"

PLAY [Test-c7-1] ********************************************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************************************************
ok: [Test-c7-1]

TASK [test.tag : debug] *************************************************************************************************************************************************************
ok: [Test-c7-1] => {
    "msg": "task - tag1 set"
}

TASK [test.tag : debug] *************************************************************************************************************************************************************
ok: [Test-c7-1] => {
    "msg": "task - always set"
}

PLAY RECAP **************************************************************************************************************************************************************************
Test-c7-1                  : ok=3    changed=0    unreachable=0    failed=0
Run Code Online (Sandbox Code Playgroud)

这是预期的行为吗?
并且,有没有办法在剧本中标记角色(以及任务 - include_role)以仅根据执行时传入的标记过滤该角色本身是否被执行?

tec*_*raf 5

这是预期的行为吗?

是的。

并且,有没有办法在剧本中标记角色(以及任务 - include_role)以仅根据执行时传入的标记过滤该角色本身是否被执行?

从 Ansible 2.4 版本开始,有三种使用角色的方式:

使用import_roleroles声明,Ansible 连接声明中指定的标签并执行任务。

include_role 就像一个独立的任务一样工作,即它自己观察标签。


笔记

- 同样的规则适用于when条件。

- 在 Ansible 2.4 之前include_roleimport_role现在一样工作。

- 参考静态和动态之间的差异