Ansible Playbook 示例:安装并配置 Nginx

以下是一个完整的 Ansible Playbook,用于在目标主机上安装 Nginx,并配置一个简单的静态网站。

---
- name: Install and Configure Nginx
  hosts: web_servers  # 目标主机组(在 inventory 文件中定义)
  become: yes         # 使用 sudo 权限执行任务
  vars:
    nginx_port: 80    # 定义变量:Nginx 监听端口
    web_root: /var/www/html  # 网站根目录

  tasks:
    # 1. 安装 Nginx
    - name: Install Nginx
      apt:            # 如果是 CentOS/RHEL,改为 `yum` 模块
        name: nginx
        state: present
        update_cache: yes  # 更新 apt 缓存(类似 apt updatewhen: ansible_os_family == 'Debian'  # 仅适用于 Debian/Ubuntu

    - name: Install Nginx (for RedHat)
      yum:
        name: nginx
        state: present
      when: ansible_os_family == 'RedHat'  # 仅适用于 CentOS/RHEL

    # 2. 创建网站根目录
    - name: Create web root directory
      file:
        path: "{{ web_root }}"
        state: directory
        mode: '0755'  # 设置目录权限

    # 3. 部署静态网页(示例)
    - name: Copy index.html
      copy:
        content: |
          <html>
            <body>
              <h1>Welcome to Ansible-Managed Nginx!</h1>
            </body>
          </html>
        dest: "{{ web_root }}/index.html"
        mode: '0644'  # 设置文件权限

    # 4. 配置 Nginx(使用模板)
    - name: Configure Nginx
      template:
        src: nginx.conf.j2  # Jinja2 模板文件
        dest: /etc/nginx/nginx.conf
        mode: '0644'
      notify: Restart Nginx  # 触发 Handler(配置文件变更后重启 Nginx)

    # 5. 启动并启用 Nginx 服务
    - name: Ensure Nginx is running and enabled
      service:
        name: nginx
        state: started
        enabled: yes  # 开机自启

  handlers:
    # 定义 Handler:当 Nginx 配置变更时触发重启
    - name: Restart Nginx
      service:
        name: nginx
        state: restarted

关键代码解析

1. Playbook 结构

  • hosts: web_servers
    指定目标主机组(需在 inventory 文件中定义,例如 [web_servers])。
  • become: yes
    使用 sudo 权限执行任务(等同于 ansible-playbook -b)。

2. 变量定义(vars

  • nginx_portweb_root 是自定义变量,可以在 Playbook 中复用,方便后续修改。

3. 任务分解(tasks

  • 任务1:安装 Nginx
    • 使用 apt(Debian/Ubuntu)或 yum(CentOS/RHEL)模块安装 Nginx。
    • when 条件判断操作系统类型,实现多平台兼容。
  • 任务2:创建网站目录
    • 使用 file 模块创建目录,并设置权限为 755
  • 任务3:部署静态网页
    • 使用 copy 模块直接生成一个简单的 index.html 文件。
  • 任务4:配置 Nginx
    • 使用 template 模块动态生成配置文件(需提前准备 nginx.conf.j2 模板文件)。
  • 任务5:启动服务
    • 使用 service 模块启动 Nginx 并设置开机自启。

4. Handler(handlers

  • Restart Nginx
    当 Nginx 配置文件变更时(由 template 任务触发 notify),自动重启服务。
    注意:Handler 只在任务实际变更时触发,不会重复执行。

配套文件:nginx.conf.j2(Jinja2 模板)

创建一个模板文件 nginx.conf.j2,内容如下(动态插入变量 nginx_portweb_root):

user www-data;
worker_processes auto;

events {
    worker_connections 1024;
}

http {
    server {
        listen {{ nginx_port }};  # 使用变量
        root {{ web_root }};      # 使用变量

        location / {
            index index.html;
        }
    }
}

如何使用这个 Playbook?

  1. 准备 Inventory 文件
    创建 inventory.ini,定义目标主机:

    [web_servers]
    server1 ansible_host=192.168.1.100
    server2 ansible_host=192.168.1.101
  2. 运行 Playbook

    ansible-playbook -i inventory.ini deploy_nginx.yml
  3. 验证结果
    访问 http://目标服务器IP,看到 “Welcome to Ansible-Managed Nginx!” 即表示成功。


面试加分点

  • 模块化设计:将配置(如端口、路径)抽离为变量,便于维护。
  • 多平台支持:通过 when 条件适配不同 Linux 发行版。
  • 幂等性:Ansible 任务天然支持幂等(多次执行不会重复变更)。
  • Handler 机制:优雅处理服务重启,避免不必要的操作。

如果需要更复杂的配置(如 HTTPS、负载均衡),可以扩展模板文件和 Playbook 任务。

作者:liupeng  创建时间:2023-09-22 08:35
最后编辑:严锋  更新时间:2025-11-04 14:01