首先我正在使用:
ansible --version
ansible [core 2.16.3]
config file = None
configured module search path = ['/home/ansible/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /home/ansible/.local/lib/python3.11/site-packages/ansible
ansible collection location = /home/ansible/.ansible/collections:/usr/share/ansible/collections
executable location = /home/ansible/.local/bin/ansible
python version = 3.11.6 (main, Feb 7 2024, 22:18:53) [GCC 7.3.1 20180712 (Red Hat 7.3.1-17)] (/usr/local/bin/python3.11)
jinja version = 3.1.3
libyaml = True
我有一个 Ansible 角色,我在一本剧本中的 2 个不同剧本中使用它
transfer-files.yml
,如下所示:
- name: CMS - Transfer CSV files 1
become: true
hosts: host1
roles:
- { role: transfer_files, TRANSFER_FILES_MODE: "cms" }
- name: COMMERCE - Transfer CSV files 2
become: true
hosts: host2
roles:
- { role: transfer_files, TRANSFER_FILES_MODE: "commerce" }
在我的角色中,我使用 TRANSFER_FILES_MODE 来决定执行哪些任务
cms.yml
或 commerce.yml
。在 cms.yml
我有以下任务:
...
- name: If directory is empty end the play silently
ansible.builtin.meta: end_play
when: files_found.matched < 1
...
因此,当我的游戏在
cms.yml
中完成此任务并且目录为空时,它很好地结束了第一个游戏,但它仍然执行第二个游戏。
我可以做些什么来结束一项任务中剧本中列出的所有剧本的所有执行吗?
通常不会,因为 Ansible 按顺序运行戏剧,而下一个戏剧对前一个戏剧一无所知。
但是您可以在该元任务之前设置一些事实,将其委托给
localhost
,并使用 include_role
和相应的 when
条件来检查所有后续播放中的 hostvars.localhost.<your_fact>
。