AIを使ってしたい100のこと

生成AIの可能性と、それを使って自分自身を表現する楽しさを伝えることを目指しています。

生成AIで効率化!OpenShiftの複数ノードを一括シャットダウンする方法

はじめに

今回は、業務でOpenShift Container Platform(OCP)クラスタ内の複数のWorkerノードを一度に停止する方法について取り組んだ内容をお伝えします。通常は各ノードにログインして、shutdown コマンドを実行するだけですが、対象ノードが多いと手間がかかります。

そこで、より効率的な方法を探すためにChatGPTを使い、スクリプトを利用して複数ノードをまとめてシャットダウンする手順を考えてみました。

複数のサーバーをまとめて停止する方法

プロンプト

Linux環境で、サーバーにsshで接続し、shutdown -h nowを実行します。対象のサーバーは8台あります。1回のコマンド実行で8台のサーバーを連続してshutdownする方法を教えてください。

回答

複数のサーバーを1回のコマンド実行で連続してシャットダウンするには、以下のようにBashスクリプトを利用して実行できます。

#!/bin/bash

# 対象のサーバーリスト
servers=("server1" "server2" "server3" "server4" "server5" "server6" "server7" "server8")

# SSHで各サーバーに接続し、shutdownコマンドを実行
for server in "${servers[@]}"; do
  ssh user@"$server" "shutdown -h now"
done

スクリプトの使用方法

  1. このスクリプトをファイル(例えば、shutdown_servers.sh)に保存します。
  2. 実行権限を付与します。

    chmod +x shutdown_servers.sh
    
  3. スクリプトを実行します。

    ./shutdown_servers.sh
    

注意点

  • user を実際のSSH接続ユーザー名に置き換えてください。
  • サーバーのIPアドレスまたはホスト名が正確に記載されていることを確認してください。
  • SSH接続にパスワード認証が必要な場合、各サーバーでの認証を省略するために、公開鍵認証を設定しておくとスムーズに実行できます。

このスクリプトを実行すると、servers配列にある8台のサーバーに順番にSSH接続し、shutdown -h nowを実行して順次シャットダウンが行われます。

エラーが出たんだけど

プロンプト

shutdown_servers.shを実行したところ、すべてのサーバーからCall to PowerOff failed: Interactive authentication required.というエラーが表示されました。

回答

Call to PowerOff failed: Interactive authentication required.というエラーメッセージが表示される理由として、SSH接続後にコマンドを実行する際に、サーバー側がパスワード入力などの対話的な認証を求めている可能性があります。この場合、以下のいずれかの方法で解決を試みられます。

解決方法 1: SSH公開鍵認証を設定する

SSH接続時にパスワード認証を求められないように、公開鍵認証を設定するのが一般的な解決方法です。

  1. 公開鍵を生成(もし既に公開鍵がある場合は、再生成は不要です)。

    ssh-keygen -t rsa
    

    このコマンドで生成された公開鍵は通常 ~/.ssh/id_rsa.pub に保存されます。

  2. 生成した公開鍵を対象サーバーにコピーします。以下のように ssh-copy-id コマンドを使うと便利です。

    ssh-copy-id user@server1
    ssh-copy-id user@server2
    # ... 他のサーバーも同様に
    

    これで各サーバーに公開鍵が登録され、パスワード入力なしでSSH接続できるようになります。

  3. 公開鍵が設定できたら、再度スクリプトを実行してみてください。

解決方法 2: sudo コマンドを使用して非対話的にシャットダウンする

サーバーによっては shutdown コマンドの実行にスーパーユーザー権限が必要な場合があります。この場合、sudo を使ってシャットダウンを実行できます。以下のように、スクリプト内で sudo shutdown -h now を使い、NOPASSWD オプションを設定する方法を試します。

  1. スクリプトを修正して、shutdown コマンドを sudo 経由で実行するようにします。

    for server in "${servers[@]}"; do
      ssh user@"$server" "sudo shutdown -h now"
    done
    
  2. /etc/sudoers ファイルを編集し、NOPASSWD オプションを設定します。各サーバーで以下の設定を追加してください(visudo コマンドを使うことを推奨します)。

    user ALL=(ALL) NOPASSWD: /sbin/shutdown
    

    この設定により、指定したユーザーがパスワード入力なしで shutdown コマンドを実行できるようになります。

  3. 再度スクリプトを実行して、エラーが解消されているか確認してください。

解決方法 3: 対話認証を許可する(必要に応じて)

もしどうしても対話認証が必要な場合は、sshpass というツールを使用してパスワードを指定し、自動化することもできますが、セキュリティ面の考慮が必要です。

問題の解決と実践

OCPの各Workerノードでは、「解決方法 1: SSH公開鍵認証を設定する」が設定済みになっています。

解決方法 2: sudo コマンドを使用して非対話的にシャットダウンする

そこで、スクリプトを修正して、sudo shutdown -h nowとしたところ、正常に実行できました。 そして、うまく8ノードを連続してシャットダウンすることができました。

やってみた感想

  • シェルスクリプトを作成するというアイディアはありましたが、実際のコードを考えるのが面倒でした。サクッと作れて満足です。
  • 今回は、対象は8ノードだったので、手動でもできたかもしれません。
  • 今後対象ノードの数が増えた場合に、今回作成したスクリプトが役立ちそうです。
  • 今回は、素案の作成から問題解決まで、すべて生成AIを使いました。