← 中文资源

简体中文版本

编写幂等的 Ansible 角色

用声明式模块替代命令式 shell,使角色在重复运行时收敛到同一状态、不产生变更。

阅读英文原文

目标

每次重跑 playbook 都报告有变更,导致在生产上不敢运行。本配方用声明式模块替代 shell 任务,仅在内容不同时才重写文件,并让 handler 只在变更时触发,随后重跑并确认 changed=0,以证明幂等;同时提醒 command/shell 任务需加 creates 或 changed_when。

步骤要点

  1. 用声明式模块替代 shell 任务。
  2. 仅在内容变化时重写文件并触发 handler。
  3. 为 command/shell 任务加条件以避免误报变更。
  4. 重跑 playbook 并确认 changed=0。
- name: Configure service
  template:
    src: service.conf.j2
    dest: /etc/app/service.conf
    mode: '0644'
  notify: restart app

排错提示

  • handler 仅在变更时触发,任务未变更则不会重启服务。
  • command 任务默认总是 changed,需加条件。
  • 幂等不等于目标状态正确。

适用边界

  • 部分操作只能用 command,难以完全幂等。
  • 不覆盖密钥管理。