1 简介

1.1 PXE简介

q  PXE是预启动执行环境,全名是Pre-boot Execution Environment

q  通过网络接口启动计算机,不需要依赖本地存储设备或本地已安装的操作系统

q  IntelSystemsoft公司于1999920日公布的技术

q  C/S的工作模式

q  PXE客户端会调用网际协议(IP)、用户数据协议(UDP)、动态主机分配协议(DHCP)、小型文件传输协议(TFTP)等网络协议

1.2 kickstart简介

kickstart是一种无人值守的安装方式    ,他的工作原理就是在安装的过程中记录人工干预填写的各种参数,并会生成一个名为ks.cfg的文件,如果在自动化安装的过程中出现需要填写参数的情况,安装程序就会去找ks.cfg程序,如果找到合适的参数,就采用所找到的参数,若找不到则需要人工进行填写,所以如果ks.cfg文件中涵盖了所有需要填写的参数,那么安装者完全可以只需告诉安装程序从何处下载ks.cfg文件,然后就可以等待安装完毕,然后会根据ks.cfg

文件设置重启/安装系统,最后结束安装。

1.3 Cobbler简介

 Cobbler集中和简化了通过网络安装操作系统需要使用的DHCPTFTP、和DNS服务的配置,Cobbler不仅有一个命令行界面,还提供了一个web界面,大大降低了使用者的入门水平。Cobbler内置了一个轻量级的配置管理系统,但也支持和其他配置管理系统集成,例如Puppet,但是暂时还不支持SaltStack

1.4 KickstartCobbler的区别

 简单的说就是Cobbler是对Kickstart的封装,简化了安装步骤、使用流程、降低了使用者的门槛

1.5 PXE+Kickstart装机流程图

自动化运维之kickstart自动化部署安装操作系统_kickstart

2 环境准备

2.1 系统环境

[root@kisckstart ~]# cat /etc/redhat-release

CentOS release 6.9 (Final)

[root@kisckstart ~]# uname -m

x86_64

[root@kisckstart ~]# uname -r

2.6.32-696.el6.x86_64

[root@kisckstart ~]# ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4}'

10.33.1.2

[root@kisckstart ~]# hostname

kisckstart

2.2 关闭安装机制

[root@kisckstart ~]# /etc/init.d/iptables stop

[root@kisckstart ~]# chkconfig iptables off

[root@kisckstart ~]# setenforce 0

[root@kisckstart ~]# sed "s#SELINUX=enforcing#SELINUX=disabled#g" /etc/sysconfig/selinux

3 部署kickstart

3.1 安装DHCP服务

[root@kisckstart ~]# yum install -y dhcp

[root@kisckstart ~]# rpm -ql dhcp|grep "dhcpd.conf"  ==》查找配置文件的位置

/etc/dhcp/dhcpd.conf

[root@kisckstart ~]# cat /etc/dhcp/dhcpd.conf

subnet 10.33.0.0 netmask 255.255.0.0 {

  range 10.33.1.100 10.33.1.200;  ##分配的IP地址范围

  option subnet-mask 255.255.0.0;  ##设定netmask

  default-lease-time 21600;   ##设置默认的IP租用期

  max-lease-time 43200;  ##设置最大的IP最大的IP租用期

  next-server 10.33.1.2;  ##TFTP服务器的IP地址

  filename "/pxelinux.0";  ##告诉客户端从根目录下载pxelinux.0文件

 

}

[root@kisckstart ~]# /etc/init.d/dhcpd start

[root@kisckstart ~]# netstat -tunlp |grep dhcpd  ==》查看端口

3.2 安装TFTP服务

[root@kisckstart ~]# yum install -y tftp-server

[root@kisckstart ~]# cat /etc/xinetd.d/tftp

service tftp

{

       socket_type            = dgram

       protocol         = udp

       wait               = yes

       user               = root

       server                    = /usr/sbin/in.tftpd

       server_args            = -s /var/lib/tftpboot

       disable                  = no    ##由原来的yes变为no

       per_source             = 11

       cps                 = 100 2

       flags              = IPv4

}

[root@kisckstart ~]# /etc/init.d/xinetd start

[root@kisckstart ~]# netstat -tnulp|grep "xinetd"

3.3 配置HTTP服务

[root@kisckstart ~]# yum install -y httpd

[root@kisckstart ~]#sed -i "277i ServerName 127.0.0.1:80" /etc/httpd/conf/httpd.conf

[root@kisckstart conf]# /etc/init.d/httpd start

3.4 上传镜像

