1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ESXiに入っている各VMの状態を取得するシェルスクリプト

Posted at

はじめに

このスクリプトは、指定したESXiホスト上の全てのVMの電源状態をチェックし、一定期間電源がオフのVMをリスト化するものです。長期間電源がオフのVMを識別し、別のリストへ移動する際に役立ちます。

スクリプトの内容

・ESXiホストにSSHで接続し、全てのVMのリストを取得。
・各VMの電源状態をチェックし、「電源オフ」のVMをリストに追加。
・指定した日数(ここでは1ヶ月)経過した電源オフのVMを別のリストに移動。

各処理の流れ

1.CSVファイルの作成:list.csvとvms_list.csvが存在しない場合、自動で作成されます。
2.VMリストの取得:SSH経由でESXiホストからVMリストを取得し、各VMの情報を配列に格納します。
3.電源状態のチェック
電源オフのVMはlsit.csvに保存され、電源オンに戻ったVMはリストから削除されます。
4.1ヶ月経過チェック:list.csv内の各VMの最終電源オフ日から1ヶ月経過した場合、vms_list.csvに移動され、元のCSVから削除されます。

#!/bin/bash

# ESXiホストの情報
ESXI_USER="○○○○"
ESXI_HOST="○○○○"
POWER_STATUS_CSV="list.csv"
COPY_LIST_CSV="vms_list.csv"
TODAY=$(date +%Y-%m-%d)

# CSVファイルがなければ作成
touch "$POWER_STATUS_CSV"
touch "$COPY_LIST_CSV"

# すべてのVMのリストを取得
VM_LIST=$(ssh "$ESXI_USER@$ESXI_HOST" "vim-cmd vmsvc/getallvms")

# VMリストを配列に格納
mapfile -t VM_ARRAY < <(echo "$VM_LIST" | tail -n +2)

# VM電源状態の確認
echo "Checking VMs..."

for line in "${VM_ARRAY[@]}"; do
    # VMのIDと名前を抽出
    VM_ID=$(echo "$line" | awk '{print $1}')
    VM_NAME=$(echo "$line" | awk '{print $2}')

    # 空行や無効なIDをスキップ
    if [[ -z "$VM_ID" || "$VM_ID" =~ [^0-9] ]]; then
        continue
    fi

    # VMの電源状態を取得
    POWER_STATE=$(ssh "$ESXI_USER@$ESXI_HOST" "vim-cmd vmsvc/power.getstate $VM_ID" | grep -Eo '(Powered on|Powered off)' | tr -d '[:space:]')

    # 電源オフのVMを処理
    if [[ "$POWER_STATE" == "Poweredoff" ]]; then
        # 既にvm_power_status.csvにあるか確認
        if ! grep -q "^$VM_NAME," "$POWER_STATUS_CSV"; then
            # なければ新規に追加
            echo "$VM_NAME,$TODAY" >> "$POWER_STATUS_CSV"
            echo "Added $VM_NAME to $POWER_STATUS_CSV"
        fi
    else
        # 電源オンならvm_power_status.csvから削除
        if grep -q "^$VM_NAME," "$POWER_STATUS_CSV"; then
            sed -i "/^$VM_NAME,/d" "$POWER_STATUS_CSV"
            echo "Removed $VM_NAME from $POWER_STATUS_CSV (powered on)"
        fi
    fi
done

# 1か月経過したVMをチェック
while IFS=, read -r vm_name date; do
    # 日付の差を計算
    diff_days=$(( ( $(date -d "$TODAY" +%s) - $(date -d "$date" +%s) ) / 86400 ))

    if [ "$diff_days" -ge 30 ]; then
        # 1か月経過したらvmcopy_list.csvに追加し、vm_power_status.csvから削除
        echo "$vm_name" >> "$COPY_LIST_CSV"
        sed -i "/^$vm_name,/d" "$POWER_STATUS_CSV"
        echo "Moved $vm_name to $COPY_LIST_CSV after 1 month of being powered off"
    fi
done < "$POWER_STATUS_CSV"

実行結果

Checking VMs...
Added VM1 to list.csv
Added VM2 to list.csv
Removed VM3 from list.csv (powered on)

上記の出力では、VM1とVM2が電源オフのためlist.csvに追加され、VM3が電源オンに戻ったためlist.csvから削除されたことがわかります。

list.csvには電源オフのVM1とVM2が、日付と共に記録されています。

list.csv:
VM1,2024-10-31
VM2,2024-10-31

このcsvの記録から1ヶ月が経過すると、vms_list.csvにVM名が記述されます.

記述された後は、以下の事を行います。
https://qiita.com/c0a21013ef/items/9d5eacee52581ba38f01

注意事項
このスクリプトを定期的に実行するには、.serviceファイルと.timerファイルを各自で設定する必要があります。.serviceファイルでスクリプトの起動方法を指定し、.timerファイルで実行スケジュールを設定することで、systemdによる自動実行が可能となります。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?