Ansible Playbook:把重复操作写成可检查的任务

阿远
2026-10-29 / 0 评论 / 1 阅读 / 正在检测是否收录...

学习自动化时,能重复执行而不反复制造变化,比把所有命令放进一个大脚本更重要。本篇梳理任务、模板与 Handler 的关系。

学习整理:2026-10-29。以下命令、地址和账号均为课程实验示例,按实际环境替换;涉及安装、覆盖配置或服务启停的操作先在隔离环境练习,不代表本站已经实施。

一、Playbook

- name: Configure web servers
  hosts: web
  become: true
  tasks:
    - name: Install nginx
      ansible.builtin.dnf:
        name: nginx
        state: present
    - name: Deploy configuration
      ansible.builtin.template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
        owner: root
        group: root
        mode: "0644"
        validate: "/usr/sbin/nginx -t -c %s"
      notify: Reload nginx
    - name: Ensure nginx is running
      ansible.builtin.systemd_service:
        name: nginx
        enabled: true
        state: started
  handlers:
    - name: Reload nginx
      ansible.builtin.systemd_service:
        name: nginx
        state: reloaded

二、幂等性

同一个Playbook重复执行,若目标已经符合预期,应尽量不产生changed。幂等性使自动化可安全重复。

验证:

ansible-playbook -i inventory.ini site.yml --syntax-check
ansible-playbook -i inventory.ini site.yml --check --diff
ansible-playbook -i inventory.ini site.yml
ansible-playbook -i inventory.ini site.yml

Check模式不是完整模拟,某些模块或后续依赖可能与真实执行不同。

三、Role结构

roles/nginx/
├── defaults/main.yml
├── tasks/main.yml
├── handlers/main.yml
├── templates/nginx.conf.j2
├── files/
└── README.md

四、批量变更安全

  • limit先限制一台主机。
  • serial控制分批数量。
  • any_errors_fatal根据场景决定是否全局停止。
  • 配置使用validate。
  • 变更前备份。
  • 执行后做健康检查。
  • 失败有回滚Playbook。
ansible-playbook -i inventory.ini site.yml --limit ops02

我的验收重点

先说清每个组件和参数解决的问题,再在实验环境记录正常结果、错误现象与恢复步骤。配置能通过语法检查只是起点,还应验证实际功能。本文保留为学习笔记,不把计划中的多机部署或演练写成本站完成记录。

模板校验的一个边界

示例 nginx.conf.j2 必须是包含 events 和 http 等所需上下文的完整主配置,才适合用 nginx -t -c 校验。不能把单个 server 片段当成主配置。模板内容、发行版路径和依赖文件应先在实验机核对;check 模式也不能代替真实功能测试。

补齐模板与 Handler 的执行前提

Playbook 使用完整 nginx.conf.j2 时,模板必须实际存在且包含所需 events/http 上下文;若改为单个 server 片段,应设计包含它的校验主配置。notify 仅在任务 changed 时触发 Handler,通常在对应阶段结束运行,不能假设模板一写完即已重载。先 --syntax-check,再限定实验主机 --check --diff,最后真实执行两次验证幂等与 HTTP 结果。

完整模板的最小实验内容

项目根目录创建 templates/nginx.conf.j2,配合本文 site.yml 使用。仅限新的隔离实验机:该模板替换主配置,不适合直接覆盖本站 HTTPS 配置。

worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
events { worker_connections 256; }
http {
    include /etc/nginx/mime.types;
    server {
        listen 127.0.0.1:18081;
        location / { return 200 "ansible lab ok\n"; }
    }
}

目标机已有 nginx 包、标准目录、对应路径且端口空闲时才执行。启动后在目标机 curl http://127.0.0.1:18081/ 验证,不能只看 Playbook 的绿色汇总。实验前保留原主配置与服务状态,回退时恢复原配置、检查语法并重新加载。

内容复核与修订:2026-10-29。实验示例与本站运行记录分别说明;原始归档日期保留。
0

评论 (0)

取消