搭建基于Ansible的服务器自动化运维管理平台
核心目标
实现多台服务器的批量安装系统和ansible初始化。
1. 实验环境准备
1.1 虚拟机网络配置
- 网络模式:使用 Host-Only模式,确保所有虚拟机(包括控制节点)处于同一局域网(如
192.168.1.0/24
)。控制节点可以增加一个虚拟网卡用来访问外网资源 - 控制节点:1台(访问外网ip:
192.1.100.141
pxe控制IP:192.168.1.254
),安装PXE服务和Ansible。 - 被管理节点:3台虚拟机,网卡设置为PXE启动
搭建PXE服务器(控制节点操作)
关闭防火墙,关闭selinux
systemctl disable firewalld --now
setenforce 0
sudo sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
安装依赖服务
sudo yum install -y dhcp* tftp-server httpd syslinux
sudo systemctl enable dhcpd tftp httpd
配置DHCP服务
编辑 /etc/dhcp/dhcpd.conf
:
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.200 192.168.1.220; # IP地址池
option routers 192.168.1.254; # 网关
option domain-name-servers 8.8.8.8; # DNS
filename "pxelinux.0"; # PXE引导文件
next-server 192.168.1.254; # TFTP服务器IP(控制节点)
}
重启服务:
sudo systemctl restart dhcpd
配置TFTP服务
# 复制PXE引导文件到TFTP目录
sudo cp -r /usr/share/syslinux/* /var/lib/tftpboot/
sudo mkdir -p /var/lib/tftpboot/pxelinux.cfg
# 创建PXE菜单配置文件
sudo vi /var/lib/tftpboot/pxelinux.cfg/default
内容如下:
default menu.c32
timeout 2
prompt 0
label linux
menu label ^Install CentOS 8
kernel vmlinuz
append initrd=initrd.img inst.repo=http://192.168.1.254/centos8 ks=http://192.168.1.254/ks.cfg
重启服务:
sudo systemctl restart tftp
配置http服务
sudo mkdir /var/www/html/centos8
sudo mount /dev/sr0 /var/www/html/centos8
sudo systemctl enable httpd --now
sudo cp -r /var/www/html/centos8/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/
配置Kickstart
内容如下(精简版):
[test@control html]$ sudo cat ks.cfg
# Kickstart自动安装配置
install
url --url=http://192.168.1.254/centos8 #安装源
lang en_US.UTF-8 #编码
keyboard us
network --onboot yes --device eth0 --bootproto dhcp
rootpw --plaintext root # 设置root密码
firewall --disabled
selinux --disabled
timezone Asia/Shanghai
bootloader --location=mbr
clearpart --all --initlabel
part / --fstype ext4 --size 10240 #文件系统
part swap --size 2048
%packages
@^minimal
@^graphical-server-environment #软件包安装
vim
net-tools
%end
%post --nochroot #在post部分添加重启命令
# 安装后脚本:写入完成标记
echo "PXE installation complete!" > /root/pxe_complete.txt #安装完成的信息
echo "reboot" > /root/reboot.sh
chmod +x /root/reboot.sh
bash /reboot.sh
%end
权限设置:
sudo chmod 755 -R /var/lib/tftp
sudo chmod 755 -R /var/www/html
3. 启动虚拟机安装系统
3.1 设置虚拟机PXE启动
自动安装过程
启动3台虚拟机,它们会通过PXE加载引导文件,自动从HTTP服务器下载Kickstart配置。
系统自动安装完成后,虚拟机会重启并进入新系统。
VirtualBox/VMware:在3台虚拟机设置中,将 网络启动(PXE) 设为第一启动项。
验证:
常见错误总结
现象 | 原因 | 解决方案 |
安装源不可达 | HTTP路径错误或权限不足 | 检查 和 ,修正权限 |
分区配置缺失 | Kickstart未定义 分区 | 添加 |
软件包选择错误 |
段缺失或无效 | 添加 或有效包组 |
通过以上步骤,可系统性解决PXE安装中的配置问题。如果仍无法解决,可通过查看安装界面的 详细日志(按 Ctrl+Alt+F2
切换终端)进一步定位错误。
ansible初始化
安装控制端ansible
sudo yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm //安装epel源
sudo pip3 install ansible==4.9.0 -i https://pypi.tuna.tsinghua.edu.cn/simple //使用pip3下载ansible,这里是用国内的镜像源
配置ansible
环境搭建
因为2.1版本默认是没有配置文件的,使用我们要先创建ansible
mkdir /etc/ansible
cd /etc/ansible/
sudo vi ansible.cfg
[default]
inventory = ./inventory
remote_user = user
ask_pass = false
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
vi inventory
[all_servers]
server1 ansible_host=192.168.1.204
server2 ansible_host=192.168.1.205 #地址是因为虚拟机重装了,正常是从201开始
server3 ansible_host=192.168.1.206
server4 ansible_host=192.168.1.207
[all_servers:vars]
ansible_ssh_user=root
ansible_ssh_pass=root
因为centos8的软件库中移除了sshpass安装包,使用需要编码下载sshpass
sudo dnf install gcc make -y
wget https://sourceforge.net/projects/sshpass/files/latest/download -O sshpass.tar.gz
tar -xvf sshpass.tar.gz
cd sshpass-1.10
./configure
make
sudo make install
vi /etc/hosts
192.168.1.204 server1
192.168.1.205 server2
192.168.1.206 server3
192.168.1.207 server4
ssh-keygen -t rsa -b 4096 #生成密钥文件
mkdir playbooks
vi playbooks/init_servers.yml
- name: Initialize Servers
hosts: all_servers
become: yes
- name: Deploy SSH Key
ansible.posix.authorized_key:
user: root
key: "{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"
state: present
- name: Harden SSH
template:
src: "templates/sshd_config.j2"
dest: /etc/ssh/sshd_config
notify: Restart SSH
- name: copy ssh repo
copy:
src: /etc/ansible/repo.sh
dest: /repo.sh
mode: '0755'
- name: execute the shell
shell: /repo.sh
- name: Install Base Tools
package:
name:
- vim
- net-tools
state: present
handlers:
- name: Restart SSH
systemd:
name: sshd
state: restarted
mkdir templates
vi templates/sshd_config,j2
port 2222
PermitRootLogin prohibit-password
PasswordAuthentication no
sudo vi repo.sh
#!/bin/bash
cd /etc/yum.repos.d/
mkdir bak
mv * bak
echo "[baseos]" >> base.repo
echo "name=baseos" >> base.repo
echo "baseurl=http://192.168.1.254/centos8/BaseOS" >> base.repo
echo "gpgcheck=0" >> base.repo
echo "[appstream]" >> base.repo
echo "name=appstream" >> base.repo
echo "baseurl=http://192.168.1.254/centos8/AppStream" >> base.repo
echo "gpgcheck=0" >> base.repo
yum repolist
chmod 755 repo.sh
sudo chmod 644 -R templates
export ANSIBLE_HOST_KEY_CHECKING=False
//避免首次连接时的交互提示
ANSIBLE_HOST_KEY_CHECKING=False
#用于禁用在连接到远程主机时进行 SSH 主机密钥检查
sudo ANSIBLE_HOST_KEY_CHECKING=False /usr/local/bin/ansible-playbook -i inventory init_servers.yml