Ansible文件模块notify未触发Handler服务重启问题排查
为什么Handler没被触发?
答案很直接:Ansible的notify只有在对应任务的changed状态为true时才会触发。
看你提供的任务输出,Change Permissions of the Log Purge Scheduler config File任务的结果是changed: false——这意味着Ansible检测到目标文件的所有者和组已经是crx:crx了,没有做任何实际变更。所以关联的notify: restart aem自然不会被触发。
另外你问到file模块能不能用notify——完全可以!它和其他模块一样,只有在任务产生实际变更时才会触发通知。
解决方案
根据你的需求,这里有几个可行的方案:
方案1:合并Copy与权限设置(推荐)
把copy和file任务合并成一个copy任务,直接在copy模块里指定owner和group参数。这样无论是文件内容更新,还是权限不符合要求,只要有一项变更,任务就会标记为changed,进而触发重启:
- name: Configure Audit Log Purge Scheduler with correct permissions copy: src: "Scheduler-Log-Purge.config" dest: "{{ crx_dir }}install/com.adobe.cq.audit.purge.Scheduler-LogPurge.config" owner: crx group: crx become: true notify: restart aem tags: aem
方案2:强制触发变更(仅在必要时使用)
如果你希望不管权限是否已经正确,只要执行这个任务就触发重启,可以用changed_when: true强制标记任务为变更状态:
- name: Change Permissions of the Log Purge Scheduler config File file: path: "{{ crx_dir }}install/com.adobe.cq.audit.purge.Scheduler-LogPurge.config" owner: crx group: crx become: true notify: restart aem changed_when: true tags: aem
⚠️ 注意:这种方式会导致每次运行playbook都会触发重启,可能不符合你的预期,谨慎使用。
方案3:基于Copy任务的变更触发重启
如果你只需要在文件内容更新时才重启服务,可以把notify移到copy任务上——因为当文件内容有变化时,copy任务会标记为changed,进而触发重启:
- name: Configure Audit Log Purge Scheduler copy: src: "Scheduler-Log-Purge.config" dest: "{{ crx_dir }}install/com.adobe.cq.audit.purge.Scheduler-LogPurge.config" become: true notify: restart aem tags: aem - name: Change Permissions of the Log Purge Scheduler config File file: path: "{{ crx_dir }}install/com.adobe.cq.audit.purge.Scheduler-LogPurge.config" owner: crx group: crx become: true tags: aem
补充说明
你playbook里的pause任务会强制暂停5分钟,如果不需要的话可以考虑移除,或者改成用wait_for模块检测AEM服务端口是否可用的自动化等待逻辑,这样更灵活高效。
内容的提问来源于stack exchange,提问作者Gaurav Parashar

