如何让Ansible角色中初始化任务仅在当前角色执行时始终运行
Ansible角色初始化任务强制执行的问题与解决方案
问题背景
我将一个Ansible角色拆分为安装任务和可选的卸载任务,希望初始化工作能在这些任务之前执行。相关文件内容如下:
playbook.yml
- hosts: all roles: - role: app1 tags: app1 - role: app2 tags: app2
roles/app1/tasks/install.yml
- ansible.builtin.debug: msg='installing a...' tags: app1-install-a - ansible.builtin.debug: msg='installing b...' tags: app1-install-b
roles/app1/tasks/uninstall.yml
- ansible.builtin.debug: msg='uninstalling b...' - ansible.builtin.debug: msg='uninstalling a...'
roles/app1/tasks/main.yml
# init <----- 我希望这部分始终运行 - block: - ansible.builtin.debug: msg='validate something...' - ansible.builtin.debug: msg='prepare something...' - ansible.builtin.debug: msg='do something...' tags: app1-install, app1-uninstall # install - ansible.builtin.import_tasks: install.yml tags: app1-install # uninstall - ansible.builtin.include_tasks: uninstall.yml when: "'app1-uninstall' in ansible_run_tags" tags: app1-uninstall
需求说明
我希望初始化任务始终运行:
- 执行完整剧本、指定标签
app1、app1-install或app1-uninstall时,初始化任务都会运行; - 但执行
app1-install-a这类子标签时,初始化任务会被跳过。
我想强制这些初始化任务只要进入该角色执行就运行(即使未通过标签指定)。尝试过tags: always,但会导致其他角色如app2执行时也运行这些初始化任务,不符合需求。
结论与可行方案
经确认,该需求无法直接实现。可行的工作方案是将初始化任务复制到install.yml和uninstall.yml文件中(虽然会导致代码重复,但目前没有其他更好的办法)。
内容的提问来源于stack exchange,提问作者lonix
相关产品推荐
相关产品推荐

