Ansible一键部署Nginx(默认页面显示IP、主机名、配置时间)

核心结论:通过Ansible完成控制端安装、被控端环境配置、SSH免密认证后,执行定制Playbook,可一键在目标主机部署Nginx,默认页面自动展示被控端IP、主机名和部署时间,全程无需手动干预,适配Ubuntu 24.04系统。

一、部署前提

1. 控制端环境配置(Ubuntu 24.04)

1.1 安装Ansible
# 1. 更新软件源并安装依赖
apt update && apt install -y software-properties-common

# 2. 添加Ansible专用源(获取最新版本)
add-apt-repository --yes --update ppa:ansible/ansible

# 3. 安装Ansible
apt install -y ansible

# 4. 验证安装(需显示core版本2.18+)
ansible --version
1.2 安装异常处理(网络缓慢时)

若PPA源下载慢,采用本地安装:

# 1. 浏览器下载deb包(示例版本)
# 下载地址:https://ppa.launchpadcontent.net/ansible/ansible/ubuntu/pool/main/a/ansible/
# 上传至控制端/tmp目录

# 2. 本地安装并修复依赖
dpkg -i /tmp/ansible_11.11.0-1ppa~noble_all.deb
apt --fix-broken install -y

# 3. 验证版本
ansible --version
1.3 控制端基础配置
# 1. 生成主配置文件(可选,使用默认配置也可)
ansible-config init --disabled -t all > /etc/ansible/ansible.cfg

# 2. 配置Python解释器(避免版本冲突)
echo "interpreter_python = /usr/bin/python3" >> /etc/ansible/ansible.cfg

# 3. 禁用过时警告
echo "deprecation_warnings = False" >> /etc/ansible/ansible.cfg

2. 被控端环境准备(Ubuntu 24.04)

2.1 基础配置(被控端执行)
# 1. 更新软件源
apt update

# 2. 安装SSH服务(若未安装)
apt install -y openssh-server

# 3. 允许root用户SSH登录
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
systemctl restart sshd

# 4. 关闭防火墙(或开放80端口)
ufw disable

3. SSH免密码认证配置

3.1 控制端生成密钥对
# 生成RSA密钥对(一路回车,无需设置密码)
ssh-keygen -t rsa

# 查看密钥文件(生成成功会显示id_rsa和id_rsa.pub)
ls ~/.ssh/
3.2 公钥分发(单台/批量)
(1)单台被控端分发
# 替换为被控端IP,按提示输入被控端root密码
ssh-copy-id root@10.0.0.16
(2)多台被控端批量分发(修复expect依赖)
# 1. 安装expect工具(解决"未找到命令"报错)
apt install -y expect

# 2. 创建批量分发脚本
cat > ssh_auth.sh << 'EOF'
#!/bin/bash
# 被控端IP列表(替换为实际IP)
HOST_LIST="10.0.0.16 10.0.0.19"
# 被控端root密码(替换为实际密码)
PASSWORD="你的被控端root密码"

for host in $HOST_LIST; do
  # 自动交互分发公钥
  expect -c "
  spawn ssh-copy-id -i ~/.ssh/id_rsa.pub root@$host
  expect {
    \"*yes/no*\" {send \"yes\r\"; exp_continue}
    \"*password*\" {send \"$PASSWORD\r\";}
  }
  expect eof
  "
  echo "=== 公钥分发至 $host 完成 ==="
done
EOF

# 3. 赋予执行权限并运行
chmod +x ssh_auth.sh
./ssh_auth.sh
3.3 验证免密认证
# 控制端测试连接被控端(无需输入密码即成功)
ssh root@10.0.0.16 hostname

4. 主机清单配置(批量部署用)

# 编辑Ansible主机清单文件
vim /etc/ansible/hosts

# 添加以下内容(按实际被控端IP修改)
[web_servers]
10.0.0.16  # 被控端IP1
10.0.0.19  # 被控端IP2

# 验证主机清单有效性(输出"ping": "pong"即正常)
ansible -i /etc/ansible/hosts all -m ping

二、一键部署Nginx(核心步骤)

1. 编写Playbook文件

创建deploy_nginx.yml文件,整合全流程部署逻辑:

- hosts: all  # 目标主机组(对应inventory中的[web_servers])
  remote_user: root  # 执行用户
  gather_facts: yes  # 收集主机信息(用于动态获取IP、主机名)
  tasks:
    # 1. 安装Nginx软件
    - name: 安装Nginx
      apt:
        name: nginx
        state: present
        update_cache: yes

    # 2. 生成动态默认页面(含IP、主机名、配置时间)
    - name: 生成index.html
      copy:
        content: |
          <!DOCTYPE html>
          <html>
          <head><title>Ansible部署Nginx</title></head>
          <body style="text-align: center; margin-top: 50px;">
            <h1>主机信息展示</h1>
            <p style="font-size: 18px;">主机IP: {{ ansible_default_ipv4.address }}</p>
            <p style="font-size: 18px;">主机名: {{ ansible_hostname }}</p>
            <p style="font-size: 18px;">配置时间: {{ ansible_date_time.iso8601 }}</p>
          </body>
          </html>
        dest: /var/www/html/index.html  # Nginx默认站点目录
        mode: '0644'  # 文件权限

    # 3. 移除默认站点配置(避免冲突)
    - name: 移除默认配置链接
      file:
        path: /etc/nginx/sites-enabled/default
        state: absent

    # 4. 配置自定义Nginx站点
    - name: 配置Nginx站点
      copy:
        content: |
          server {
            listen 80;
            server_name _;
            root /var/www/html;
            index index.html;
          }
        dest: /etc/nginx/conf.d/default.conf
        mode: '0644'

    # 5. 启动Nginx并设置开机自启
    - name: 启动Nginx服务
      service:
        name: nginx
        state: restarted
        enabled: yes

2. 执行一键部署

# 1. 批量部署(使用主机清单)
ansible-playbook -i /etc/ansible/hosts deploy_nginx.yml

# 2. 单台部署(直接指定IP)
ansible-playbook -i "10.0.0.16," deploy_nginx.yml

三、验证部署结果

1. 命令行验证

# 控制端执行,输出HTML内容即成功
curl http://10.0.0.16

2. 浏览器验证

打开浏览器输入被控端IP(如http://10.0.0.16),页面将显示:

  • 主机IP:被控端默认IPv4地址
  • 主机名:被控端系统主机名
  • 配置时间:部署时的ISO格式时间(如2025-12-10T15:30:00Z)

四、常见问题排查

1. 免密认证失败

  • 检查被控端~/.ssh/authorized_keys是否存在控制端公钥,文件权限需为0600
  • 重新执行ssh-copy-id root@被控端IP手动分发公钥。

2. Nginx安装失败

  • 执行ansible 10.0.0.16 -m shell -a "apt update"更新被控端软件源后重新部署。

3. 页面无法访问

  • 检查被控端80端口是否开放:ufw allow 80(Ubuntu)。
  • 查看Nginx状态:ansible 10.0.0.16 -m shell -a "systemctl status nginx"

4. 动态信息为空

  • 确保Playbook中gather_facts: yes未被禁用,禁用会导致无法收集主机信息。

五、拓展说明

  1. 兼容性调整:若被控端为Rocky/CentOS,将Playbook中的apt模块替换为yum,其他步骤不变。
  2. 端口自定义:如需修改端口,将Nginx配置中的listen 80改为目标端口(如8080),并在被控端开放对应端口。
  3. 批量管理:新增被控端时,只需在/etc/ansible/hosts中添加IP,重新执行Playbook即可批量部署。
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