Shell 腳本自動安裝cobbler(改進+填坑)

前言:

在這一篇博客寫完後,雖然那個shell腳本能夠成功安裝cobbler服務,可是2個腳本畢竟不方便,並且在寫腳本的過程當中,出現的好多問題都沒有找到緣由。但我沒有放棄,在個人不斷摸索中,終於找到了緣由和解決辦法,如今分享給你們,但願對你們能有所幫助!linux

腳本環境

1.linux centos 7 系統
2.系統可鏈接外網
3.網絡模式:橋接模式
4.腳本百度連接:https://pan.baidu.com/s/1ma53SpaIVVEVdFxmX3Ww1Q
提取碼:7ovk ios

實驗步驟

1.上傳cobbler腳本到Linux系統/root目錄下

chmod +x *.sh 添加執行權限web

Shell 腳本自動安裝cobbler(改進+填坑)

2.腳本cobbler.sh詳解

#!/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

坑點及解決過程

1. cobbler相關包重複下載,以下圖:

Shell 腳本自動安裝cobbler(改進+填坑)

出錯緣由:因爲我取得函數名字(yum)和其中命令(yum)相同 ,使得腳本運行函數yum後讀取到yum命令時誤覺得是yum函數,因而再次執行函數yum內容,當讀取到yum命令,再次執行函數yum...如此陷入了死循環!

Shell 腳本自動安裝cobbler(改進+填坑)

解決方法:修改函數名,不要和任何命令相同便可解決!

Shell 腳本自動安裝cobbler(改進+填坑)

2.命令" systemctl start httpd && systemctl start cobblerd && cobbler sync && systemctl restart dhcpd "腳本執行報錯,但單獨執行或分開到另外一個腳本執行成功,報錯信息以下圖:

Shell 腳本自動安裝cobbler(改進+填坑)

報錯緣由分析:在cobbler sync這一條命令執行失敗,是由於前面命令沒執行完成,就執行了cobbler sync命令。那爲何單獨複製,粘貼這些命令執行就沒問題,或者把這些命令分開到其餘腳本中執行就能成功呢?

我的猜想:多是腳本執行速度過快,是一條命令沒執行完成,就執行了cobbler sync命令,天然會報錯。可是,分開腳本執行或單獨複製執行,這樣操做,給了系統一個緩衝時間,成功運行這些命令!

技術大牛答案:帶着疑問,我請教了技術大牛,給出了回答:進程不可併發執行!(就是進程不能同時執行太多命令,和個人猜想差很少。這是Linux 內核知識)

解決方法:1.分開腳本 (上一篇博客採用的!)2.添加sleep 命令,使系統停頓一會,命令是 :
systemctl start httpd && systemctl start cobblerd &&sleep 2 && cobbler sync && systemctl restart dhcpd

執行結果:完美解決問題

3.運行腳本cobbler.sh

Shell 腳本自動安裝cobbler(改進+填坑)Shell 腳本自動安裝cobbler(改進+填坑)
Shell 腳本自動安裝cobbler(改進+填坑)
Shell 腳本自動安裝cobbler(改進+填坑)

4.驗證腳本(這裏用戴爾服務器T30安裝系統)

Shell 腳本自動安裝cobbler(改進+填坑)
Shell 腳本自動安裝cobbler(改進+填坑)
Shell 腳本自動安裝cobbler(改進+填坑)
Shell 腳本自動安裝cobbler(改進+填坑)
Shell 腳本自動安裝cobbler(改進+填坑)

總結:

1.這篇博客是在以前博客基礎上再次改進了,此次找出了上次入坑的緣由和解決方法,知識點部分可參考 http://www.javashuo.com/article/p-rqhooinp-ve.html
2.坑點2中,涉及到了Linux內核知識,這方面知識,我不懂,沒寫出來,之後學習內核知識,再詳細補充到博客上面,若有大牛精通這個,請不吝賜教!
3.博客腳本僅供參考,若有須要可去個人資料下載原文件
https://down.51cto.com/data/24626434.以前是拿虛擬機驗證腳本,最近有幸給公司新買服務器裝系統,就拍了幾張圖放上去,證實此腳本是沒問題的,實用性強!5.真實服務器比虛擬機操做要更簡單,方便。只要服務器鏈接局域網,開機自動進入系統安裝界面,都不用進入bios設置開機啓動!

相關文章
相關標籤/搜索