Shell 脚本自动安装cobbler(改进+填坑)

前言:

在这一篇博客写完后,虽然那个shell脚本可以成功安装cobbler服务,但是2个脚本毕竟不方便,而且在写脚本的过程中,出现的好多问题都没有找到原因。但我没有放弃,在我的不断摸索中,终于找到了原因和解决办法,现在分享给大家,希望对大家能有所帮助!

脚本环境

1.linux centos 7 系统
2.系统可连接外网
3.网络模式:NAT模式

实验步骤

1.上传cobbler脚本到Linux系统/root目录下

chmod +x *.sh 添加执行权限

2.脚本cobbler.sh详解

#!/bin/bash

下载相关软件包

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-11.noarch.rpm &&yum makecache && yum install cobbler cobbler-web dhcp tftp-server pykickstart httpd rsync xinetd tree -y
}

修改cobble,fttpr配置文件

setup_file()
{
echo -e "\033\t[34m 正在修改cobbler相关配置文件 ... \033[0m" && sleep 1
net=`ifconfig ens33 | grep "netmask" | awk ‘{print $2}‘ | cut -c 1-10`
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
}

检查所有服务状态

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 &&check_service
}

#执行函数
main

坑点及解决过程

1. cobbler相关包重复下载,如下图:

出错原因:由于我取得函数名字(yum)和其中命令(yum)相同 ,使得脚本运行函数yum后读取到yum命令时误以为是yum函数,于是再次执行函数yum内容,当读取到yum命令,再次执行函数yum...如此陷入了死循环!

解决方法:修改函数名,不要和任何命令相同即可解决!

2.命令" systemctl start httpd && systemctl start cobblerd && cobbler sync && systemctl restart dhcpd "脚本执行报错,但单独执行或分开到另一个脚本执行成功,报错信息如下图:

报错原因分析:在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



4.验证脚本




总结:

1.这篇博客是在之前博客基础上再次改进了,这次找出了上次入坑的原因和解决方法,知识点部分可参考 https://blog.51cto.com/13760351/2397130
2.坑点2中,涉及到了Linux内核知识,这方面知识,我不懂,没写出来,以后学习内核知识,再详细补充到博客上面,如有大牛精通这个,请不吝赐教!
3.博客脚本仅供参考,如有需要可去我的资料下载原文件

原文地址:https://blog.51cto.com/13760351/2412169

时间: 2024-07-28 19:04:29

Shell 脚本自动安装cobbler(改进+填坑)的相关文章

shell 脚本自动安装jdk-6u34-linux-x64-rpm.bin 跳过回车自动安装

上代码: #!/bin/bash #Engine server install #Write by guojr #Set Engine server dir jdk=jdk-6u34-linux-x64-rpm.bin chmod o+x $jdk && echo -e "\n" | ./$jdk; ( cat <<EOF         #set java environment         JAVA_HOME=/usr/java/jdk1.6.0_3

Shell 脚本自动安装公司内部邮箱服务器--Postfix

简介: Postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件.postfix是Wietse Venema想要为使用最广泛的sendmail提供替代品的一个尝试.在Internet世界中,大部分的电子邮件都是通过sendmail来投递的,大约有100万用户使用sendmail,每天投递上亿封邮件.这真是一个让人吃惊的数字.Postfix试图更快.更容易管理.更安全,同时还与sendmail保持足够的兼容性. 搭建企业邮箱的好处: 1.全面统一企业形象,

shell脚本自动安装nginx

写一脚本,实现对nginx的自动化下载,安装,启动,停止 #!/bin/sh ###nginx install shell SOFT_PATH=/data/softNGINX_FILE=nginx-1.14.2.tar.gzDOWN_PATH=http://nginx.org/download/ if [ $# -ne 1 ];then echo "USAAGE:$0{download or start or install or stop}" exit 0 fi if [ $UID

使用shell脚本自动安装Apache2.4.35

安装环境Centos7,联网进行安装.脚本如下: #!/bin/bash[ $(id -u) != "0" ] && echo "error,not root user" && exit 1export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/bin:/usr/sbinwhich httpdif [ $? -eq 0 ];thenyum remove 'yum list

shell脚本自动编译安装Apache

shell脚本自动安装Apache,适用于CentOS #!/bin/bash ##################################################### #Create date 2018.4.10 #Author: wansheng #Function: shell script install apache2.4 #Email: [email protected]  #System: Linux CentOS-7 ######################

Shell脚本自动部署(编译)LAMP平台

Shell脚本自动部署(编译)LAMP平台 LAMP是当下非常流行的一套Web架构,我们可以在GNU/Linux下通过其他人打包的程序包来进行安装; 但是在生产环境中,很多时候都需要我们自己定制安装AMP,编译安装LAMP有以下几个优点 根据生产环境灵活定制程序 优化编译参数,提高性能 解决不必要的软件依赖 友情提示:对编译安装有疑问的朋友, 查看我以前写的博客:教你使用rpm.yum.编译等方式安装软件 点击此处获得更好的阅读体验 为什么要用脚本进行部署? 在很多情况下部署LAMP平台并不止一

用shell脚本自动化安装hadoop

一.概述 1.1 简介 本文主要介绍怎样用 shell 实现 hadoop 的自动化安装.关于手动安装 hadoop 的步骤,可以查看以下链接: http://www.cnblogs.com/13bear/articles/3700842.html 1.2 环境 OS: CentOS release 6.4 (Final) Hadoop:Apache hadoop V1.2.1 1.3 脚本下载 http://pan.baidu.com/s/1eQHyfZk 二.脚本综述 2.1 脚本目录列表

Shell脚本-----自动备份Mysql数据库

脚本的整体思路 1.定义需要的变量 2.利用for循环备份需要备份的库,并以库名-当天日期.sql命名,并记录相关日志 3.建立备份当天的日期的目录,向备份的Sql文件移动到该目录 4.压缩打包该目录,以节省空间,打包成功后删除该目录 5.备份目录只备份七天的数据库,第八天删除第一天的备份,目录只会存在连续七天的备份文件 6.查找备份目录下的.log日志文件,超过七天的删除 #!/bin/bash mysql_bin=/usr/local/tdoa/mysql/bin/mysqldump use

shell脚本自动加黑恶意攻击IP

shell脚本自动加黑恶意攻击IP 系统环境:Centos 6.5 X64 如果我们对所有用户开放了SSH 22端口,那么我们就可以在/var/log/secure文件里查看,这里面全是恶意攻击的IP ,那么我们又该如何拒绝这些IP在下次攻击时直接把他拉黑,封掉呢? 或者这个IP再试图登陆4次或7次我就把他拒绝了,把他这个IP永久的封掉呢?这个时候我们就可以用这下面这个脚本来实现. [[email protected] ssh]# vi /etc/ssh/blocksship #!/bin/ba