[root@kisckstart ~]# mkdir /var/www/html/centos-6.9 ==》创建镜像存放目录

[root@kisckstart ~]# mount /dev/cdrom /var/www/html/centos-6.9/  ==》挂载

mount: block device /dev/sr0 is write-protected, mounting read-only

[root@kisckstart ~]# df -h  ==》检查

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda3        19G  1.8G   16G  10% /

tmpfs           491M     0  491M   0% /dev/shm

/dev/sda1       190M   35M  146M  19% /boot

/dev/sr0        3.7G  3.7G     0 100% /var/www/html/centos-6.9

注意:只要将镜像通过web发布即可,所以不管你怎么弄都行!!!

3.5 浏览器访问测试

自动化运维之kickstart自动化部署安装操作系统_运维_02

3.6 配置支持PXE的启动程序

3.6.1 PXE引导配置

q  syslinux是一个功能强大的引导加载程序,并且兼容各种介质

q  syslinux是一个小型的linux操作系统,目的是简化linux首次安装的时间,并建立维护或其他特殊用途的启动盘

q  如果没有找到pxelinux.0这个文件,可以安装下syslinux

[root@kisckstart ~]# yum install -y syslinux 

[root@kisckstart ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/

[root@kisckstart ~]# cp -a /var/www/html/centos-6.9/isolinux/* /var/lib/tftpboot/

[root@kisckstart ~]# ls /var/lib/tftpboot/

boot.cat  grub.conf   isolinux.bin  memtest     splash.jpg  vesamenu.c32

boot.msg  initrd.img  isolinux.cfg  pxelinux.0  TRANS.TBL   vmlinuz

[root@kisckstart ~]# mkdir  /var/lib/tftpboot/pxelinux.cfg  ==》创建一个pxelinux.cfg目录,存放客户端的配置文件

[root@kisckstart ~]# cp /var/www/html/centos-6.9/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default

3.6.2 半自动安装

3.6.2.1 新建一个虚拟机然后开机

自动化运维之kickstart自动化部署安装操作系统_kickstart_03

3.6.2.2 然后选择第一项

自动化运维之kickstart自动化部署安装操作系统_kickstart_04

3.6.2.3 选择英语

自动化运维之kickstart自动化部署安装操作系统_运维_05

3.6.2.5 选择美式英语

自动化运维之kickstart自动化部署安装操作系统_运维_06

3.6.2.6 选择URL安装

自动化运维之kickstart自动化部署安装操作系统_kickstart_07

3.6.2.7 禁用IPv6

自动化运维之kickstart自动化部署安装操作系统_自动化_08

3.6.2.8 输入http地址

自动化运维之kickstart自动化部署安装操作系统_运维_09

3.6.2.9 最后和U盘或光盘安装的步骤一样

自动化运维之kickstart自动化部署安装操作系统_kickstart_10

3.6.3 创建ks.cfg文件

3.6.3.1 生成配置文件的方式

【法1

       每安装好一台Centos机器,Centos就会创建一个名字为anaconda-ks.cfgkickstart文件,位于/root目录下面,记录你的真实安装配置,如果希望实现和某系统类似的安装,可以基于该系统的kickstart配置文件来生成你自己的kickstart配置文件

【法2

       阅读kickstart配置文件手册,用文本编辑器就可以创建属于自己的kickstart文件

【法3

Centos提供了一个图形化的kickstart配置工具。在任何一个安装好的Linux系统上运行该工具,就可以很容易地创建你自己的kickstart配置文件。kickstart配置工具命令为redhat-config-kickstartRHEL3)或system-config-kickstartRHEL4RHEL5.网上有很多用CentOS桌面版生成ks文件的文章,如果有现成的系统就没什么可说。但没有现成的,也没有必要去用桌面版,命令行也很简单

3.6.3.2 编写ks.cfg文件

mkdir -p /var/www/html/ks_config

cat /var/www/html/ks_config/CentOS-6.9-ks.cfg

#Kickstart Configurator for CentOS 6.9 by liuzhonghhe

install

url --url="http://172.16.1.200/centos-6.9"

text

lang en_US.UTF-8

keyboard us

zerombr

bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"

network --bootproto=dhcp --device=eth0 --onboot=yes --noipv6 --hostname=Centos6

timezone -utc Asia/Shanghai

authconfig --enableshadow --passalgo=sha512

rootpw --iscrypted $6$4/LtE7Epu9PGKS7B$FkjCppxcjDxfYJ6RAFU52W0JzPWYDjQmyt2sa8lydljECLrhGH6YwtKBNQtXqF59bDs2CSfSiFPLEzgy2EfPz0

