当剧本中定义了多个主机时如何退出 Ansible 剧本
How to exit Ansible playbook when there are multiple hosts defined in the playbook
我有一个示例 Ansible 剧本 s.yml:
- hosts: localhost
tasks:
- debug: msg="{{ var }}"
- debug: msg="Do a INFLATE"
when: var == "inflate"
- meta: end_play
when: var == "inflate"
- debug: msg="this is a DEFLATE"
when: var == "deflate"
- hosts: bat
tasks:
- debug: msg="{{ hostname }}"
基本上,我希望它处理两种情况:充气和放气。如果它是膨胀的,它将 运行 一些任务然后退出(end_play 所在的位置)。如果它是放气的,它会在不同的主机上做一些事情(这个例子中的 bat 有 wag-bat 和 dsg-bat)。
当我 运行 放气时:
$ ansible-playbook s.yml -e "var=deflate"
PLAY [localhost] ************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:06:50 +0000 (0:00:00.022) 0:00:00.022 ************
ok: [localhost]
TASK [debug] ****************************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:06:51 +0000 (0:00:01.032) 0:00:01.055 ************
ok: [localhost] => {
"msg": "deflate"
}
TASK [debug] ****************************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:06:51 +0000 (0:00:00.023) 0:00:01.078 ************
skipping: [localhost]
TASK [meta] *****************************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:06:51 +0000 (0:00:00.021) 0:00:01.100 ************
skipping: [localhost]
TASK [debug] ****************************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:06:51 +0000 (0:00:00.015) 0:00:01.116 ************
ok: [localhost] => {
"msg": "this is a DEFLATE"
}
PLAY [bat] ******************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:06:51 +0000 (0:00:00.040) 0:00:01.156 ************
ok: [wag-bat]
ok: [dsg-bat]
TASK [debug] ****************************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:06:53 +0000 (0:00:01.549) 0:00:02.706 ************
ok: [wag-bat] => {
"msg": "wag-bat"
}
ok: [dsg-bat] => {
"msg": "dsg-bat"
}
它跳过了 end_play 并继续执行 bat 并显示了在 /etc/ansible/host_vars/wag-bat 和 /etc/ansible/host_vars/dsg-bat 文件中定义的主机名。这就是我想要的。
但是当我运行它膨胀时:
$ ansible-playbook s.yml -e "var=inflate"
PLAY [localhost] ************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:11:55 +0000 (0:00:00.021) 0:00:00.021 ************
ok: [localhost]
TASK [debug] ****************************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:11:56 +0000 (0:00:01.017) 0:00:01.039 ************
ok: [localhost] => {
"msg": "inflate"
}
TASK [debug] ****************************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:11:56 +0000 (0:00:00.022) 0:00:01.062 ************
ok: [localhost] => {
"msg": "Do a INFLATE"
}
TASK [meta] *****************************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:11:56 +0000 (0:00:00.023) 0:00:01.085 ************
PLAY [bat] ******************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:11:56 +0000 (0:00:00.018) 0:00:01.103 ************
ok: [dsg-bat]
ok: [wag-bat]
TASK [debug] ****************************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:11:58 +0000 (0:00:02.131) 0:00:03.234 ************
ok: [wag-bat] => {
"msg": "wag-bat"
}
ok: [dsg-bat] => {
"msg": "dsg-bat"
}
好像是通过了end_play,但是并没有退出playbook的执行,而是继续bat。如果我从剧本中删除 - hosts: bat
部分,它将停在 end_play 处进行膨胀。
如果有办法让它停在 end_play 处进行充气?我确实需要 - hosts: bat
来处理放气部分。我尝试使用 include_tasks 来处理放气部分,但我无法在子剧本中定义 -hosts bat
。
@larsks 建议使用 block
并且它按预期工作。谢谢!
我有一个示例 Ansible 剧本 s.yml:
- hosts: localhost
tasks:
- debug: msg="{{ var }}"
- debug: msg="Do a INFLATE"
when: var == "inflate"
- meta: end_play
when: var == "inflate"
- debug: msg="this is a DEFLATE"
when: var == "deflate"
- hosts: bat
tasks:
- debug: msg="{{ hostname }}"
基本上,我希望它处理两种情况:充气和放气。如果它是膨胀的,它将 运行 一些任务然后退出(end_play 所在的位置)。如果它是放气的,它会在不同的主机上做一些事情(这个例子中的 bat 有 wag-bat 和 dsg-bat)。
当我 运行 放气时:
$ ansible-playbook s.yml -e "var=deflate"
PLAY [localhost] ************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:06:50 +0000 (0:00:00.022) 0:00:00.022 ************
ok: [localhost]
TASK [debug] ****************************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:06:51 +0000 (0:00:01.032) 0:00:01.055 ************
ok: [localhost] => {
"msg": "deflate"
}
TASK [debug] ****************************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:06:51 +0000 (0:00:00.023) 0:00:01.078 ************
skipping: [localhost]
TASK [meta] *****************************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:06:51 +0000 (0:00:00.021) 0:00:01.100 ************
skipping: [localhost]
TASK [debug] ****************************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:06:51 +0000 (0:00:00.015) 0:00:01.116 ************
ok: [localhost] => {
"msg": "this is a DEFLATE"
}
PLAY [bat] ******************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:06:51 +0000 (0:00:00.040) 0:00:01.156 ************
ok: [wag-bat]
ok: [dsg-bat]
TASK [debug] ****************************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:06:53 +0000 (0:00:01.549) 0:00:02.706 ************
ok: [wag-bat] => {
"msg": "wag-bat"
}
ok: [dsg-bat] => {
"msg": "dsg-bat"
}
它跳过了 end_play 并继续执行 bat 并显示了在 /etc/ansible/host_vars/wag-bat 和 /etc/ansible/host_vars/dsg-bat 文件中定义的主机名。这就是我想要的。
但是当我运行它膨胀时:
$ ansible-playbook s.yml -e "var=inflate"
PLAY [localhost] ************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:11:55 +0000 (0:00:00.021) 0:00:00.021 ************
ok: [localhost]
TASK [debug] ****************************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:11:56 +0000 (0:00:01.017) 0:00:01.039 ************
ok: [localhost] => {
"msg": "inflate"
}
TASK [debug] ****************************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:11:56 +0000 (0:00:00.022) 0:00:01.062 ************
ok: [localhost] => {
"msg": "Do a INFLATE"
}
TASK [meta] *****************************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:11:56 +0000 (0:00:00.023) 0:00:01.085 ************
PLAY [bat] ******************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:11:56 +0000 (0:00:00.018) 0:00:01.103 ************
ok: [dsg-bat]
ok: [wag-bat]
TASK [debug] ****************************************************************************************************************************************************************************************************************************
Sunday 22 May 2022 21:11:58 +0000 (0:00:02.131) 0:00:03.234 ************
ok: [wag-bat] => {
"msg": "wag-bat"
}
ok: [dsg-bat] => {
"msg": "dsg-bat"
}
好像是通过了end_play,但是并没有退出playbook的执行,而是继续bat。如果我从剧本中删除 - hosts: bat
部分,它将停在 end_play 处进行膨胀。
如果有办法让它停在 end_play 处进行充气?我确实需要 - hosts: bat
来处理放气部分。我尝试使用 include_tasks 来处理放气部分,但我无法在子剧本中定义 -hosts bat
。
@larsks 建议使用 block
并且它按预期工作。谢谢!