Kickstart 自动装机
参考: Kickstart Installations :: CentOS Docs Site
Kickstart 命令选项
* 示例
#version=DEVEL
# System authorization information
# 系统 身份验证
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
# 使用 光驱 执行安装
cdrom
# Use graphical install
# 使用 图形化 安装界面
graphical
# Run the Setup Agent on first boot
# 系统第一次引导时启动 初始化设置
# 设置语言、鼠标、键盘、root 密码、安全级别、时区以及默认网络配置
firstboot --enable --reconfig
# 接受最终用户许可证协议
# eula --agreed
# 忽略其他盘,指定使用 sda
# ignoredisk --only-use=sda
# Keyboard layouts
# 使用 美式键盘
keyboard --vckeymap=us --xlayouts='us'
# System language
# 系统 默认语言
lang en_US.UTF-8
# Network information
# 网络 信息
# 设置主机名
network --hostname=localhost.localdomain
# IP 设置,需指定 device,否则会取消后续所有network指令
# network --bootproto=static --device=ens33 --ip=172.16.1.10 --netmask=255.255.255.0 --gateway=172.16.1.2 --nameserver=8.8.8.8 --ipv6=auto --activate
# Root password
# root 密码
rootpw --iscrypted $6$CRq8DBBEWuqc6LMC$IsuckHWPV8S3mpq0WfceGChzqA6nNVZZGni5oTgQ/tZisMqOrHlmGHqbZKCZchcmuFEBEF8OVT78qzZTiTrNK.
user --name=acha --plaintext --password=q --groups=wheel
# System services
# 系统 服务
services --enabled="chronyd"
# 禁用 firewalld & selinux
firewall --disabled
selinux --disabled
# System timezone
# 系统 时间
timezone Asia/Shanghai --utc --ntpservers=ntp.aliyun.com
# System bootloader configuration
# 启动 引导配置 | grub2-mkpasswd-pbkdf2 设置密码
# bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda --password=grub.pbkdf2.sha512.10000.6CCA5D020DF908F98F2F5DA077E18800D514B85BAAF2376812A62CF772803CB14D0A134DDFFA87E7D6B4509CEA9ADEAFACE98ACCF2028C7830583C51361F1F08.13A6610E8A0FBF7D0CAA7C80B4DEC4C4CC22F8BD8CCC669412A9F028B22F25E38BB8B89879B0A75F60D2D05417E9CCBA057C7AD18A75F8F32D768814B5416208
# Partition clearing information
# 清除分区
# --all、清除所有分区、--drives= 指定清除硬盘、--none 不删除任何分区
# clearpart --drives=sda --initlabel
# Disk partitioning information
# part / --fstype="xfs" --ondisk=sda --size=17407
# part swap --fstype="swap" --ondisk=sda --size=2048
# part /boot --fstype="xfs" --ondisk=sda --size=1024
%include /tmp/part.cfg
# 安装完重启
reboot --eject
%packages
@^minimal
chrony
%end
%addon com_redhat_kdump --enable --reserve-mb='auto'
%end
%pre
#!/bin/sh
aa=$(whiptail --title "disk info" --nocancel --menu "Please select a disk device." 15 50 5 $(lsblk | grep -v 'loop\|sr\|zraw' |awk '/^[a-z]/ {printf $1" "$4" "}') 3>&1 1>&2 2>&3 >/dev/console)
> /tmp/part.cfg
echo "bootloader --append=\" crashkernel=auto\" --location=mbr --boot-drive=$aa --driveorder=$aa --iscrypted --password=grub.pbkdf2.sha512.10000.56A0BDCD566915642A113EA15395992ACB55225783A26E5C1AF7AF101651F60EAE52F869DCEF59A319C8A57EB0EFDD22C6D5D8D1046385C05879699CA0A33D06.2432DEC1D876C30F41C8B307CDEFF2F8D6072FD36D8D68D752F96DD9CD99AE126F2E87FD5C5DF59543391B8DE28F82A73D735BDD8863FD439E9BB2C96EC77A2C" >> /tmp/part.cfg
echo "ignoredisk --only-use=$aa" >> /tmp/part.cfg
echo "clearpart --drives=$aa --all" >> /tmp/part.cfg
echo "part /boot --fstype=xfs --ondisk=$aa --size=1024" >> /tmp/part.cfg
echo "part swap --fstype=swap --ondisk=$aa --size=2048" >> /tmp/part.cfg
echo "part / --fstype=xfs --ondisk=$aa --grow --maxsize=51200" >> /tmp/part.cfg
%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
用户认证
- auth
设置身份验证选项
--enableshadow
使用 用户密码
--passalgo=sha512
指定 SHA-512 哈希算法
例:auth --enableshadow --passalgo=sha512
- rootpw
设置 root 密码
rootpw [--iscrypted|--plaintext] [--lock] password
--iscrypted
创建 加密的密码
--plaintext
纯文本
--lock
锁定 root 帐户
例:rootpw --iscrypted $6$CRq8DBBEWuqc6LMC$IsuckHWPV8S3mpq0WfceGChzqA6nNVZZGni5oTgQ/tZisMqOrHlmGHqbZKCZchcmuFEBEF8OVT78qzZTiTrNK.
tip:
生成密码
python -c 'import crypt,getpass;pw=getpass.getpass();print(crypt.crypt(pw) \
if (pw==getpass.getpass("Confirm: ")) else exit())'
- User
在系统上创建新用户
user --name=username [options]
--name=
用户名称
--groups=
组名列表
--shell=
shell 类型
--iscrypted
创建 加密的密码
--plaintext
纯文本
例: user --name=acha --plaintext --password=q --groups=wheel
tip:
生成密码
python -c 'import crypt,getpass;pw=getpass.getpass();print(crypt.crypt(pw) \
if (pw==getpass.getpass("Confirm: ")) else exit())'
用户设置
- Keyboard
设置 键盘布局
--vckeymap
键映射
--xlayouts
键盘布局
例: keyboard --vckeymap=us --xlayouts='us'
- lang
设置 默认语言
--addsupport=
添加对其他语言的支持
例: lang en_US.UTF-8
- timezone
设置 系统时区
timezone timezone [options]
--utc
设置 utc 时区
--nontp
不启用 ntp
--ntpservers=
ntp 服务地址
例: timezone Asia/Shanghai --utc --ntpservers=ntp.aliyun.com
安装
- cdrom
CDROM
例: cdrom
- url
使用 FTP、HTTP 或 HTTPS 从远程服务器上的安装树进行安装
--url=
安装位置
例; url --url=
服务
- firewall
指定 已安装系统的防火墙配置
firewall --enabled|--disabled device [options]
- selinux
设置 已安装系统上 SELinux 的状态
selinux [--disabled|--enforcing|--permissive]
- services
修改 将在默认 systemd 目标下运行的默认服务集
services [--disabled=list] [--enabled=list]
引导参数
- firstboot
首次引导系统。启用,则必须安装初始安装包
--enable
启用
--disable
禁用
--reconfig
重新配置
例: firstboot --enable --reconfig
- bootloader
指定应如何安装引导加载程序
--append=
指定其他内核参数
--boot-drive=
指定 引导加载程序 写入哪个驱动器
--leavebootorder
CentOS 7 添加到引导加载程序 顶部
--driveorder=
BIOS 引导顺序中排在第一位
--password=
GRUB2 菜单密码
--iscrypted
加密的密码
--timeout=
等待时间
--default=
设置默认引导映像
--disabled
禁用引导加载程序安装
例: bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=$aa --driveorder=$aa --password=3214
tip:
生成 grub2 密码: grub2-mkpasswd-pbkdf2
磁盘
- ignoredisk
忽略指定的磁盘
ignoredisk --drives=drive1,drive2,...
- clearpart
在创建新分区之前从系统中删除分区
--all
擦除系统中的所有分区
--drives=
清除分区的驱动器
--initlabel
通过为各自体系结构中已指定用于格式化的所有磁盘
--list=
指定要清除的分区
--linux
擦除所有 Linux 分区
--none
不删除任何分区
例: clearpart --drives=$aa --all
- part
创建分区
--size=
设置 分区大小
--grow
自适应大小
--maxsize=
分区设置的最大分区大小
--fstype=
文件系统类型
--ondisk=
在磁盘上创建一个分区
例: part / --fstype=xfs --ondisk=$aa --grow --maxsize=51200
网络
- network
配置目标系统的网络信息
--activate
在安装环境中激活此设备
--bootproto
网络模式
--device=
指定网卡
--ip=
IP地址
--netmask=
子网掩码
--gateway=
网关
--nameserver=
dns解析
--onboot=
自启
--noipv6
禁用 ipv6
例: network
--bootproto=static --device=ens33 --ip=172.16.1.10 --netmask=255.255.255.0 --gateway=172.16.1.2 --nameserver=8.8.8.8 -noipv6 --onboot=yes --activate
状态
- reboot
安装成功完成后重新启动
--eject
尝试在重新启动之前弹出可启动媒体
--kexec
将已安装的系统加载到内存中
例: reboot --eject
- shutdown
安装成功完成后关闭系统
例: shutdown
- halt
等待用户在重新启动之前按下某个键
例: halt
- eula
接受许可协议
--agreed
接受最终用户许可协议
例: eula --agreed
软件包选择
%packages
%end
选项
- @^ 整个环境
- @ 指定组
- wget 软件包
- - 排除软件包或组
参数
--default
安装默认软件包组
--excludedocs
不要安装软件包中的任何文档
--ignoremissing
忽略安装源中缺少的软件包、组和环境
--instLangs=
指定要安装的语言列表
--multilib
允许在 64 位系统中安装 32 位软件包
预安装脚本
%pre
%end
参数
--interpreter=
指定不同的脚本语言
--erroronfail
显示错误并在脚本失败时暂停安装
--log=
将脚本的输出记录到指定的日志文件
例
#!/bin/sh
hds=""
mymedia=""
for file in /proc/ide/h* do
mymedia=`cat $file/media`
if [ $mymedia == "disk" ] ; then
hds="$hds `basename $file`"
fi
done
set $hds
numhd=`echo $#`
drive1=`echo $hds | cut -d' ' -f1`
drive2=`echo $hds | cut -d' ' -f2`
#Write out partition scheme based on whether there are 1 or 2 hard drives
if [ $numhd == "2" ] ; then
#2 drives
echo "#partitioning scheme generated in %pre for 2 drives" > /tmp/part-include
echo "clearpart --all" >> /tmp/part-include
echo "part /boot --fstype xfs --size 75 --ondisk hda" >> /tmp/part-include
echo "part / --fstype xfs --size 1 --grow --ondisk hda" >> /tmp/part-include
echo "part swap --recommended --ondisk $drive1" >> /tmp/part-include
echo "part /home --fstype xfs --size 1 --grow --ondisk hdb" >> /tmp/part-include
else
#1 drive
echo "#partitioning scheme generated in %pre for 1 drive" > /tmp/part-include
echo "clearpart --all" >> /tmp/part-include
echo "part /boot --fstype xfs --size 75" >> /tmp/part-include
echo "part swap --recommended" >> /tmp/part-include
echo "part / --fstype xfs --size 2048" >> /tmp/part-include
echo "part /home --fstype xfs --size 2048 --grow" >> /tmp/part-include
fi
安装后脚本
%post
%end
参数
--interpreter=
指定不同的脚本语言
--nochroot
在 chroot 环境之外运行
--erroronfail
显示错误并在脚本失败时暂停安装
--log=
将脚本的输出记录到指定的日志文件中
例
%post --log=/var/log/post.log
#!/bin/bash
#change net device to ethx
#sed -i 's/quiet"/quiet net.ifnames=0 biosdevname=0"/g' /etc/default/grub
#grub2-mkconfig -o /boot/grub2/grub.cfg
cd /etc/sysconfig/network-scripts
before_network_script=$(ls ifcfg-*|grep -v lo|grep -v eth*)
net_dev_num=$(ls ifcfg-*|grep -v lo|wc -l)
rm -rf $before_network_script
for ((i=0;i<$net_dev_num;i++)); do
echo "TYPE=Ethernet
BOOTPROTO=static
DEVICE=eth$i
ONBOOT=no
DNS1=
IPADDR=
GATEWAY=
NETMASK=" |tee > /etc/sysconfig/network-scripts/ifcfg-eth$i
done
#add pcadmin to sudoers
echo "tmpos ALL=(ALL) ALL" >> /etc/sudoers
# add tmpos to group users
usermod -a -G users tmpos
# kolla
systemctl disable postfix
systemctl disable NetworkManager
systemctl enable docker
systemctl enable ntpd.service
mkdir -p /etc/systemd/system/docker.service.d
tee /etc/systemd/system/docker.service.d/kolla.conf <<'EOF'
[Service]
MountFlags=shared
EOF
cp -r /usr/share/kolla-ansible/etc_examples/kolla /etc/kolla/
cp -r /usr/share/kystack /opt
%end
Anaconda 配置
设置密码策略
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
软件包
rpm -qa >> /root/install.log
awk '{print $2}' /root/install.log | xargs -i cp /media/Packages/{}.rpm /root/PanIOS/Packages/
yum -y install --downloadonly --downloaddir=
[root@localhost data]# cat exp.sh
#!/bin/bash
cat << EOF
<group>
<id>$0</id>
<name>$0</name>
<name xml:lang="en_US">$0</name>
<description>$0 packages</description>
<default>false</default>
<uservisible>false</uservisible>
<packagelist>
EOF
for i in $* ; do
echo " <packagereq type="default">$i</packagereq>"
done
cat << EOF
</packagelist>
</group>
EOF
[root@localhost data]# sh exp.sh wget unzip lrzsz tree
USEAGE:
mv exp.sh [groupid]
sh [groupid] [pkg]...
制作镜像
mkisofs -o ../autoinstall_centos_79.iso \
-b isolinux/isolinux.bin \
-c isolinux/boot.cat \
-no-emul-boot \
-boot-load-size 4 \
-boot-info-table \
-R -J -v -T ./
评论