此篇文章主要針對於DELL服務器racadm環境的BIOS配置,以F1/F2 Error提示和硬盤啓動順序更改成例。racadm基礎用法能夠參考前面文章。ios
#!/bin/bash # Sly Chen # date : 2016-09-14 IDRAC_IP=$1 USER='root' PASSWD='calvin' # racadm通用語法定義成變量 COMMAND="racadm -r ${IDRAC_IP} -u $USER -p $PASSWD" # 獲取控制器 CONTROLLER=$($COMMAND storage get controllers --nocertwarn | sed 's/\r/\n/g' | egrep "RAID") # 當前做業數量統計 JOBS=$($COMMAND jobqueue view --nocertwarn | sed -n '/---/,$p' | wc -l) # 以紅色顯示 function red() { echo -e "\033[31;40m$*\033[0m" } # 以綠色顯示 function green() { echo -e "\033[32;40m$*\033[0m" } function sys_reboot { # 定義物理機重啓函數 $COMMAND serveraction powercycle --nocertwarn &> /dev/null if [ $? -eq 0 ]; then echo "${IDRAC_IP}: server powercycle success" else red "${IDRAC_IP}: server powercycle false" exit fi } function jobdel () { # 刪除全部做業記錄 echo "${IDRAC_IP}: start jobqueue delete." while [ ${JOBS} -ne 2 ]; do racadm -r ${IDRAC_IP} -u ${USER} -p ${PASSWD} jobqueue delete --all --nocertwarn &> /dev/null local JOBS=$($COMMAND jobqueue view --nocertwarn | sed -n '/---/,$p' | wc -l) done echo "${IDRAC_IP}: jobqueue delete success." } function get_job_id (){ # 此函數用於判斷任務做業百分比,達到100%時確認做業完成 # 啓用LC $COMMAND set LifeCycleController.LCAttributes.LifecycleControllerState 1 &> /dev/null # 做業進度100%則退出死循環 while true; do # 獲取做業進度百分比 JOB_PERCENT=$(${COMMAND} jobqueue view --nocertwarn | egrep -A7 "$JOBID" | awk -F "=" '/Percent Complete/ {print $2}' | sed 's/\r//g') if [ -z "$JOB_PERCENT" ]; then red "${IDRAC_IP}: Jobqueue is empty" exit elif echo $JOB_PERCENT | egrep '100' &> /dev/null; then break fi sleep 10 done echo "${IDRAC_IP}: Jobqueue create success." } function jobsub_bios (){ # 提交BIOS任務 echo "${IDRAC_IP}: Jobqueue create BIOS.Setup, May be need 15min. Start time: $(date +%Y-%m-%d-%H:%M:%S)" # 提交BIOS做業 local JOBID=$($COMMAND jobqueue create BIOS.Setup.1-1 --nocertwarn | awk '/Commit JID/ {print $4}' | sed 's/\r//g') [ -z "$JOBID" ] && red "${IDRAC_IP}: Did not get the JID" && exit ${COMMAND} serveraction powercycle --nocertwarn &> /dev/null # 判斷做業百分比 get_job_id ${IDRAC_IP} echo "${IDRAC_IP}: BIOS.Setup task jobsub done" } # job submit function jobsub (){ echo "${IDRAC_IP}: Jobqueue create Hard disk task, May be need 15min. Start time: $(date +%Y-%m-%d-%H:%M:%S)" # 提交陣列做業,獲取做業JID local JOBID=$($COMMAND jobqueue create ${CONTROLLER} -s TIME_NOW -r forced --nocertwarn | awk '/Commit JID/ {print $4}' | sed 's/\r//g') # JID爲空則退出 [ -z "$JOBID" ] && red "${IDRAC_IP}: Did not get the JID" && exit ${COMMAND} serveraction powercycle --nocertwarn &> /dev/null # 判斷做業百分比 get_job_id ${IDRAC_IP} echo "${IDRAC_IP}: BIOS Controller task jobsub done" } function disable_error_prompt { # BIOS F1/F2 ErrPrompt echo "${IDRAC_IP}: Start disable ErrPrompt" $COMMAND set BIOS.MiscSettings.ErrPrompt Disabled &> /dev/null echo "${IDRAC_IP}: ErrPrompt disabled done" } function set_hard_disk_first_boot () { # 取出全部啓動設備從新排序,sort命令默認會比較首字符,磁盤啓動會優先於網卡 BOOT_DRIVES_LIST=$($COMMAND get BIOS.BiosBootSettings.BootSeq | awk -F '[=]' '/BootSeq/{print $2}' | sed 's/\r$//;s/,/ /g' | xargs -n 1 | sort | xargs -n 9 | sed 's/ /,/g') $COMMAND set BIOS.BiosBootSettings.BootSeq $BOOT_DRIVES_LIST &> /dev/null } function bios_setup_check () { # 定義BIOS檢查函數 ERR_PROMPT_STATU_CHK=$($COMMAND get BIOS.MiscSettings.ErrPrompt | awk -F '=' '/ErrPrompt/ {print $2}' | sed 's/\r$//') # ErrorPrompt狀態不爲Disabled則報錯 if [ "$ERR_PROMPT_STATU_CHK" == "Disabled" ]; then green "${IDRAC_IP}: BIOS F1/F2 error prompt is Disabled." else red "${IDRAC_IP}: BIOS F1/F2 error prompt is Enabled" exit fi FIRST_BOOT_NAME_CHK=$($COMMAND get BIOS.BiosBootSettings.BootSeq | awk -F "[=.]" '/BootSeq/ {print $2}' | sed 's/\r$//') # 第一啓動不爲HardDisk則報錯,若是有包含CD-ROM啓動,排序需日後移 if [ "$FIRST_BOOT_NAME_CHK" == "HardDisk" ]; then green "${IDRAC_IP}: After testing,Hard disk first boot." else red "${IDRAC_IP}: The boot sequence: ${FIRST_BOOT_NAME_CHK}" exit fi } function main (){ jobdel ${IDRAC_IP} # 獲取第一啓動項設備名稱 FIRST_BOOT_NAME=$($COMMAND get BIOS.BiosBootSettings.BootSeq | awk -F "[=.]" '/BootSeq/ {print $2}' | sed 's/\r$//') # 獲取ErrPrompt項狀態 ERR_PROMPT_STATU=$($COMMAND get BIOS.MiscSettings.ErrPrompt | awk -F '=' '/ErrPrompt/ {print $2}' | sed 's/\r$//') # 若是BIOS當前設置爲硬盤第一啓動,且F1/F2錯誤提示爲Disabled,則退出,不然執行更改函數 if [ "$FIRST_BOOT_NAME" == "HardDisk" -a "$ERR_PROMPT_STATU" == "Disabled" ]; then echo "${IDRAC_IP}: BIOS F1/F2 errot prompt default is Disabled" echo "${IDRAC_IP}: Hard disk drive default is the first boot" exit elif [ "$FIRST_BOOT_NAME" != "HardDisk" -a "$ERR_PROMPT_STATU" == "Disabled" ]; then set_hard_disk_first_boot echo "${IDRAC_IP}: BIOS F1/F2 errot prompt default is Disabled" jobsub_bios ${IDRAC_IP} elif [ "$FIRST_BOOT_NAME" == "HardDisk" -a "$ERR_PROMPT_STATU" == "Enabled" ]; then echo "${IDRAC_IP}: Hard disk drive default is the first boot" disable_error_prompt jobsub_bios ${IDRAC_IP} elif [ "$FIRST_BOOT_NAME" != "HardDisk" -a "$ERR_PROMPT_STATU" == "Enabled" ]; then set_hard_disk_first_boot disable_error_prompt jobsub_bios ${IDRAC_IP} else red "${IDRAC_IP}: Get Bios valus error" exit 3 fi bios_setup_check ${IDRAC_IP} } main ${IDRAC_IP}