clearpart --all --initlabel

part /boot --fstype=ext4 --asprimary --size=200

part swap --size=1024

part / --fstype=ext4 --grow --asprimary --size=200

firstboot --disable

selinux --disabled

firewall --disabled

logging --level=info

reboot

 

%packages

@base

@compat-libraries

@debugging

@development

tree

nmap

sysstat

lrzsz

dos2unix

telnet

 

%post

wget -O /tmp/optimization.sh http://172.16.1.200/ks_config/optimization.sh &>/dev/null

/bin/sh /tmp/optimization.sh

%end

3.6.3.3 开机优化脚本

vim  /var/www/html/ks_config/optimization.sh

cat   /var/www/html/ks_config/optimization.sh

#!/bin/bash

##############################################################

# File Name: /var/www/html/ks_config/optimization.sh

# Version: V1.0

# Author: Liu Zhonghe

# Description: Linux system initialization

##############################################################

. /etc/init.d/functions

Ip=172.16.1.200

Port=80

ConfigDir=ks_config

# Judge Http server is ok?

PortNum=`nmap $Ip  -p $Port 2>/dev/null|grep open|wc -l`

[ $PortNum -lt 1 ] && {

        echo "Http server is bad!"

        exit 1

}

# Defined result function

function Msg(){

        if [ $? -eq 0 ];then

          action "$1" /bin/true

        else

          action "$1" /bin/false

        fi

}

# Defined IP function

function ConfigIP(){

        Suffix=`ifconfig eth1|awk -F "[ .]+" 'NR==2 {print $6}'`

        cat >/etc/sysconfig/network-scripts/ifcfg-eth1 <<-END

        DEVICE=eth1

        TYPE=Ethernet

        ONBOOT=yes

        NM_CONTROLLED=yes

        BOOTPROTO=none

        IPADDR=172.16.1.$Suffix

        PREFIX=24

        GATEWAY=172.16.1.61

        DNS1=10.0.0.2

        DEFROUTE=yes

        IPV4_FAILURE_FATAL=yes

        IPV6INIT=no

        NAME="System eth1"

        END

        Msg "config eth1"

}

# Defined Yum source Functions

function yum(){

        YumDir=/etc/yum.repos.d

        [ -f "$YumDir/CentOS-Base.repo" ] && cp $YumDir/CentOS-Base.repo{,.ori}

        wget -O $YumDir/CentOS-Base.repo http://$Ip:$Port/$ConfigDir/CentOS-Base.repo &>/dev/null &&\

        wget -O $YumDir/epel.repo http://$Ip:$Port/$ConfigDir/epel.repo &>/dev/null &&\

        Msg "YUM source"

}

# Defined Hide the system version number Functions

function HideVersion(){

        [ -f "/etc/issue" ] && >/etc/issue

        Msg "Hide issue"

        [ -f "/etc/issue.net" ] && > /etc/issue.net

        Msg "Hide issue.net"

}

# Defined OPEN FILES Functions

function openfiles(){

        [ -f "/etc/security/limits.conf" ] && {

        echo '*  -  nofile  65535' >> /etc/security/limits.conf

        Msg "open files"

        }

}

# Defined Kernel parameters Functions

function kernel(){

        KernelDir=/etc

        [ -f "$KernelDir/sysctl.conf" ] && /bin/mv $KernelDir/sysctl.conf{,.ori}

        wget -O $KernelDir/sysctl.conf http://$Ip:$Port/$ConfigDir/sysctl.conf &>/dev/null

        Msg "Kernel config"

}

# Defined System Startup Services Functions

function boot(){

        for oldboy in `chkconfig --list|grep "3:on"|awk '{print $1}'|grep -vE "crond|network|rsyslog|sshd|sysstat"`

          do

           chkconfig $oldboy off

        done

        Msg "BOOT config"

}

# Defined Time Synchronization Functions

function Time(){

        echo "#time sync by zhangyao at $(date +%F)" >>/var/spool/cron/root

        echo '*/5 * * * * /usr/sbin/ntpdate time.nist.gov &>/dev/null' >>/var/spool/cron/root

        Msg "Time Synchronization"

}

# Defined main Functions

function main(){

        ConfigIP

        yum

        HideVersion

        openfiles

        kernel

        boot

        Time

}

main

 

default ks

prompt 0

label ks

kernel vmlinuz

append initrd=initrd.img ks=http://172.16.1.200/ks_config/CentOS-6.7-ks.cfg ksdevice=eth1

