1. 使用Ansible Playbook配置Web服务器

任务目标

编写一个Ansible Playbook,在远程Ubuntu主机上完成Nginx的安装、站点配置、服务启动与开机自启设置。执行完毕后,通过HTTP访问应能返回自定义的欢迎页面。

环境准备

控制节点需安装Ansible(≥2.9),目标主机为Ubuntu 20.04/22.04,并确保控制节点可通过SSH密钥免密登录目标主机。目标主机IP或主机名需写入控制节点的/etc/ansible/hosts或指定inventory文件。

Playbook实现

---
- name: Configure web server with Nginx
  hosts: webservers
  become: yes
  vars:
    nginx_port: 8080
    welcome_message: "Welcome to Ansible-managed Nginx!"

  tasks:
    - name: Update apt cache
      apt:
        update_cache: yes
        cache_valid_time: 3600

    - name: Install Nginx
      apt:
        name: nginx
        state: present

    - name: Create custom index.html
      copy:
        content: |
          <html>
          <head><title>Ansible Demo</title></head>
          <body>
          <h1>{{ welcome_message }}</h1>
          <p>Server IP: {{ ansible_default_ipv4.address }}</p>
          </body>
          </html>
        dest: /var/www/html/index.html
        owner: www-data
        group: www-data
        mode: '0644'

    - name: Configure Nginx to listen on custom port
      lineinfile:
        path: /etc/nginx/sites-available/default
        regexp: '^(\s*)listen\s+80;'
        line: '\1listen {{ nginx_port }};'
        backrefs: yes

    - name: Ensure Nginx is started and enabled at boot
      service:
        name: nginx
        state: started
        enabled: yes

    - name: Open firewall port (if ufw is active)
      ufw:
        rule: allow
        port: "{{ nginx_port }}"
        proto: tcp
      when: ansible_facts.ufw.active == true

运行与验证

运行命令:

ansible-playbook -i inventory.ini nginx_playbook.yml

其中inventory.ini内容示例:

[webservers]
192.168.1.100 ansible_user=ubuntu

验证步骤:

  1. Playbook执行结束后,所有task应显示ok或changed,无failed。
  2. 在控制节点执行curl http://<目标主机IP>:8080,应返回包含Welcome to Ansible-managed Nginx!的HTML页面。
  3. 执行ssh 目标主机 "systemctl is-enabled nginx",输出应为enabled,确认开机自启已设置。

常见问题

  • 端口被占用:若8080被占用,修改vars中的nginx_port值并重新执行Playbook。
  • 防火墙未放行:若curl超时,检查目标主机防火墙状态,或手动执行sudo ufw allow 8080/tcp。
  • apt源更新慢:可预先在目标主机配置国内apt镜像源,或调整cache_valid_time减少更新频率。