KICKSTART无人值守安装系统shell

bash -n   test.bash   #查看bash是否存在语法错误
bash -x   test.bash   #查看bash详细的执行过程

vi test.sh
chmod 777 test.sh

#!/bin/bash
#系统环境准备
ip link set dev ens37 up
ip addr add 10.100.10.1/24 dev ens37
systemctl restart network

#安装DHCP
dhcp_conf="/etc/dhcp/dhcpd.conf" #dhcp配置文件
yum -y install dhcp
mv ${dhcp_conf} d h c p c o n f b a c k u p c a t &gt; {dhcp_conf}_backup cat&gt; {dhcp_conf}<<EOF
subnet 10.100.10.0 netmask 255.255.255.0 {
range 10.100.10.10 10.100.10.254; #可分配的起始IP-结束IP
option subnet-mask 255.255.255.0; #设定netmask
default-lease-time 21600; #设置默认的IP租用期限
max-lease-time 43200; #设置最大的IP租用期限
next-server 10.100.10.1; #告知客户端TFTP服务器的ip
filename “/pxelinux.0”; #告知客户端从TFTP根目录下载pxelinux.0文件
#option domain-name-servers www.baidu.com;
#option domain-name “10.100.10.1”;
#option routers 10.100.10.1;
#option broadcast-address 10.100.10.255;
}
EOF

#DHCP指定监听网卡
dhcpd_service_old="/usr/lib/systemd/system/dhcpd.service" #原dhcp服务文件
dhcpd_service="/etc/systemd/system/dhcpd.service" #dhcp服务文件
cp ${dhcpd_service_old} ${dhcpd_service}
sed -i ‘s/dhcpd --no-pid/dhcpd --no-pid ens37/g’ ${dhcpd_service} #指定监听网卡
#sed -i ‘/dhcpd --no-pid/a\ens37’ #在下一行添加
systemctl --system daemon-reload
systemctl restart dhcpd.service

#安装TFTP服务
tftp_conf="/etc/xinetd.d/tftp" #tftp配置文件
yum -y install xinetd tftp-server
cp ${tftp_conf} ${tftp_conf}_backup
sed -i ‘s/disable = yes/disable = no/g’ ${tftp_conf} #将disable改为no
systemctl restart xinetd
systemctl restart tftp.socket
systemctl restart tftp.service

#配置HTTP服务
http_default_dir="/var/www/html" #http默认发布目录
http_dir="${http_default_dir}/centos-7" #http发布目录
yum -y install httpd
cd /etc/httpd/conf.d/
mv welcome.conf welcome.conf_backup
mkdir ${http_dir}
mount /dev/cdrom ${http_dir}