3.6.3.4  整合配置文件

vim /var/lib/tftpboot/pxelinux.cfg/default

default ks

prompt 0

label ks

kernel vmlinuz

append initrd=initrd.img ks=http://172.16.1.200/ks_config/CentOS-6.7-ks.cfg ksdevice=eth1

3.6.4 无人值守自动安装

过程截图

自动化运维之kickstart自动化部署安装操作系统_自动化_11

自动化运维之kickstart自动化部署安装操作系统_自动化_12

4 ks.cfg文件详解

4.1 Centos6官方参考文档

https://access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-kickstart2-options.html 

4.2 ks.cfg文件可以分为3

q  命令段

用来配置键盘类型、语言、安装方式等系统的配置,有必选项和可选项,若缺少必须项,在安装的过程中会暂定,需手动指定

q  软件包段

²  %packages

²  @groupname:指定安装的包组

²  package_name:指定安装的包

²  -package_name:指定不安装的包

q  脚本段

²  %pre:安装系统前执行的命令或脚本(由于只依赖于启动镜像,支持的命令很少)

²  %post:安装系统后执行的命令或脚本(基本支持所有命令)

4.3 详细解释

关键字

含义

install

告知安装程序,这是一次全新安装,而不是升级upgrade

url --url=" "

通过FTPHTTP从远程服务器上的安装树中安装。
  url --url="http://172.16.1.200/centOS-6.7/"
  url --url ftp://<username>:<password>@<server>/<dir>

nfs

从指定的NFS服务器安装。
  nfs --server=nfsserver.example.com --dir=/tmp/install-tree

text

使用文本模式安装。

lang

设置在安装过程中使用的语言以及系统的缺省语言。lang en_US.UTF-8

keyboard

设置系统键盘类型。keyboard   us

zerombr

清除mbr引导信息。

bootloader

系统引导相关配置。
  bootloader --location=mbr --driveorder=sda --append="crashkernel=auto   rhgb quiet"
  --location=,指定引导记录被写入的位置.有效的值如下:mbr(缺省),partition(在包含内核的分区的第一个扇区安装引导装载程序)none(不安装引导装载程序)
  --driveorder,指定在BIOS引导顺序中居首的驱动器。
  --append=,指定内核参数.要指定多个参数,使用空格分隔它们。

network

为通过网络的kickstart安装以及所安装的系统配置联网信息。
  network --bootproto=dhcp --device=eth0 --onboot=yes --noipv6   --hostname=CentOS6
  --bootproto=[dhcp/bootp/static]中的一种,缺省值是dhcpbootpdhcp被认为是相同的。
  static方法要求在kickstart文件里输入所有的网络信息。
  network --bootproto=static --ip=10.0.0.200 --netmask=255.255.255.0   --gateway=10.0.0.2 --nameserver=10.0.0.2
  请注意所有配置信息都必须在一行上指定,不能使用反斜线来换行。
  --ip=,要安装的机器的IP地址.
  --gateway=,IP地址格式的默认网关.
  --netmask=,安装的系统的子网掩码.
  --hostname=,安装的系统的主机名.
  --onboot=,是否在引导时启用该设备.
  --noipv6=,禁用此设备的IPv6.
  --nameserver=,配置dns解析.

timezone

设置系统时区。timezone   --utc Asia/Shanghai

authconfig

系统认证信息。authconfig   --enableshadow --passalgo=sha512
  设置密码加密方式为sha512 启用shadow文件。

rootpw

root密码

clearpart

清空分区。clearpart   --all --initlabel
  --all 从系统中清除所有分区,--initlable 初始化磁盘标签

part

磁盘分区。
  part /boot --fstype=ext4 --asprimary --size=200
  part swap --size=1024
  part / --fstype=ext4 --grow --asprimary --size=200
  --fstype=,为分区设置文件系统类型.有效的类型为ext2,ext3,swapvfat
  --asprimary,强迫把分区分配为主分区,否则提示分区失败。
  --size=,MB为单位的分区最小值.在此处指定一个整数值,500.不要在数字后面加MB
  --grow,告诉分区使用所有可用空间(若有),或使用设置的最大值。

firstboot

负责协助配置redhat一些重要的信息。
  firstboot --disable

selinux

关闭selinuxselinux --disabled

firewall

关闭防火墙。firewall   --disabled

logging

设置日志级别。logging   --level=info

reboot

设定安装完成后重启,此选项必须存在,不然kickstart显示一条消息,并等待用户按任意键后才重新引导,也可以选择halt关机