Ansible一键部署Nginx(默认页面显示IP、主机名、配置时间)
·
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未被禁用,禁用会导致无法收集主机信息。
五、拓展说明
- 兼容性调整:若被控端为Rocky/CentOS,将Playbook中的
apt模块替换为yum,其他步骤不变。 - 端口自定义:如需修改端口,将Nginx配置中的
listen 80改为目标端口(如8080),并在被控端开放对应端口。 - 批量管理:新增被控端时,只需在
/etc/ansible/hosts中添加IP,重新执行Playbook即可批量部署。
更多推荐
所有评论(0)