#配置支持PXE的启动程序
yum -y install syslinux
tftpboot="/var/lib/tftpboot" #tftp启动文件
default="${tftpboot}/pxelinux.cfg/default" #default文件
cp /usr/share/syslinux/pxelinux.0 ${tftpboot} #复制启动菜单程序文件
cp -a ${http_dir}/isolinux/* ${tftpboot}
mkdir -p ${tftpboot}/pxelinux.cfg #新建一个pxelinux.cfg目录,存放客户端的配置文件
cp ${http_dir}/isolinux/isolinux.cfg ${default}

#整合编辑default配置文件
mv ${default} d e f a u l t b a c k u p c a t &gt; {default}_backup cat&gt; {default}<<EOF
default ks
prompt 0
label ks
kernel vmlinuz
append initrd=initrd.img ks=http://10.100.10.1/ks_config/centos7-ks.cfg
#告诉安装程序ks.cfg文件在哪里
#append initrd=initrd.img ks=http://10.100.10.1/ks_config/centos7-ks.cfg ksdevice=ens37

ksdevice=eth0代表当客户端有多块网卡的时候,要实现自动化需要设置从eth1安装,不指定的话,安装的时候系统会让你选择,那就不叫全自动化了。

EOF

#创建ks.cfg文件
cd /tmp
cat>/tmp/centos7-ks.cfg<<EOF
auth --enableshadow --passalgo=sha512
url --url=“http://10.100.10.1/centos-7/
text
keyboard --vckeymap=cn --xlayouts=‘cn’
lang zh_CN.UTF-8

network --bootproto=dhcp --device=ens33 --onboot=yes --ipv6=auto --no-activate
network --hostname=localhost.localdomain

rootpw --iscrypted 6 6 X20eRtuZhkHznTb4$dK0BJByOSAWSDD8jccLVFz0CscijS9ldMWwpoCw/ZEjYw2BTQYGWlgKsn945fFTjRC658UXjuocwJbAjVI5D6/
services --enabled=“chronyd”
timezone --utc Asia/Shanghai
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
autopart --type=lvm
clearpart --none --initlabel

%packages
@^minimal
@core
chrony
kexec-tools

%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
EOF

#将cfg文件放置apache的发布目录下,使其让client通过WEB能够访问:
mkdir ${http_default_dir}/ks_config
mv /tmp/centos7-ks.cfg ${http_default_dir}/ks_config

shell脚本中使用sed
sed -i ‘s/原字符串/替换字符串/g’ filename
s后面跟的是分隔符,命令中的三根斜线分隔符可以换成别的符号。原字符串可使用.*这种正则表达式进行整行替换。
单引号里面,s表示替换,特殊字符需要使用反斜线进行转义,但是单引号是没有办法用反斜线转义的,这时候只要把命令中的单引号改为双引号就行了。
末尾加g替换每一个匹配的关键字,否则只替换每行的第一个。
sed处理过的输出是直接输出到屏幕上的,要保存可以使用参数”-i”直接在文件中替换,或者可以将输出重定向。
sed ‘s/^/添加的头部&/g’ //在所有行首添加
sed ‘s/KaTeX parse error: Expected 'EOF', got '&' at position 2: /&̲添加的尾部/g' //在所有行…s/原字符串/替换字符串/g’ //替换最后一行
sed ‘2,5s/原字符串/替换字符串/g’ //替换2到5行
sed ‘2,$s/原字符串/替换字符串/g’ //替换2到最后一行

在指定文件的指定位置后面添加内容
sed -i ‘/指定位置/a\添加内容’ 文件名

1、删除某行
sed ‘1d’ filename     删除第一行 
sed ‘ d   f i l e n a m e           s e d   1 , 2 d   f i l e n a m e         s e d   2 , d&#x27; filename     删除最后一行 sed &#x27;1,2d&#x27; filename    删除第一行到第二行 sed &#x27;2, d’ filename    删除第二行到最后一行
2、显示某行
sed -n ‘1p’ filename    显示第一行 
sed -n ‘ p   f i l e n a m e         s e d   n   1 , 2 p   f i l e n a m e       s e d   n   2 , p&#x27; filename    显示最后一行 sed -n &#x27;1,2p&#x27; filename   显示第一行到第二行 sed -n &#x27;2, p’ filename   显示第二行到最后一行
3、使用模式进行查询
sed -n ‘/ruby/p’ filename    查询包括关键字ruby所在所有行
sed -n ‘/$/p’ filename      查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义
4、增加一行或多行字符串
sed ‘1a drink tea’ filename    第一行后增加字符串"drink tea"
sed ‘1,3a drink tea’ filename   第一行到第三行后增加字符串"drink tea"
sed ‘1a drink tea\nor coffee’ filename  第一行后增加多行,使用换行符\n
5、代替一行或多行
sed ‘1c Hi’ filename          第一行代替为Hi
sed ‘1,2c Hi’ filename        第一行到第二行代替为Hi

单引号,又叫硬转义,其内部所有的shell 元字符、通配符都会被关掉。注意,硬转义中不允许出现单引号。
双引号,又叫软转义,其内部只允许出现特定的shell 元字符:$用于参数代换 `用于命令代替。
反斜杠,又叫转义,去除其后紧跟的元字符或通配符的特殊意义。

cat <<EOF与cat <<-EOF的区别
两个都是获取stdin,并在EOF处结束stdin,输出stdout。
如果重定向的操作符是<<-,那么分界符(EOF)所在行的开头部分的制表符(Tab)都将被去除。这可以解决由于脚本中的自然缩进产生的制表符。
在vim下我们用:set list来显示特殊字符,^I,即tab字符。

猜你喜欢

转载自blog.csdn.net/qq_41906344/article/details/82948044
今日推荐