1. 使用Ansible Playbook部署Nginx Web服务器

任务目标

编写一个Ansible Playbook,在目标主机上完成Nginx的安装、启动、开机自启配置,并验证服务处于运行状态。本案例面向RHEL/CentOS系列(使用yum/dnf)与Debian/Ubuntu系列(使用apt)两种常见环境,通过变量区分包管理器行为。

环境依赖

  • 控制节点:已安装Ansible 2.9+,可通过ansible --version确认。
  • 目标主机:可访问的Linux主机,控制节点已配置SSH密钥免密登录。
  • Inventory文件:定义目标主机分组,例如web组。

Playbook实现

创建文件deploy_nginx.yml,内容如下。该Playbook通过ansible_os_family自动识别系统发行版,选择对应的包管理器执行安装,并确保Nginx服务启动且开机自启。

---
- name: Deploy Nginx web server
  hosts: web
  become: yes
  vars:
    nginx_package: "{{ 'nginx' if ansible_os_family == 'Debian' else 'nginx' }}"
    nginx_service: nginx

  tasks:
    - name: Install Nginx (Debian/Ubuntu)
      apt:
        name: "{{ nginx_package }}"
        state: present
        update_cache: yes
      when: ansible_os_family == "Debian"

    - name: Install Nginx (RedHat/CentOS)
      yum:
        name: "{{ nginx_package }}"
        state: present
      when: ansible_os_family == "RedHat"

    - name: Start Nginx and enable on boot
      service:
        name: "{{ nginx_service }}"
        state: started
        enabled: yes

    - name: Verify Nginx is running
      command: systemctl is-active nginx
      register: nginx_status
      changed_when: false
      failed_when: nginx_status.stdout != "active"

    - name: Display Nginx status
      debug:
        msg: "Nginx service status: {{ nginx_status.stdout }}"

运行方法

  1. 确保Inventory文件(如hosts.ini)中包含目标主机:
[web]
192.168.1.10
192.168.1.11
  1. 执行Playbook:
ansible-playbook -i hosts.ini deploy_nginx.yml

验证与判定标准

  • 执行结果:所有task显示为ok或changed,无failed。
  • 服务状态:最后一个task的debug输出显示Nginx service status: active。
  • 开机自启:在目标主机上执行systemctl is-enabled nginx,预期输出enabled。
  • HTTP访问:在浏览器或curl访问http://<目标主机IP>,返回Nginx默认欢迎页(HTTP 200)。

常见问题

  • 包管理器报错:若目标主机为Fedora或RHEL 9+,yum命令仍可用(符号链接至dnf),无需修改;若为openSUSE,需额外添加zypper分支。
  • 端口未开放:若目标主机启用了firewalld,需额外添加firewalld规则放行80端口,本案例未包含该操作以保持最小闭环。
  • 权限不足:become: yes要求执行用户具有sudo权限,否则会报权限错误。