第一步:在控制节点安装 Ansible

更新系统包缓存:

sudo yum update -y

安装 EPEL 仓库(如果尚未安装):

sudo yum install -y epel-release

安装 Ansible:

sudo yum install -y ansible

验证安装:

ansible --version

你应该能看到 Ansible 的版本信息。

第二步:配置 Ansible 主机清单 (Inventory)

Ansible 需要知道它要管理哪些主机。编辑默认的主机清单文件:

sudo vim /etc/ansible/hosts

在文件中添加以下内容,定义一个名为 webservers 的主机组

[webservers]
web-server-1
web-server-2

# 如果主机使用非标准 SSH 端口或 IP,可以这样写:
# web-server-1 ansible_host=192.168.1.100 ansible_port=2222
# web-server-2 ansible_host=192.168.1.101

第三步:创建 Ansible Playbook

创建一个目录来存放 Playbook 文件:

mkdir ~/ansible-playbooks
cd ~/ansible-playbooks

创建一个名为 deploy_nginx.yml 的 Playbook 文件:

vim deploy_nginx.yml

将以下内容粘贴到 deploy_nginx.yml 文件中:

---
# 定义这个 Play 的目标主机组和连接方式
- name: Deploy Nginx and a sample page
  hosts: webservers # 应用到 'webservers' 组中的所有主机
  become: yes       # 获取 root 权限来执行任务,这对于安装软件包和管理服务是必要的
  # vars: # 可选:定义变量
  #   nginx_port: 80

  tasks:
    # 任务 1: 安装 Nginx
    - name: Install Nginx package
      yum: # 使用 yum 模块
        name: nginx  # 要安装的包名
        state: present # 确保包已安装
        # update_cache: yes # 可选:在安装前更新包缓存
      notify: restart nginx # 如果这个任务的状态是 "changed" (例如,安装了新包),则触发 "restart nginx" handler

    # 任务 2: 确保 Nginx 服务已启动并设置为开机自启
    - name: Ensure Nginx service is started and enabled
      systemd: # 使用 systemd 模块管理服务
        name: nginx
        state: started # 启动服务
        enabled: yes   # 设置开机自启

    # 任务 3: 创建一个简单的静态 HTML 页面
    - name: Create a simple index.html file
      copy: # 使用 copy 模块
        content: | # 定义文件内容
          <html>
            <head>
              <title>Ansible Deployed Page</title>
            </head>
            <body>
              <h1>Hello from {{ ansible_hostname }}!</h1>
              <p>This page was deployed using Ansible.</p>
            </body>
          </html>
        dest: /usr/share/nginx/html/index.html # 目标文件路径
        owner: nginx
        group: nginx
        mode: '0644' # 设置文件权限

    # 任务 4: 配置防火墙 (如果 firewalld 正在运行)
    - name: Allow HTTP traffic through firewall
      firewalld: # 使用 firewalld 模块
        service: http # 允许 http 服务
        permanent: yes # 永久生效
        state: enabled # 启用规则
      notify: reload firewalld # 如果规则有变化,触发 "reload firewalld" handler

  # Handlers: 定义可以被 notify 触发的任务
  handlers:
    - name: restart nginx
      systemd:
        name: nginx
        state: restarted # 重启 Nginx 服务

    - name: reload firewalld
      systemd:
        name: firewalld
        state: reloaded # 重新加载防火墙规则