我运行一个剧本,其中包含一个角色,并执行,所以它对主机文件中的第一个服务器运行一次,然后对主机文件中25%的服务器执行,最后,它对其余的服务器执行。
我想实现的是:
- 如果我运行剧本没有任何标签或
task1
,它应该在所有服务器上运行一次。 - 如果我用标签
task2
运行剧本,它会分批运行剧本(按照serial
)。
目前,它将始终分批运行。
我有以下剧本:
剧本:
- hosts: all
serial:
- 1
- "25%"
- "100%"
roles:
- playbook2
playbook2角色:
- name: task 1
shell: [do something]
tags: task1
- name: task 2
shell: [do more]
tags: task2
您可以根据标签的内容模板serial
和omit
,并使用特殊变量ansible_run_tags
。
你的serial
参数,那么应该是
serial: "{{ ['1', '25%', '100%'] if 'task2' in ansible_run_tags else omit }}"
给定剧本:
- hosts: _nodes
gather_facts: no
serial: "{{ ['1', '25%', '100%'] if 'task2' in ansible_run_tags else omit }}"
tasks:
- debug:
tags:
- task2
- debug:
tags:
- task2
当不带标签运行时,它将在三个主机上产生:
PLAY [_nodes] ***********************************************************
TASK [debug] ************************************************************
ok: [node2] =>
msg: Hello world!
ok: [node3] =>
msg: Hello world!
ok: [node1] =>
msg: Hello world!
TASK [debug] ************************************************************
ok: [node2] =>
msg: Hello world!
ok: [node3] =>
msg: Hello world!
ok: [node1] =>
msg: Hello world!
当与--tags task2
一起运行时,它将产生:
PLAY [_nodes] ***********************************************************
TASK [debug] ************************************************************
ok: [node2] =>
msg: Hello world!
TASK [debug] ************************************************************
ok: [node2] =>
msg: Hello world!
PLAY [_nodes] ***********************************************************
TASK [debug] ************************************************************
ok: [node3] =>
msg: Hello world!
TASK [debug] ************************************************************
ok: [node3] =>
msg: Hello world!
PLAY [_nodes] ***********************************************************
TASK [debug] ************************************************************
ok: [node1] =>
msg: Hello world!
TASK [debug] ************************************************************
ok: [node1] =>
msg: Hello world!