Hardware/BMC

[BMC/iDRAC] RACADM๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

hello_u 2024. 12. 24. 11:28

 

์—…๋ฌด์ ์œผ๋กœ ํ•˜๋“œ์›จ์–ด๋ฅผ ์ ๊ฒ€ํ•˜๊ธฐ ์œ„ํ•ด BMC๋ฅผ ํ™œ์šฉํ•˜๋Š” ์ผ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. 

BMC(Baseboard Management Controller)๋Š” ์„œ๋ฒ„์˜ ๋ฌผ๋ฆฌ์  ์ƒํƒœ๋ฅผ ์›๊ฒฉ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ 

๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ํ•˜๋“œ์›จ์–ด ๊ด€๋ฆฌ ์นฉ์ž…๋‹ˆ๋‹ค.

Dell์—์„œ๋Š” BMC ์†”๋ฃจ์…˜์ธ iDRAC(Integrated Dell Remote Access Controller)์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Integrated Dell Remote Access Controller

๊ธฐ๋ณธ iDRAC ๊ด€๋ฆฌ๋Š” ์›น ๊ธฐ๋ฐ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

์ง๊ด€์ ์ธ UI๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ์†์‰ฝ๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ ,

๋งˆ์šฐ์Šค ํด๋ฆญ ๋ช‡ ๋ฒˆ์œผ๋กœ ์ „์› ๊ด€๋ฆฌ, ๋กœ๊ทธ ํ™•์ธ ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

UI๋ฅผ ํ†ตํ•œ Lifecycle Log ํ™•์ธ

 

ํ•˜์ง€๋งŒ ๋‹ค์ˆ˜์˜ ์„œ๋ฒ„๋ฅผ ๊ด€๋ฆฌํ•  ๊ฒฝ์šฐ, ๊ฐœ๋ณ„์ ์œผ๋กœ ์›น์— ์ ‘์†ํ•ด์•ผ ํ•˜๋Š” ๋‹จ์ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์„œ๋ฒ„๊ฐ€ 100๋Œ€๋ผ๋ฉด ๋ธŒ๋ผ์šฐ์ €์— IP ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ๋กœ๊ทธ์ธ ํ•˜๋Š” ๊ณผ์ •์„ 100๋ฒˆ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋กœ๊ทธ์ธ ๊ณผ์ • ์ดํ›„ ๋‹ค๋ฅธ ์ž‘์—…๋“ค์„ ํ•ด์•ผํ•œ๋‹ค๋ฉด, ๋” ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ฒ ์ง€์š”.

 

๋‹ค์ˆ˜์˜ ์„œ๋ฒ„ ์ ‘์†์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…

 

RACADM์„ ์ด์šฉํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์„ ์ž๋™ํ™”ํ•˜๊ฑฐ๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ๋Œ€๊ทœ๋ชจ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

RACADM(Remote Access Controller Admin)์€ iDRAC ๊ธฐ๋Šฅ์„ ๋ช…๋ น์ค„์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

 

 

RACADM Syntax Usage

racadm -r <IPAddr> -u <username> -p <password> <subcommand>

# Example
# racadm -r 192.168.0.2 -u root -p xxxx getsysinfo
# racadm -r 192.168.0.2 -u root -p xxxx serveraction powerup

 

์„œ๋ฒ„์˜ ์ „์›์ƒํƒœ๋ฅผ ํ™•์ธ

 

์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ ๋Œ€์ผ ๋–„๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ž‘์—…์„ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#!/bin/bash

# IP ์ฃผ์†Œ ๋ฆฌ์ŠคํŠธ
IP_LIST=("192.168.0.22" "192.168.0.58" "192.168.0.122")

# ์‚ฌ์šฉ์ž๋ช…๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ
USERNAME="root"
PASSWORD="calvin"

# ๊ฐ IP์— ๋Œ€ํ•ด ๋ช…๋ น์–ด ์‹คํ–‰
for IP in "${IP_LIST[@]}"
do
    echo "Checking power status for $IP..."
    racadm -r "$IP" -u "$USERNAME" -p "$PASSWORD" serveraction powerstatus
    echo "------------------------"
done

 

RACADM์€ ์ „์›์ƒํƒœ ํ™•์ธ ๋ฟ์•„๋‹ˆ๋ผ GUI๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” iDRAC ๊ธฐ๋Šฅ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ๋Š” "lclog view" ๋ช…๋ น์–ด๋ฅผ ํ™œ์šฉํ•ด Lifecycle Log ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ณ  ์ €์žฅํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.

 

# racadm_get_lclog.sh

์ง€์ •๋œ ์‹œ๊ฐ„ ๋ฒ”์œ„์˜ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ํ•„์š”์‹œ ํŒŒ์ผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๋”๋ณด๊ธฐ
#!/bin/bash

RACUSER="root"
RACPSWD="calvin"
log_output="false" # ๋กœ๊ทธ ์ €์žฅ ์—ฌ๋ถ€
log_base_dir="./LifeCycleLog" # ๊ธฐ๋ณธ ๋กœ๊ทธ ์ €์žฅ ๋””๋ ‰ํ† ๋ฆฌ
start_time=""
end_time=""

