CentOS8的PXE安装-3-kickstart自动安装

3. kickstart自动安装

  • pxe服务器
    • 硬件基本信息
      • CPU大于4核
      • 内存大于4G
      • 硬盘大于50G
    • 系统基本信息
      • 系统版本:centos7.4
      • selinux:关闭
      • Firewalld:关闭
      • yum源:阿里云的yum源
  • client服务器
    • 硬件基本信息
      • CPU大于4核
      • 内存大于4G
      • 硬盘大于50G
      • 支持网络启动

3.1. 定义安装参数

通过配置文件的参数,来配置系统的一些选项。

sn hostname 根大小 磁盘剩余空间挂载点 swap分区大小 文件系统格式 是否做bond ip地址 掩码 网关 系统版本
VMware-564da23a647f0edd-a62ca6791920304a client.test.com 50 /data 8 xfs bondno 192.168.17.129 255.255.255.0 192.168.17.2 centos-8.1-x86_64

文件路径:/var/www/html/install/server.conf。示例:

[root@pxe01 ~]# cat /var/www/html/install/server.conf
#sn hostname 根大小 剩余空间挂载点 swap分区大小 文件系统格式 ip地址 掩码 网关 系统版本
VMware-564da23a647f0edd-a62ca6791920304a client.test.com 50 /data 8 xfs bondno 192.168.17.129 255.255.255.0 192.168.17.2 centos-8.1-x86_64
VMware-564da23a647f0edd-a62ca6791920304b client.test.com all --- 0 ext4 bondno 192.168.17.130 255.255.255.0 192.168.17.2 centos-8.0-x86_64

3.2. KS文件和脚本

  1. kickstart文件路径:/var/www/html/centos8-pxe/ks/centos8.ks
#version=RHEL8
#ignoredisk --only-use=sdm
%include "/tmp/os_disk"
# Clear the Master Boot Record
zerombr
# Partition clearing information
clearpart --all --initlabel
# Use graphical install
graphical
%include /tmp/tarball
#repo --name="AppStream" --baseurl="http://192.168.17.128/iso/centos8u1/AppStream"
# SELinux configuration
selinux --disabled
# Firewall configuration
firewall --disabled
# Reboot after installation
reboot
# Use network installation
#url --url="http://192.168.17.128/iso/centos8u1"
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8

# Network information
#network  --hostname=localhost.localdomain
%include "/tmp/hostname"
# Root password
rootpw "123456"
# Do not configure the X Window System
skipx
# Run the Setup Agent on first boot
firstboot --disabled
# Installation logging level
logging --level=info
# System services
services --disabled="chronyd"
# System timezone
timezone Asia/Shanghai --isUtc --nontp
# System bootloader configuration
bootloader --append="net.ifnames=0 biosdevname=0 rd.driver.pre=mlx5_core,i40e,ixgbe"

# Disk partitioning information
%include "/tmp/part_info"

%packages
%include "/tmp/packages"
kexec-tools

#@^server-product-environment
#@^infrastructure-server-environment
%end

%addon com_redhat_kdump --enable --reserve-mb='auto'

%end

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end

%pre
echo "pre script" |tee /tmp/pre.txt
wget -O pre_script.sh http://192.168.17.128/centos8-pxe/scripts/pre_script.sh
bash pre_script.sh |tee -a /tmp/pre.txt
%end

%post
echo "post script" |tee /tmp/post.txt
wget -O post_script.sh http://192.168.17.128/centos8-pxe/scripts/post_script.sh
bash post_script.sh |tee -a /tmp/post.txt
%end
  1. pre_script文件路径:/var/www/html/centos8-pxe/scripts/pre_script.sh
#!/bin/bash

function get_install_info()
{
  export sn=$(dmidecode -t1 |grep 'Serial Number:' |awk -F ':' '{print $NF}' |tr -d ' ')
  if [ ! -f "/tmp/server.conf" ]; then
    wget -O /tmp/server.conf http://192.168.17.128/install/server.conf
  fi

  return 0
}

