【发布时间】:2020-10-30 23:01:33
【问题描述】:
假设我只想在命令行提供的标记列表中的特定标记为 NOT 时运行任务,即使指定了其他标记也是如此。其中,只有最后一个在所有情况下都能按我的预期工作:
- hosts: all
tasks:
- debug:
msg: 'not TAG (won't work if other tags specified)'
tags: not TAG
- debug:
msg: 'always, but not if TAG specified (doesn't work; always runs)'
tags: always,not TAG
- debug:
msg: 'ALWAYS, but not if TAG in ansible_run_tags'
when: "'TAG' not in ansible_run_tags"
tags: always
尝试使用不同的 CLI 选项,您会希望看到为什么我觉得这有点令人困惑:
ansible-playbook tags-test.yml -l HOST
ansible-playbook tags-test.yml -l HOST -t TAG
ansible-playbook tags-test.yml -l HOST -t OTHERTAG
问题:(a) 这是预期的行为吗? (b) 有没有更好的方法或我缺少的一些逻辑?
我很惊讶我不得不深入研究(未记录的,AFAICT)变量ansible_run_tags。
修正:建议我发布我的实际用例。我正在使用 ansible 来驱动 Debian 系列系统上的系统更新。我试图在最后通知是否需要重新启动除非提供了标签reboot,在这种情况下会导致重新启动(并等待系统恢复)。这是相关的sn-p:
- name: check and perhaps reboot
block:
- name: Check if a reboot is required
stat:
path: /var/run/reboot-required
get_md5: no
register: reboot
tags: always,reboot
- name: Alert if a reboot is required
fail:
msg: "NOTE: a reboot required to finish uppdates."
when:
- ('reboot' not in ansible_run_tags)
- reboot.stat.exists
tags: always
- name: Reboot the server
reboot:
msg: rebooting after Ansible applied system updates
when: reboot.stat.exists or ('force-reboot' in ansible_run_tags)
tags: never,reboot,force-reboot
我认为我最初的问题仍然有可取之处,但我也愿意接受完成相同功能的替代方法。
【问题讨论】:
-
标签不应该以这种方式使用。如果您提供
-t TAG,您通常希望所有标记的任务都将被执行,而不是具有“非标记”标记的任务。 -
我知道我可能会改变标签使用规则,但我希望第一个示例 (
tags: not TAG) 每次没有标签或标签的任何组合时都会运行,除了TAG是指定的。如果你愿意,我可以给你一个具体的例子,说明为什么我会觉得这很有用。 -
是的,请。因为好像是XY-problem。
-
根据实际用例进行了修改。