shell脚本一键部署cobbler服务器_20210715
2021/7/15 7:05:57
本文主要是介绍shell脚本一键部署cobbler服务器_20210715,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录
- PXE简介
- kickstart简介
- Cobbler简介
- 功能实现
一、PXE简介
PXE,就是预启动执行环境,是一种引导启动的方式。这种协议一般由两部分构成,一部分是服务器端,一个是客户端。简单来说,我们通过这种方式可以自己创建一个“安装源”,在安装系统的时候只要能找到这个“源”便可以实现系统的安装。
在实现无人值守的安装前,我们必须要搭建一些服务,来实现“安装源”的建立,例如ftp、http、tftp、dhcp等。当一台主机启动时,标准输入输出会将PXE客户端调入我们的内存中进行相关的操作,并提示相关的选项,在这里我们可以进行选择。PXE的客户端通过网络下载(download)启动文件到本地运行。具体过程是,PXE客户端通过网卡向局域网内发送ip请求,然后DHCP服务器会提供给给它一个ip地址和系统安装所需要的文件,接下使用接收到的文件进行系统安装。而安装的过程又需要其他服务器提供的资源,例如:yum源,内核文件等,当主机拿到这些资源,便可以顺利的安装了。最终结果是:任意一台主机在选着网络启动时会获取DHCP服务器分发的ip,通过通过获取到的ip地址与局域网内的TFTP服务器通信并获取启动文件,与FTP或者HTTP通信并获取yum源文件及内核文件等。之后开始自动安装,而这个过程不需要人在做任何操作。
PXE安装优点,这种安装系统的方式可以不受光驱,光盘以及一些外部设备的限制,还可以做到无人值守,大大减轻了运维人员的工作负荷,像在一些主机数量庞大的机房进行批量安装,PXE将是你不二的选择。 1
PXE安装方案总体如下(DHCP/TFTP/HTTP服务器可以设置在同一个服务器内):
二、kickstart简介
KickStart是一种无人职守安装方式。KickStart的工作原理是通过记录典型的安装过程中所需人工干预填写的各种参数,并生成一个名为ks.cfg的文件;在其后的安装过程中(不只局限于生成KickStart安装文件的机器)当出现要求填写参数的情况时,安装程序会首先去查找KickStart生成的文件,当找到合适的参数时,就采用找到的参数,当没有找到合适的参数时,才需要安装者手工干预。这样,如果KickStart文件涵盖了安装过程中出现的所有需要填写的参数时,安装者完全可以只告诉安装程序从何处取ks.cfg文件,然后去忙自己的事情。等安装完毕,安装程序会根据ks.cfg中设置的重启选项来重启系统,并结束安装。
三、Cobbler简介
3.1、Cobbler简介
Cobbler是一个免费开源系统安装部署软件,用于自动化网络安装操作系统。Cobbler 集成了 DNS, DHCP, 软件包更新,带外管理以及配置管理,方便操作系统安装自动化。Cobbler 可以支持PXE启动, 操作系统重新安装,以及虚拟化客户机创建,包括Xen, KVM or VMware. Cobbler透过koan程序以支持虚拟化客户机安装。Cobbler可以支持管理复杂网路环境,如建立在链路聚合以太网的桥接环境。
该工具使用python开发,小巧轻便(才15k行python代码),使用简单的命令即可完成PXE网络安装环境的配置,同时还可以管理DHCP、DNS、以及yum仓库、构造系统ISO镜像。
Cobbler支持命令行管理,web界面管理,还提供了API接口,可以方便二次开发使用。Cobbler客户端Koan支持虚拟机安装和操作系统重新安装,使重装系统更便捷。
Cobbler提供以下服务集成:
- PXE服务支持
- DHCP服务管理
- DNS服务管理
- 电源管理
- Kickstart服务支持
- yum仓库管理
- TFTP (PXE启动时需要)
- Apache(提供kickstart 的安装源,并提供定制化的kickstart配置)
同时,它和apache做了深度整合。通过 cobbler,可以实现对RedHat/Centos/Fedora系统的快速部署,同时也支持Suse 和Debian(Ubuntu)系统。3
注1:通过pxe+kickstart已可简单实现了自动化安装,但只能实现单一版本安装,当需要部署不同版本或不同引导模式(BIOS、EFI)时,此种方式就不够灵活。而Cobbler正是为了解决此问题而设计的。如果只是用pxe+kickstart方式推荐阅读参考文献11
注2:这是对pxe的二次封装,在pxe当中,我们还需要手动的去部署dhcp和tftp等相关服务。在cobbler中,相关的配置、软件、服务等都被集成在了一起,管理起来能够更简单。4
注3:cobbler装机系统是较早前kickstart的升级版,优点比较容易配置,还自带web界面比较易于管理,不足在于中文资料较少。和 Kickstart不同的是,使用cobbler不会因为在局域网中启动了dhcp而导致有些机器因为默认从pxe启动在重启服务器后加载tftp内容导 致启动终止。通过配置cobbler自动部署DHCP、TFTP、HTTP,在安装过程中加载kiskstart无人值守安装应答文件实现无人值守。从客户端使用PXE引导启动安装。
3.2 Cobbler工作流程
流程解释
- client裸机配置了从网络启动后,开机后会广播包请求DHCP服务器(cobbler server)发送其分配好的一个IP
- DHCP服务器(cobbler server)收到请求后发送responese,包括其ip地址
- client裸机拿到ip后再向cobbler server发送请求OS引导文件的请求
- cobbler server告诉裸机OS引导文件的名字和TFTP server的ip和port
- client裸机通过上面告知的TFTPserver地址通信,下载引导文件
- client裸机执行该引导文件,确定加载信息,
选择要安装的os,
期间会再向cobbler server请求kickstart文件和os image - cobbler server发送请求的kickstart和os iamge.
- client裸机加载kickstart文件 .client裸机接收os image,安装该os image
主要服务
- DHCP服务分配IP地址
- Client(获取IP地址、Next_server IP地址)
- Next_server(获取启动内核、initrd等文件)
- tftp (PXE引导文件、启动Cobbler选择界面)
- kickstart (确定加载项,根据NFS,httpd,ftp等共享)
3.3 Cobbler各组件之间关系
3.4 Cobbler安装包介绍
软件包: cobbler #cobbler程序包 cobbler-web #cobbler的web服务包 pykickstart #cobbler检查kickstart语法错误 httpd #Apache web服务 dhcp #Dhcp服务 tftp #tftp服务 xinetd #超级守护进程服务 配置文件: /etc/cobbler # 配置文件目录 /etc/cobbler/settings # cobbler主配置文件 /etc/cobbler/dhcp.template # DHCP服务的配置模板 /etc/cobbler/tftpd.template # tftp服务的配置模板 /etc/cobbler/rsync.template # rsync服务的配置模板 /etc/cobbler/iso # iso模板配置文件目录 /etc/cobbler/pxe # pxe模板文件目录 /etc/cobbler/power # 电源的配置文件目录 /etc/cobbler/users.conf # Web服务授权配置文件 /etc/cobbler/users.digest # web访问的用户名密码配置文件 /etc/cobbler/dnsmasq.template # DNS服务的配置模板 /etc/cobbler/modules.conf # Cobbler模块配置文件 /var/lib/cobbler # Cobbler数据目录 /var/lib/cobbler/config # 配置文件 /var/lib/cobbler/kickstarts # 默认存放kickstart文件 /var/lib/cobbler/loaders # 存放的各种引导程序 /var/www/cobbler # 系统安装镜像目录 /var/www/cobbler/ks_mirror # 导入的系统镜像列表 /var/www/cobbler/images # 导入的系统镜像启动文件 /var/www/cobbler/repo_mirror # yum源存储目录 /var/log/cobbler # 日志目录 /var/log/cobbler/install.log # 客户端系统安装日志 /var/log/cobbler/cobbler.log # cobbler日志
3.5 Cobbler设计模式
- 发行版(distro) : 表示一个操作系统。它承载了内核和initrd的信息,以及内核参数等其他数据。
- 存储库(repository) : 保存一个yum或rsync存储库镜像信息。
- 配置文件(profile) :包含一个发行版(distro)、一个kickstart文件以及可能的存储库(repository)还包含更多特定的内核参数及其他数据。
- 系统(system) : 表示要配给的机器,它包含一个配置文件或一个镜像,还包含IP和MAC地址、电源管理(地址、凭据、类型)以及更专业的数据等信息。
- 镜像(image) : 可替换一个包含不属于此类别的文件发行版对象,(例如: 无法分为内核和initrd的对象)
3.6 Cobbler Units 软件包及配置流程
- cobbler
- cobbler-web
大体配置流程如下:
- 安装cobbler,依据cobbler check检查结果,对settings主配置文件,进行相关修正设置;
- 启动依赖服务:httpd、cobbler服务,使用cobbler sync同步配置
- 配置cobbler所依赖的服务:
** dhcp : ISC dhcpd dnsmasq(必需服务,选其中一种管理即可)
** dns : bind dnsmqsq(可选)
** rsync : rsync(必需服务)
** tftp : in.tftpd(tftp-server) cobbler自带的tftp(必需服务,选其中一种管理即可) - 配置cobbler组件
3.7 Cobbler命令简介
cobbler check 核对当前设置是否有问题 cobbler list 列出所有的cobbler元素 cobbler report列出元素的详细信息 cobbler sync 同步配置到数据目录,更改配置最好都要执行下 cobbler reposync 同步yum仓库 cobbler distro 查看导入的发行版系统信息 cobbler system 查看添加的系统信息 cobbler profile查看配置信息 cobbler distro list 显示导入的镜像 cobbler profile report 显示镜像报告(镜像配置信息) cobbler profile edit --name=CentOS7.9_2009-x86_64 --kickstart=/var/lib/cobbler/kickstarts/centos7.9-2009.cfg 为2个镜像指定ks文件 cobbler profile edit --name=CentOS7.9_2009_jisuan-x86_64 --kickstart=/var/lib/cobbler/kickstarts/centos7.9-2009_jisuan.cfg 为2个镜像指定ks文件 cobbler profile report 显示镜像报告(镜像配置信息)
四、服务选型及介绍
4.1 DHCP服务
由于我们是实现自动化批量安装部署,所以,能够与其他主机通信是前提,而要想获取IP并实现通信,我们必须要有DHCP服务器为大量的主机提供ip地址才行。
DHCP就是动态主机设置协议,主要是为客户端分发IP,并且是自动分发IP的,一台主机通过DHCP获取的地址是动态的,每次获取的地址都有可能不同,改地址是DHCP服务器暂时分配给用户使用的,当主机关机之后则会返回这个ip地址,此时如果有其他用户请求,DHCP服务器则会将该IP地址分配给他。局域网中的每台主机都可以充当DHCP服务器,只要我们安装DHCP服务,并做相应的配置即可,这里的配置主要是子网的配置,配置其他主机能使用IP地址的范围,例如:配置子网为192.168.14.0,该子网内主机获取IP的范围为192.168.14.1~192.168.14.100。
那么我们就可以打开DHCP的配置文件/etc/dhcp/dhcpd.conf做如下配置:
option domain-name "example.org"; option domain-name-servers ns1.example.org, ns2.example.org; default-lease-time 600; max-lease-time 7200; log-facility local7; subnet 10.5.5.0 netmask 255.255.255.224 { range 10.5.5.26 10.5.5.30; option domain-name-servers ns1.internal.example.org; option domain-name "internal.example.org"; option routers 10.5.5.1; option broadcast-address 10.5.5.31; default-lease-time 600; max-lease-time 7200; next-server 192.168.25.107; filename "pxelinux.0"; }
4.2 HTTP服务
由于我们要获取安装系统服务的yum源以及内核文件,虚拟根文件,这些文件都是大文件,在传输时我们必须保证其能够安全传输,所以我们选择了HTTP服务,当然了,选择FTP服务也是可以的。
HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。是互联网上广泛试用的协议。是用于从WWW服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分等。HTTP包含命令和传输信息,不仅可用于Web访问,也可以用于其他因特网/内联网应用系统之间的通信,从而实现各类应用资源超媒体访问的集成。
4.3 TFTP服务
TFTP是一种文件传输服务,用于服务器与客户端进行文件的传输,不过他只能进行简单的文件传输,这个服务开销不大,所以并不能进行大文件的传输,多用于小文件的传输。他没有FTP那么强大,但是TFTP使用UDP协议传输数据,有些时候比FTP更加方便,它所监听的端口为69。由于我们是在局域网中,系统相对安全,而提供的数据也不是很大,所以TFTP是实现PXE的不二选择。
五、功能实现
部署脚本
#!/bin/bash #AUTHOR:ytchen5 #VERSION:1.0.0 #DATE:2021-07-12 #MODIFY: 2021-07-15 #FUNCTION:一键部署cobbler服务器 #DESCRIBE:基于CentOS Linux release 7.6.1810 (Core) #NOTICES: # 定义变量,运行环境脚本 root_pwd="root" #装完系统后的root密码 #输出不同颜色的字体 #$1代表颜色编号,$2代表输出内容(提示用32,成功用92,错误用31,重点提醒用96,说明性用36) cecho(){ echo -e "\033[$1m$2\033[0m" } # 获取系统的的网络信息从而定义网络参数变量 get_net(){ IP_TMP=`ip addr show $1 | tr " " ":" | awk -F: '/:inet:/{print $0}'| awk -F: '{print $6}'` IP=${IP_TMP%/*} MASK_CODE=${IP_TMP#*/} case ${MASK_CODE} in 24) MASK="255.255.255.0";; 25) MASK="255.255.255.128";; 26) MASK="255.255.255.192";; 27) MASK="255.255.255.224";; 28) MASK="255.255.255.240";; 29) MASK="255.255.255.248";; *) exit 1 esac Gateway_TMP=`ip route | grep -e $dev | grep -i default | awk -F" " '{print $3}'` if [ -z $Gateway_TMP ];then gateway="0.0.0.0" else gateway=${Gateway_TMP} fi } #Centos7安装多个工具 Yum_Mul(){ Array=($1) for i in ${Array[*]} do stat=`rpm -qa $i` if [ -z ${stat} ];then echo -en "Installing $i......\t\t\t\t" yum -y install $i --showduplicates &> /dev/null [ $? -eq 0 ] && echo -e "\e[32;1m[OK]\e[0m" || cecho 31 "$i 安装失败" && sleep 6 && exit 71 else cecho 31 "${stat} already installed" && sleep 6 fi done } CONFIG_IP_CENTOS7(){ get_net $1 cp /etc/sysconfig/network-scripts/ifcfg-$1{,.bak} [ -f /etc/sysconfig/network-scripts/ifcfg-$1.bak ] && >/etc/sysconfig/network-scripts/ifcfg-$1 cat >> /etc/sysconfig/network-scripts/ifcfg-$1 << EOF TYPE=Ethernet BOOTPROTO=static NAME=$1 DEVICE=$1 ONBOOT=yes IPADDR=$IP NETMASK=$MASK GATEWAY=$gateway EOF systemctl restart NetworkManager.service } #关闭防火墙,禁用selinux Security_Conf(){ systemctl disable firewalld &>/dev/null systemctl stop firewalld &>/dev/null local selinux_mode=$(grep '^SELINUX=' /etc/selinux/config |awk -F'=' '{print $2}') if [ ${selinux_mode} != "disabled" ];then setenforce 0 sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config cecho 92 "selinux需重启系统才能生效" fi } # 启动相关程序函数 STR_SVC(){ SERVICE=$1 systemctl status $1 &>/dev/null if [ $? -eq 0 ];then echo "$1 is already running" else systemctl restart $1 &>/dev/null fi systemctl status $1 &>/dev/null [ $? -eq 0 ] && echo "$1 started successfully" || echo "$1 Boot failure" } # 网络环境准备 network(){ DEVICE=(`ip addr | grep :*eth[0-10]*: | tr " " ":" | awk -F: '{print $3}'|tr "\n" " "`) DEVICE_1=${#DEVICE[*]% *} read -p "发现了${DEVICE_1[@]}块网卡${DEVICE[*]} 请您输入需要配置的网卡:" dev get_net $dev # 固定IP地址 CONFIG_IP_CENTOS7 $dev } # 配置yum源 Yum(){ yum_dir=/etc/yum.repos.d/ repo_file_count=`find $yum_dir ! -name "yum.repos.d" -type d -prune -o -type f -print| wc -l` repo_files=(`find $yum_dir ! -name "yum.repos.d" -type d -prune -o -type f -print`) if [[ ${repo_file_count} -gt 0 ]];then [ ! -d ${yum_dir}bak ] && mkdir ${yum_dir}bak i=0 while [ $i -lt ${#repo_files[*]} ] do mv $yum_dir${repo_files[$i]##*/} ${yum_dir}bak/ let i++ done fi read -p "请问你当前的服务器可以连接互联网吗?请输入(yes|no)" internet if [[ $internet == "yes" ]]; then curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum repolist yum makecache else echo "需要连接互联网才能部署,否则需要手动安装软件及依赖组件" exit fi } # 安装软件包 InstallSoft(){ soft_packets=("cobbler-web" "cobbler" "unzip" "dhcp" "tftp-server" "pykickstart" "httpd" "xinetd") Yum_Mul "${soft_packets[*]}" #或者用下面的命名在线下载引导文件 #cobbler get-loaders } # 修改配置文件 modify_conf(){ # 定义变量 cobbler_conf=/etc/cobbler/settings httpd_conf=/etc/httpd/conf/httpd.conf rsync_conf=/etc/xinetd.d/rsync tftpd_conf=/etc/xinetd.d/tftp dhcp_conf=/etc/dhcp/dhcpd.conf #备份 [ ! -f ${cobbler_conf}.save ] && cp ${cobbler_conf} ${cobbler_conf}.save [ ! -f ${httpd_conf}.save ] && cp ${httpd_conf} ${httpd_conf}.save #[ ! -f ${rsync_conf}.save ] && cp ${rsync_conf} ${rsync_conf}.save [ ! -f ${tftpd_conf}.save ] && cp ${tftpd_conf} ${tftpd_conf}.save [ ! -f ${dhcp_conf}.save ] && cp ${dhcp_conf} ${dhcp_conf}.save sed -i "s#next_server: [0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}#next_server: ${IP}#" $cobbler_conf sed -i "s#server: [0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}#server: ${IP}#" $cobbler_conf sed -i "s#manage_dhcp: 0#manage_dhcp: 1#" $cobbler_conf sed -i "s#pxe_just_once: 0#pxe_just_once: 1#" $cobbler_conf sed -i "s/manage_dns: 0/manage_dns: 1/" $cobbler_conf sed -ri "/default_password_crypted/s#(.*: ).*#\1\"`openssl passwd -1 -salt 'cobbler' "${root_pwd}"`\"#" $cobbler_conf #sed -i '/diable/ s/yes/no/' $rsync_conf sed -i '/diable/ s/yes/no/' $tftpd_conf sed -i "/^ServerName.*/s/^ServerName.*/ServerName $IP/" $httpd_conf #校验 grep "^next_server:*" $cobbler_conf grep "^server:*" $cobbler_conf grep "^manage_dhcp:*" $cobbler_conf grep "^pxe_just_once:*" $cobbler_conf grep "^manage_tftpd:*" $cobbler_conf grep "^manage_dns:*" $cobbler_conf grep "^ServerName" $httpd_conf # 修改dhcp SET_DHCP(){ cat >>$dhcp_conf<<-EOF option domain-name "${IP}"; option domain-name-servers ${IP}; default-lease-time 600; max-lease-time 7200; log-facility local7; subnet ${IP%.*}.0 netmask ${MASK} { range ${IP%.*}.100 ${IP%.*}.200; option domain-name-servers ${IP}; option domain-name "${IP}"; option routers ${gateway}; option broadcast-address ${IP%.*}.255; } EOF } if [ ! -f ${dhcp_conf} ];then SET_DHCP else mv ${dhcp_conf} /tmp SET_DHCP fi } # #启动相关服务 start_service(){ echo "[ ss -nutlp |grep tftpd &>/dev/null ] || systemctl start tftpd" >> /etc/rc.local #解决tftp开机不启动的问题 chmod +x /etc/rc.local STR_SVC cobblerd STR_SVC httpd STR_SVC tftp STR_SVC rsyncd systemctl restart httpd;systemctl restart cobblerd;sleep 5;cobbler sync #先同步配置文件才能启动dhcpd服务 STR_SVC dhcpd cobbler check } #导入镜像[写绝对路径] import_images(){ image_dir=$1 #镜像路径 mount_dir=/system #挂载目录 [ ! -d $mount_dir ] && mkdir $mount_dir || umount $mount_dir mount $image_dir $mount_dir image_name=`basename $image_dir` name=`echo $image_name |awk -F- '{print $1 "-" $2}'` cobbler import --path=$mount_dir --name=${name} --arch=x86_64 cobbler check } # 导入你准备的ks文件并使用,可以根据实际情况修改 KSFILE_CONFIG(){ ksfile=/var/lib/cobbler/kickstarts/centos7-x86_64.ks cat >>$ksfile<<-EOF # Cobbler for Kickstart Configurator for CentOS 7 by ytchen5 install url --url=$tree text lang en_US.UTF-8 keyboard us zerombr bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet" #Network information $SNIPPET('network_config') #network --bootproto=dhcp --device=eth0 --onboot=yes --noipv6 --hostname=CentOS7 timezone --utc Asia/Shanghai authconfig --enableshadow --passalgo=sha512 rootpw --iscrypted $default_password_crypted clearpart --all --initlabel part /boot --fstype xfs --size 1024 part swap --size 1024 part / --fstype xfs --size 1 --grow firstboot --disable selinux --disabled firewall --disabled logging --level=info reboot %pre $SNIPPET('log_ks_pre') $SNIPPET('kickstart_start') $SNIPPET('pre_install_network_config') # Enable installation monitoring $SNIPPET('pre_anamon') %end %packages @^minimal @compat-libraries @core @debugging @development bash-completion chrony dos2unix kexec-tools lrzsz nmap sysstat telnet tree vim wget %end %post systemctl disable postfix.service %end EOF cobbler profile edit --name=centos7-x86_64 --kickstart=$ksfile cobbler profile report | grep kickstart } #帮助信息 HELP(){ cat << EOF cobbler version 1.1.0 Usage: cobbler [-h] [-all] [-init] [-soft] [-conf][-start][-import 镜像绝对路径] ======================================================================= optional arguments: -h 提供帮助信息 -all 一键式安装(适用于首次安装) -init 关闭防火墙、设置selinux -soft 安装软件包 -conf 修改配置文件 -start 启动服务 -import 导入镜像 -ks 替换ks文件,并使用 EXAMPLE: bash main.sh -import ubuntu-16.04.4-server-amd64.iso EOF } #############################主程序############################# [ $# -eq 0 ] && HELP case $1 in -h) HELP ;; -all) cecho 32 "关闭防火墙,禁用selinux" Security_Conf cecho 32 "配置网络信息,固定IP地址" network cecho 32 "配置YUM源" Yum cecho 32 "安装相关软件包" InstallSoft cecho 32 "修改相关配置文件" modify_conf cecho 32 "启动相关服务" start_service cecho 32 "导入镜像" if [ $# -eq 2 ];then name=$2 suffix=`echo ${name##*.}` [ ${suffix} != 'iso' ] && cecho 31 "Invalid option:bash `basename $0` [-h]" && exit 71 import_images ${name} && exit 0 fi cecho 31 "Invalid option:bash `basename $0` [-h]" cecho 32 "定制ks文件" KSFILE_CONFIG ;; -init) cecho 32 "关闭防火墙,禁用selinux" Security_Conf ;; -soft) cecho 32 "配置网络信息,固定IP地址" network cecho 32 "安装相关软件包" InstallSoft ;; -conf) cecho 32 "修改相关配置文件" network modify_conf ;; -start) cecho 32 "启动相关服务" start_service ;; -import) if [ $# -eq 2 ];then name=$2 suffix=`echo ${name##*.}` [ ${suffix} != 'iso' ] && cecho 31 "Invalid option:bash `basename $0` [-h]" && exit 71 import_images ${name} && exit 0 fi cecho 31 "Invalid option:bash `basename $0` [-h]" ;; -ks) cecho 32 "定制ks文件" KSFILE_CONFIG ;; *) cecho 31 "Invalid option:bash `basename $0` [-h]" ;; esac
这篇关于shell脚本一键部署cobbler服务器_20210715的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-06怎么解决跨域资源共享(CORS)问题?-icode9专业技术文章分享
- 2024-11-06在高德地图中怎么取经纬度-icode9专业技术文章分享
- 2024-11-06如何计算两个GPS坐标之间的距离-icode9专业技术文章分享
- 2024-11-06可视化的操作流程步骤是什么-icode9专业技术文章分享
- 2024-11-06TypeScript面试真题详解与实战攻略
- 2024-11-06TypeScript大厂面试真题解析与实战教程
- 2024-11-05Snowflake Cortex大语言模型函数:让AI数据查询更简单高效
- 2024-11-05Azure开发更轻松:VS Code中的GitHub Copilot for Azure公测版
- 2024-11-05Databricks与Snowflake:数据处理实力大比拼
- 2024-11-05Sealos Devbox 使用教程:使用 Cursor 开发一个高仿苹果官网