此篇文章主要針對於DELL服務器racadm環境的BIOS配置,以F1/F2 Error提示和硬盤啓動順序更改爲例。racadm基礎用法可以參考前面文章。
#!/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}