核心目标
实现多台服务器的批量安装系统和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路径错误或权限不足 |
检查 inst.repo 和 url –url ,修正权限 |
分区配置缺失 |
Kickstart未定义 / 分区 |
添加 part / –fstype ext4 –size 10240 |
软件包选择错误 |
%packages 段缺失或无效 |
添加 @^graphical-server-environment 或有效包组 |
通过以上步骤,可系统性解决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
评论前必须登录!
注册