在这一篇博客写完后,虽然那个shell脚本能够成功安装cobbler服务,可是2个脚本毕竟不方便,并且在写脚本的过程当中,出现的好多问题都没有找到缘由。但我没有放弃,在个人不断摸索中,终于找到了缘由和解决办法,如今分享给你们,但愿对你们能有所帮助!linux
1.linux centos 7 系统
2.系统可链接外网
3.网络模式:桥接模式
4.脚本百度连接:https://pan.baidu.com/s/1ma53SpaIVVEVdFxmX3Ww1Q
提取码:7ovk ios
chmod +x *.sh 添加执行权限web
#!/bin/bashshell
下载相关软件包centos
down_cobbler()
{
#关闭防火墙,安全性
systemctl stop firewalld
setenforce 0
echo -e "\033\t[34m 正在下载cobbler相关软件包 ... \033[0m" && sleep 1
rpm -ivh https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-13.noarch.rpm &&yum makecache && yum install cobbler cobbler-web dhcp tftp-server pykickstart httpd rsync xinetd tree -y
}安全
修改cobble,fttpr配置文件bash
setup_file()
{
echo -e "\033\t[34m 正在修改cobbler相关配置文件 ... \033[0m" && sleep 1
net=`ifconfig ens33 | grep "netmask" | awk '{print $2}' | awk -F "." '{print $1"."$2"."$3}'`
ip=`ifconfig ens33 | grep "netmask" | awk '{print $2}'`
pass=`openssl passwd -1 -salt 'abc123' 'abc123' `
sed -i "101c default_password_crypted: \"$pass\"" /etc/cobbler/settings
sed -i "s/^server: 127.0.0.1/server: $ip/" /etc/cobbler/settings
sed -i "s/^next_server: 127.0.0.1/next_server: $ip/" /etc/cobbler/settings
sed -i "s/manage_dhcp: 0/manage_dhcp: 1/" /etc/cobbler/settings
sed -i "14s/yes/no/" /etc/xinetd.d/tftp
#修改dhcp模板
sed -i "21s/192.168.1/$net/g" /etc/cobbler/dhcp.template
sed -i "22s/192.168.1.5/$net.1/g" /etc/cobbler/dhcp.template
sed -i "23s/192.168.1.1/$net.2/g" /etc/cobbler/dhcp.template
sed -i "25s/192.168.1.100 192.168.1.254/$net.100 $net.200/" /etc/cobbler/dhcp.template
#启动服务
systemctl enable rsyncd
systemctl start rsyncd
systemctl start xinetd
}服务器
cobbler 同步网络
cobbler_sync()
{
echo -e "\033\t[34m cobbler 正在同步 ... \033[0m" && sleep 1
systemctl start httpd && systemctl start cobblerd &&sleep 2 && cobbler sync && systemctl restart dhcpd
}并发
下载引导操做系统文件和导入系统镜像
loader_images()
{
echo -e "\033\t[34m 正在下载引导操做系统文件和导入系统镜像 ... \033[0m" && sleep 1
cobbler get-loaders && sleep 2 && mount /dev/sr0 /mnt &&cobbler import --path=/mnt/ --name=CentOS-7-x86_64 --arch=x86_64
}
磁盘自定义分区和安装基础软件包(可选)
disk_subarea()
{
cd /var/lib/cobbler/kickstarts/
cp sample_end.ks redhat7.ks
sed -i "s/autopart/#autopart/" redhat7.ks
#磁盘分区,可自定义修改
sed -i '44ipart /boot --fstype="xfs" --size=1024'redhat7.ks
sed -i '45ipart swap --fstype="swap" --size=4096' redhat7.ks
sed -i '46ipart / --fstype="xfs" --grow --size=1' redhat7.ks
#安装基础软件包(可自定义)
sed -i '57ilrzsz' redhat7.ks
sed -i '58inet-tools.x86_64' redhat7.ks
cobbler profile edit --name=CentOS-7-x86_64 --kickstart=/var/lib/cobbler/kickstarts/redhat7.ks
cobbler sync
sleep 2
}
检查全部服务状态
check_service()
{
echo -e "\033\t[34m 正在检查全部服务状态 ... \033[0m" && sleep 1
echo -e "\033\t[34m 正在检查全部服务状态 ... \033[0m" && sleep 1
http=`netstat -ntap | grep :80 | wc -l`
cob=`systemctl status cobblerd | grep "active (running)" | wc -l `
os=`cobbler distro list | wc -l `
syn=`cobbler sync |wc -l`
dhcp=`systemctl status dhcpd | grep "active (running)" | wc -l `
load=`cobbler get-loaders | grep "already exists" | wc -l`
tftp=`systemctl status xinetd | grep "active (running)" | wc -l`
if [ $http -ne 0 ] && [ $cob -eq 1 ] && [ $os -eq 1 ] && [ $syn -gt 1 ] && [ $dhcp -eq 1 ] && [ $load -gt 1 ] && [ $tftp -eq 1 ];then
echo -e "\033\t[34m 全部服务运行正常! \033[0m"
else echo -e "\033\t[31m error,check ! \033[0m"
exit 0
fi
}
函数汇总
main()
{
down_cobbler && setup_file
cobbler_sync &&loader_images
disk_subarea &&check_service
}#执行函数
main
出错缘由:因为我取得函数名字(yum)和其中命令(yum)相同 ,使得脚本运行函数yum后读取到yum命令时误觉得是yum函数,因而再次执行函数yum内容,当读取到yum命令,再次执行函数yum...如此陷入了死循环!
解决方法:修改函数名,不要和任何命令相同便可解决!
报错缘由分析:在cobbler sync这一条命令执行失败,是由于前面命令没执行完成,就执行了cobbler sync命令。那为何单独复制,粘贴这些命令执行就没问题,或者把这些命令分开到其余脚本中执行就能成功呢?
我的猜想:多是脚本执行速度过快,是一条命令没执行完成,就执行了cobbler sync命令,天然会报错。可是,分开脚本执行或单独复制执行,这样操做,给了系统一个缓冲时间,成功运行这些命令!
技术大牛答案:带着疑问,我请教了技术大牛,给出了回答:进程不可并发执行!(就是进程不能同时执行太多命令,和个人猜想差很少。这是Linux 内核知识)
解决方法:1.分开脚本 (上一篇博客采用的!)2.添加sleep 命令,使系统停顿一会,命令是 :
systemctl start httpd && systemctl start cobblerd &&sleep 2 && cobbler sync && systemctl restart dhcpd
1.这篇博客是在以前博客基础上再次改进了,此次找出了上次入坑的缘由和解决方法,知识点部分可参考 http://www.javashuo.com/article/p-rqhooinp-ve.html
2.坑点2中,涉及到了Linux内核知识,这方面知识,我不懂,没写出来,之后学习内核知识,再详细补充到博客上面,若有大牛精通这个,请不吝赐教!
3.博客脚本仅供参考,若有须要可去个人资料下载原文件
https://down.51cto.com/data/24626434.以前是拿虚拟机验证脚本,最近有幸给公司新买服务器装系统,就拍了几张图放上去,证实此脚本是没问题的,实用性强!5.真实服务器比虚拟机操做要更简单,方便。只要服务器链接局域网,开机自动进入系统安装界面,都不用进入bios设置开机启动!