# Usage ์ถœ๋ ฅ ํ•จ์ˆ˜
usage() {
    echo "Usage: $0 [-h <iDRAC_IP> | -f <file_with_iDRAC_IPs>] [-r <start_time>] [-e <end_time>]"
    echo "Options:"
    echo "  -h <iDRAC_IP>   Specify a single iDRAC IP address"
    echo "  -f <file>       Specify a file containing iDRAC IP addresses (one per line)"
    echo "  -r <start_time> Start time for logs in format 'yyyy-mm-dd HH:MM:SS'"
    echo "  -e <end_time>   End time for logs in format 'yyyy-mm-dd HH:MM:SS'"
    exit 1
}

# ๋กœ๊ทธ ์ €์žฅ ์—ฌ๋ถ€ ๋ฌป๊ธฐ
ask_log_saving() {
    read -p "Do you want to save logs? (y/n): " answer
    case $answer in
        [Yy]*) log_output="true" ;;
        [Nn]*) log_output="false" ;;
        *) echo "Invalid input. Defaulting to no log saving."; log_output="false" ;;
    esac
}

# ์˜ต์…˜ ์ฒ˜๋ฆฌ
while getopts "h:f:r:e:" opt; do
    case $opt in
        h)  # ๋‹จ์ผ iDRAC IP
            remote_idrac=$OPTARG
            ;;
        f)  # ํŒŒ์ผ ์ž…๋ ฅ
            ip_file=$OPTARG
            ;;
        r)  # ์‹œ์ž‘ ์‹œ๊ฐ„
            start_time=$OPTARG
            ;;
        e)  # ์ข…๋ฃŒ ์‹œ๊ฐ„
            end_time=$OPTARG
            ;;
        *)  # ์ž˜๋ชป๋œ ์˜ต์…˜
            usage
            ;;
    esac
done

# ์˜ต์…˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ
if [[ -z $remote_idrac && -z $ip_file ]]; then
    echo "Error: You must provide either -h or -f option."
    usage
fi

if [[ -n $remote_idrac && -n $ip_file ]]; then
    echo "Error: Options -h and -f cannot be used together."
    usage
fi

# ๋กœ๊ทธ ์ €์žฅ ์—ฌ๋ถ€ ํ™•์ธ
ask_log_saving

# ๋‚ ์งœ๋ณ„ ๋กœ๊ทธ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
if [[ $log_output == "true" ]]; then
    log_date_dir="${log_base_dir}/$(date +"%Y%m%d")"
    mkdir -p "$log_date_dir"
    echo "Logs will be saved in directory: $log_date_dir"
fi

# iDRAC ๋กœ๊ทธ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜
process_idrac_logs() {
    local ip=$1
    echo "Processing iDRAC: $ip"

    # ๋ช…๋ น์–ด ๊ตฌ์„ฑ
    if [[ -z $start_time && -z $end_time ]]; then
        cmd="racadm -r \"$ip\" -u \"$RACUSER\" -p \"$RACPSWD\" lclog view -s Critical,Warning"
    else
        cmd="racadm -r \"$ip\" -u \"$RACUSER\" -p \"$RACPSWD\" lclog view -s Critical,Warning -r \"$start_time\" -e \"$end_time\""
    fi

    # ๋กœ๊ทธ ์ €์žฅ ๊ฒฝ๋กœ ์ƒ์„ฑ
    if [[ $log_output == "true" ]]; then
        timestamp=$(date +"%H%M%S")
        log_file="${log_date_dir}/${ip}_${timestamp}.log"
        eval "$cmd" 2>&1 | tee "$log_file"
    else
        eval "$cmd"
    fi

    # ์ข…๋ฃŒ ์ฝ”๋“œ ํ™•์ธ
    if [[ $? -ne 0 ]]; then
        echo "Warning: Unable to connect to $ip. Skipping..."
        return 1
    fi
}

# ๋‹จ์ผ IP ์ฒ˜๋ฆฌ
if [[ -n $remote_idrac ]]; then
    # IP ํ˜•์‹ ํ™•์ธ
    if [[ ! $remote_idrac =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
        echo "Error: Invalid IP address format."
        exit 1
    fi
    process_idrac_logs "$remote_idrac"
fi

# ํŒŒ์ผ ๋‚ด IP ์ฒ˜๋ฆฌ
if [[ -n $ip_file ]]; then
    if [[ ! -f $ip_file ]]; then
        echo "Error: File '$ip_file' not found."
        exit 1
    fi

    while IFS= read -r ip || [[ -n $ip ]]; do
        # IP ํ˜•์‹ ํ™•์ธ
        if [[ ! $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
            echo "Warning: Skipping invalid IP address '$ip'"
            continue
        fi
        process_idrac_logs "$ip"
    done < "$ip_file"
fi

๋ช…๋ น์–ด ์‹คํ–‰
๋ช…๋ น์–ด ์ˆ˜ํ–‰ ํ›„ ์ €์žฅ๋œ ๋กœ๊ทธ ํ™•์ธ

 

์ฐธ๊ณ ์ž๋ฃŒ