我面临的问题非常普遍,但其他解决方案对我不起作用。正如问题所示,当我运行我的Playbook时,只有第一个通知处理程序被执行。即仅重新启动firewalld,但未获取更新的bash配置文件。
有些人建议通知链接,但我不想将两个任务合并为完全不同的目标。例如,一个任务可能是将端口添加到firewalld然后重新启动它;另一个可能是更新我的bash配置文件以显示history
命令输出的日期。
N.B。上面的代码片段不是我的完整.yml,只是其中的一部分,所以这可能会也可能不会起作用。但是,原始文件确实有效。
---
tasks
- name: add port-80 to firewalld
firewalld: zone=drop port=80/tcp permanent=true state=enabled
- name: add port-443 to firewalld
firewalld: zone=drop port=443/tcp permanent=true state=enabled
- shell: firewall-cmd --reload
notify:
- Restart firewalld
- name: Enabling time display in history
blockinfile:
dest: ~/.bash_profile
block: |
export HISTTIMEFORMAT="%d/%m/%y %T "
notify:
- Source the updated Bash profile
handlers:
- name: Restart firewalld
service: name=firewalld state=restarted
- name: Source the updated Bash profile
shell: source ~/.bash_profile
...
答案 0 :(得分:8)
最后,我在评论的帮助下找出了问题。
当且仅当状态为
changed
作为任务的结果时,才会执行通知处理程序。
我正在做的错误是尝试安装已安装的软件包。所以,状态并没有改变。
让我们看一个例子,
---
- hosts: varnish
remote_user: root
tasks:
- name: Install tree
yum: name=tree state=absent
notify:
- Do an echo
handlers:
- name: Do an echo
debug: msg="This will be printed"
...
我们将两次播放剧本。
首次运行后,我们将获得:
TASK [Install tree] ************************************************************
changed: [192.***.***.**]
RUNNING HANDLER [Do an echo] ***************************************************
ok: [192.***.***.**] => {
"msg": "This will be printed"
}
PLAY RECAP *********************************************************************
192.***.***.** : ok=1 changed=1 unreachable=0 failed=0
随着状态的改变(查看changed=1
部分),将打印调试消息。
第二次运行后,我们将得到:
TASK [Install tree] ************************************************************
ok: [192.***.***.**]
PLAY RECAP *********************************************************************
192.***.***.** : ok=0 changed=0 unreachable=0 failed=0
要注意的是处理程序与第一次运行不同,因为状态在第二次运行中没有被更改(树已经安装)。
我已将其作为答案发布,它可能有助于其他用户。