はじめに
このスクリプトは、指定した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による自動実行が可能となります。