function set_hostname()
{
  local thisconf=$(cat /tmp/server.conf |grep -v ^# |grep $sn |tail -n1)
  if [ -z "$thisconf" ]; then
    echo "not find $sn"
    exit 0;
  fi

  local hostname_info=$(echo $thisconf |awk '{print $2}')

  echo "network  --hostname=$hostname_info" >/tmp/hostname

  return 0
}

function set_tarball()
{
  local thisconf=$(cat /tmp/server.conf |grep -v ^# |grep $sn |tail -n1)
  if [ -z "$thisconf" ]; then
    echo "not find $sn"
    exit 0;
  fi

  local tarball=$(echo $thisconf |awk '{print $11}')
  if [ "$tarball" == "centos-8.1-x86_64" ]; then
    echo "repo --name=\"AppStream\" --baseurl=\"http://192.168.17.128/iso/centos8u1/AppStream\"" >/tmp/tarball
    echo "url --url=\"http://192.168.17.128/iso/centos8u1\"" >>/tmp/tarball
    echo "@^server-product-environment" >/tmp/packages
  elif [ "$tarball" == "centos-8.0-x86_64" ]; then
    echo "repo --name=\"AppStream\" --baseurl=\"http://192.168.17.128/iso/centos8u0/AppStream\"" >/tmp/tarball
    echo "url --url=\"http://192.168.17.128/iso/centos8u0\"" >>/tmp/tarball
    echo "@^server-product-environment" >/tmp/packages
  elif [ "$tarball" == "centos-7.4-x86_64" ]; then
    echo "url --url=\"http://192.168.17.128/iso/centos7u4\"" >/tmp/tarball
    echo "@^infrastructure-server-environment" >/tmp/packages
  fi

  return 0
}

OS_DEV=""
OS_DEV_NAME=""
#获取最小磁盘作为系统盘,大于50G,小鱼1000G
function get_os_disk() 
{
  fdisk -l &>disk.txt
  local disk_os_size=""
  local disk_os_label=""

  if [ $(cat disk.txt |grep 'Disk /dev/' |wc -l) -eq 1 ]
  then
    disk_os_label=$(cat disk.txt |grep 'Disk /dev/' |egrep -o '/dev/sd[a-z]{1,2}')
  else
    for disk_min in $(cat disk.txt |grep 'Disk /dev/' |awk '{print $5}' |sort -un)
    do
      if [[ $disk_min -gt 50022480896 ]] && [[ $disk -lt 1000592982016 ]]
      then
        disk_os_size=$disk_min
        break
      fi
    done
    disk_os_label=$(cat disk.txt |grep $disk_os_size |egrep -o '/dev/sd[a-z]{1,2}' |sort |head -n1)
  fi

  if [ -z "$disk_os_label" ]
  then
    disk_os_label="/dev/sda"
  fi
  export OS_DEV="$disk_os_label"
  echo "$disk_os_label" >/tmp/os_disk.txt\

  local os_disk=$(echo "$OS_DEV" |cut -d '/' -f3)
  export OS_DEV_NAME="$os_disk"
  echo "ignoredisk --only-use=$os_disk" >/tmp/os_disk
}

function std_disk_part()
{
  parted -s "$OS_DEV" mklabel gpt

  local thisconf=$(cat /tmp/server.conf |grep -v ^# |grep $sn |tail -n1)
  if [ -z "$thisconf" ]; then
    echo "not find $sn"
    exit 0;
  fi

  local root_space=$(echo $thisconf |awk '{print $3}')
  local data_space=$(echo $thisconf |awk '{print $4}')
  local swap_space=$(echo $thisconf |awk '{print $5}')

  local file_format=$(echo $thisconf |awk '{print $6}')

  # 如果根大小的参数为all,那么不创建剩余空间挂载点
  if [ "$root_space" == "all" ]; then
    local root_mount="part /        --fstype=\"$file_format\" --ondisk=$OS_DEV_NAME --grow --size=1"
    local data_mount=""
  else
    root_space=$[ $root_space * 1024 ]
    local root_mount="part /        --fstype=\"$file_format\" --ondisk=$OS_DEV_NAME --maxsize=$root_space --size=1 --grow"
    local data_mount="part $data_space    --fstype=\"$file_format\" --ondisk=$OS_DEV_NAME --size=1 --grow"
  fi

  # 如果swap的参数为0,则不创建swap分区,否则创建
  if [ "$swap_space" == "0" ]; then
    local swap_mount=""
  else
    swap_space=$[ $swap_space * 1024 ]
    local swap_mount="part swap     --fstype=\"swap\"         --ondisk=$OS_DEV_NAME --size=$swap_space"
  fi


  cat << EOF >/tmp/part_info
part biosboot --fstype="biosboot"     --ondisk=$OS_DEV_NAME --size=2
part /boot    --fstype="$file_format" --ondisk=$OS_DEV_NAME --size=1536
$swap_mount
$root_mount
$data_mount
EOF
  return 0
}

function efi_disk_part()
{
  #parted -s /dev/sda mklabel gpt
  parted -s "$OS_DEV" mklabel gpt

  local thisconf=$(cat /tmp/server.conf |grep -v ^# |grep $sn |tail -n1)
  local root_space=$(echo $thisconf |awk '{print $3}')
  local data_space=$(echo $thisconf |awk '{print $4}')
  local swap_space=$(echo $thisconf |awk '{print $5}')

  local file_format=$(echo $thisconf |awk '{print $6}')

  if [ "$root_space" == "all" ]; then
    local root_mount="part /         --asprimary --fstype=\"$file_format\" --grow --size=1"
    local data_mount=""
  else
    root_space=$[ $root_space * 1024 ]
    local root_mount="part /         --asprimary --fstype=\"$file_format\" --maxsize=$root_space --size=1 --grow"
    local data_mount="part /$data_space    --asprimary --fstype=\"$file_format\" --grow --size=1"
  fi

  # 如果swap的参数为0,则不创建swap分区,否则创建
  if [ "$swap_space" == "0" ]; then
    local swap_mount=""
  else
    swap_space=$[ $swap_space * 1024 ]
    local swap_mount="part swap     --fstype=\"swap\"         --ondisk=$OS_DEV_NAME --size=$swap_space"
  fi

  cat << EOF >/tmp/part_info
part /boot/efi --asprimary --fstype="efi"  --size=500   --fsoptions="umask=0077,shortname=winnt"
part /boot     --asprimary --fstype="$file_format" --size=1536
$swap_mount
$root_mount
$data_mount
EOF
  return 0
}

function main()
{
  get_install_info
  set_hostname
  set_tarball
  get_os_disk
  if [ -e "/sys/firmware/efi" ]; then
    efi_disk_part
    return 0
  else
    std_disk_part
    return 0
  fi

  return 0
}

#------------------
main
  1. post_script文件路径:/var/www/html/centos8-pxe/scripts/post_script.sh
#!/bin/bash


function get_net_info()
{
  export sn=$(dmidecode -t1 |grep 'Serial Number:' |awk -F ':' '{print $NF}' |tr -d ' ')
  if [ ! -f "/tmp/server.conf" ]; then
    wget -O /tmp/server.conf http://192.168.17.128/install/server.conf
  fi

  local thisconf=$(cat /tmp/server.conf |grep $sn |tail -n1)

  export    bondyes=$(echo $thisconf |awk '{print $7}')
  export         ip=$(echo $thisconf |awk '{print $8}')
  export       mask=$(echo $thisconf |awk '{print $9}')
  export default_gw=$(echo $thisconf |awk '{print $10}')


  return 0
}

function set_eth0()
{
  local eth="eth0"
  cat << EOF > /etc/sysconfig/network-scripts/ifcfg-$eth
TYPE=Ethernet
DEVICE=$eth
ONBOOT=yes
BOOTPROTO=none
IPADDR=$ip
NETMASK=$mask
EOF

  echo "GATEWAY=$default_gw" >>/etc/sysconfig/network
  return 0
}

function set_bond0()
{
  local eth0="eth0"
  local eth1="eth1"
  local bondname="bond0"

  cat << EOF > /etc/sysconfig/network-scripts/ifcfg-$eth0
DEVICE=$eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
MASTER=$bondname
SLAVE=yes
HOTPLUG=no
EOF

  cat << EOF > /etc/sysconfig/network-scripts/ifcfg-$eth1
DEVICE=$eth1
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
MASTER=$bondname
SLAVE=yes
HOTPLUG=no
EOF

    cat << EOF > /etc/sysconfig/network-scripts/ifcfg-$bondname
DEVICE=$bondname
TYPE=bond
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
BONDING_OPTS="mode=4 miimon=100 xmit_hash_policy=layer2+3"
IPADDR=$ip
NETMASK=$mask
EOF

  echo "GATEWAY=$default_gw" >>/etc/sysconfig/network
  return 0
}

function main()
{
  get_net_info
  if [ "$bondyes" == "bondyes" ]; then
    set_bond0
  else
    set_eth0
  fi

  return 0
}

#--------------------------
main
  1. 向default文件添加ks参数
default vesamenu.c32
#prompt 1
timeout 600

#display boot.msg

menu background splash.jpg
menu title Welcome to CentOS 8.X!
menu color border 0 #ffffffff #00000000
menu color sel 7 #ffffffff #ff000000
menu color title 0 #ffffffff #00000000
menu color tabmsg 0 #ffffffff #00000000
menu color unsel 0 #ffffffff #00000000
menu color hotsel 0 #ff000000 #ffffffff
menu color hotkey 7 #ffffffff #ff000000
menu color scrollbar 0 #ffffffff #00000000



label local
  menu label Boot from local drive
  localboot 0xffff

label linux
  menu label CentOS 8.X
  menu default
  kernel http://192.168.17.128/centos8-pxe/vmlinuz
  append initrd=http://192.168.17.128/centos8-pxe/initrd.img net.ifnames=0 biosdevname=0 rd.driver.pre=mlx5_core,i40e,ixgbe ksdevice=bootif inst.gpt inst.stage2=http://192.168.17.128/centos8-pxe
 inst.ks=http://192.168.17.128/centos8-pxe/ks/centos8.ks
  ipappend 2

3.3. 自动安装测试

成功

3.4. 解决的问题

  1. 多台服务器同时安装系统的问题
    不同的操作系统,不同的分区
  2. 安装centos7的时候,文件系统格式要选ext4,否则不成功
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345