14.5. RHEL for Edge イメージのロールバック

RHEL for Edge はオペレーティングシステムにトランザクション更新を適用するため、失敗した更新を最後に確認されている正常な状態に手動または自動でロールバックでき、更新中のシステム障害を防ぐことができます。greenboot フレームワークを使用すると、検証とロールバックのプロセスを自動化できます。

greenboot ヘルスチェックフレームワークは、rpm-ostree 活用して、システム起動時にカスタムヘルスチェックを実行します。問題が発生した場合、システムは最後の作業状態にロールバックします。rpm-ostree 更新をデプロイすると、スクリプトが実行され、重要なサービスが更新後も機能することが確認されます。パッケージの障害などによりシステムが機能しない場合は、システムを以前の安定したバージョンにロールバックできます。このプロセスにより、RHEL for Edge デバイスが確実に動作状態になります。

イメージを更新すると、以前のイメージのデプロイメントを保持しながら、新しいイメージのデプロイメントが作成されます。更新が成功したかどうかを確認できます。パッケージの障害などにより更新が失敗した場合は、システムを以前の安定したバージョンにロールバックできます。

14.5.1. greenboot チェックの概要

Greenboot は、rpm-ostree ベースのシステムで利用できる systemd の一般的なヘルスチェックフレームワークです。これには、システムにインストールできる次の RPM パッケージが含まれています。

  • greenboot - 次の機能を含むパッケージです。

    • 提供されたスクリプトを確認します。
    • チェックが失敗した場合はシステムを再起動します。
    • 再起動しても問題が解決しなかった場合は、以前のデプロイメントにロールバックします。
  • greenboot-default-health-checks - greenboot システムのメンテナーによって提供される、選択された任意のヘルスチェックのセットです。

greenboot は、システム上で実行されるヘルスチェックスクリプトを使用してシステムの正常性を評価し、ソフトウェアに障害が発生した場合には最後の正常な状態へ自動的にロールバックすることにより、RHEL for Edge システムで機能します。これらのヘルスチェックスクリプトは、/etc/greenboot/check/required.d ディレクトリーに含まれています。greenboot はヘルスチェック用のシェルスクリプトをサポートしています。ヘルスチェックフレームワークは、直接的な保守機能が制限されているか存在しないエッジデバイスでソフトウェアの問題をチェックし、システムロールバックを実行する必要がある場合に特に役立ちます。ヘルスチェックスクリプトをインストールして設定すると、システムが起動するたびにヘルスチェックが実行されます。

独自のヘルスチェックスクリプトを作成して、ワークロードとアプリケーションの正常性を評価できます。これらの追加のヘルスチェックスクリプトは、ソフトウェアの問題チェックと自動システムロールバックの有用なコンポーネントです。

注記

OSTree を使用していないシステムでヘルスチェックが失敗した場合は、ロールバックを使用できません。

14.5.2. greenboot による RHEL for Edge イメージのロールバック

RHEL for Edge イメージでは、トランザクション更新のみがオペレーティングシステムに適用されます。トランザクション更新はアトミックです。つまり、すべての更新が成功した場合にのみ更新が適用されます。また、ロールバックがサポートされます。トランザクション更新では、失敗した更新を最後の既知の良い状態に簡単にロールバックすることができ、更新中のシステム障害を防ぐことができます。

ヘルスチェックの実行は、直接的な保守機能が制限されているか存在しないエッジデバイスでソフトウェアの問題をチェックし、システムロールバックを実行する必要がある場合に特に役立ちます。

注記

OSTree を使用していないシステムで更新が失敗した場合は、ヘルスチェックが実行される可能性がある場合でも、ロールバックを使用できません。

greenboot ヘルスチェックフレームワークによるインテリジェントなロールバックを使用すると、システムが起動するたびにシステムの正常性を自動的に評価できます。事前設定されたヘルスチェックは、greenboot-default-health-checks サブパッケージから取得できます。これらのチェックは、rpm-ostree システムの /usr/lib/greenboot/check 読み取り専用ディレクトリーにあります。

greenbootrpm-ostree を活用し、システム起動時に実行されるカスタムヘルスチェックを実行します。問題が発生した場合、システムは変更をロールバックし、最後の作業状態を保持します。rpm-ostree 更新をデプロイすると、スクリプトが実行され、重要なサービスが更新後も機能することが確認されます。システムが機能しない場合、更新はシステムの最新の動作バージョンにロールバックされます。このプロセスにより、RHEL for Edge デバイスが確実に動作状態になります。

事前設定されたヘルスチェックは、greenboot-default-health-checks` サブパッケージから取得できます。これらのチェックは、rpm-ostree システムの `/usr/lib/greenboot/check 読み取り専用ディレクトリーにあります。シェルスクリプトを次のタイプのチェックとして設定することもできます。

例14.1 greenboot のディレクトリー構造

etc
└─ greenboot
   ├─ check
   |   └─ required.d
   |   └─ init.py
   └─ green.d
   └─ red.d
Required
失敗してはならないヘルスチェックが含まれています。必要なシェルスクリプトを /etc/greenboot/check/required.d ディレクトリーに配置します。スクリプトが失敗すると、greenboot はデフォルトでスクリプトを 3 回再試行します。/etc/greenboot/greenboot.conf ファイルで再試行回数を設定するには、GREENBOOT_MAX_BOOTS パラメーターを目的の再試行回数に設定します。

すべての再試行が失敗すると、ロールバックが利用可能であれば greenboot が自動的に開始します。ロールバックが利用できない場合は、手動介入が必要であることをシステムログ出力が示します。

Wanted
失敗してもシステムをロールバックしないヘルスチェックが含まれています。必要なシェルスクリプトを /etc/greenboot/check/wanted.d ディレクトリーに配置します。Greenboot はスクリプトが失敗したことを通知し、システムの正常性ステータスは影響を受けず、ロールバックも再起動も実行しません。

チェック後に実行するシェルスクリプトを指定することもできます。

Green
起動が成功した後に実行するスクリプトが含まれています。これらのスクリプトを /etc/greenboot/green.d ディレクトリーに配置します。Greenboot は起動が成功したことを通知します。
Red
起動に失敗した後に実行するスクリプトが含まれています。この種類のスクリプトは /etc/greenboot/red.d ディレクトリーに配置します。システムは起動を 3 回試行し、失敗した場合はスクリプトを実行します。greenboot は起動が失敗したことを通知します。

以下の図は、RHEL for Edge イメージのロールバックプロセスを説明しています。

イメージ復元プロセス

更新されたオペレーティングシステムを起動した後、greenbootrequired.d ディレクトリーと wanted.d ディレクトリー内のスクリプトを実行します。required.d ディレクトリー内のいずれかのスクリプトが失敗した場合、greenbootred.d ディレクトリー内のスクリプトを実行してから、システムを再起動します。

greenboot は、アップグレードしたシステムでの起動をさらに 2 回試行します。3 回目の起動試行中に required.d 内のスクリプトが依然として失敗する場合、greenboot は最後に red.d スクリプトを 1 回実行し、red.d ディレクトリー内のスクリプトが問題を修正するための修正アクションを実行しようとして失敗したことを確認します。その後、greenboot は、現在の rpm-ostree デプロイメントから以前の安定したデプロイメントにシステムをロールバックします。

14.5.3. Greenboot ヘルスチェックのステータス

更新されたシステムをデプロイするときは、greenboot がシステムを以前の状態にロールバックした場合に変更が失われないように、greenboot ヘルスチェックが完了するまで待ってから変更を加えてください。設定を変更したり、アプリケーションをデプロイしたりする場合は、greenboot ヘルスチェックが完了するまで待つ必要があります。これにより、greenboot が rpm-ostree システムを以前の状態にロールバックしても、変更が失われなくなります。

greenboot-healthcheck サービスは 1 回実行されて終了します。次のコマンドを使用することで、サービスのステータスをチェックしてサービスが完了したかどうかを確認し、結果を知ることができます。

systemctl is-active greenboot-healthcheck.service
このコマンドは、サービスが終了していれば active と報告します。サービスが実行されなかった場合は、inactive と表示されます。
systemctl show --property=SubState --value greenboot-healthcheck.service
サービスが完了していれば exited、実行中であれば running と報告します。
systemctl show --property=Result --value greenboot-healthcheck.service
チェックに合格していれば success と報告します。
systemctl show --property=ExecMainStatus --value greenboot-healthcheck.service
サービスの数値終了コードを報告します。0 は成功を、0 以外の値は失敗を意味します。
cat /run/motd.d/boot-status
"Boot Status is GREEN - Health Check SUCCESS" などのメッセージが表示されます。

14.5.4. greenboot ヘルスチェックのステータスの確認

システムに変更を加える前、またはトラブルシューティング中に、greenboot ヘルスチェックのステータスを確認します。次のコマンドのいずれかを使用すると、greenboot スクリプトの実行が完了したことを確認できます。

  • ステータスを確認するには、次のオプションのいずれかを使用します。

    • ヘルスチェックステータスのレポートを表示するには、次のように入力します。

      $ systemctl show --property=SubState --value greenboot-healthcheck.service

      出力は次のとおりです。

      • start は、greenboot チェックがまだ実行中であることを意味します。
      • exited は、チェックに合格し、greenboot が終了したことを意味します。Greenboot は、システムが正常な状態の場合、green.d ディレクトリー内のスクリプトを実行します。
      • failed は、チェックに合格しなかったことを意味します。システムがこの状態にある場合、Greenboot は red.d ディレクトリー内のスクリプトを実行し、システムを再起動する可能性があります。
    • サービスの数値終了コードを示すレポートを表示するには、次のコマンドを使用します。0 は成功を、0 以外の値は失敗を意味します。

      $ systemctl show --property=ExecMainStatus --value greenboot-healthcheck.service
    • Boot Status is GREEN - Health Check SUCCESS など、ブートステータスに関するメッセージを示すレポートを表示するには、次のように入力します。

      $ cat /run/motd.d/boot-status

14.5.5. RHEL for Edge イメージの手動でのロールバック

オペレーティングシステムをアップグレードすると、新しいデプロイメントが作成されます。また、rpm-ostree パッケージによって以前のデプロイメントが保持されます。オペレーティングシステムの更新バージョンに問題がある場合は、1 つの rpm-ostree コマンドを使用するか、GRUB ブートローダーで以前のデプロイメントを選択することで、以前のデプロイメントに手動でロールバックできます。

以前のバージョンに手動でロールバックするには、次の手順を実行します。

前提条件

  1. システムを更新したが、障害が発生した。

手順

  1. オプション: 失敗エラーメッセージを確認します。

    $ journalctl -u greenboot-healthcheck.service.
  2. rollback コマンドを実行します。

    # rpm-ostree rollback

    コマンドの出力では、移動中のコミット ID の詳細が確認でき、削除されたパッケージの詳細を含めて、完了したトランザクションが表示されます。

  3. システムを再起動します。

    # systemctl reboot

    このコマンドは、安定したコンテンツが含まれる 1 つ前のコミットを有効にします。変更が適用され、以前のバージョンが復元されます。

14.5.6. 自動化プロセスを使用した RHEL for Edge イメージのロールバック

greenboot チェックは、起動プロセスに統合されたフレームワークを提供し、ヘルスチェックが失敗した場合は rpm-ostree ロールバックをトリガーできます。ヘルスチェックについては、ヘルスチェックの合否を示すカスタムスクリプトを作成できます。結果をもとに、ロールバックをトリガーするタイミングを決めることができます。次の手順では、ヘルスチェックスクリプトの例を作成する方法を示します。

手順

  1. 標準の終了コード 0 を返すスクリプトを作成します。

    たとえば、以下のスクリプトにより、設定された DNS サーバーを必ず利用できます。

    #!/bin/bash
    
    DNS_SERVER=$(grep ^nameserver /etc/resolv.conf | head -n 1 | cut -f2 -d" ")
    COUNT=0
    # check DNS server is available
    ping -c1 $DNS_SERVER
    while [ $? != '0' ] && [ $COUNT -lt 10 ]; do
    ((COUNT++))
    echo "Checking for DNS: Attempt $COUNT ."
    sleep 10
    ping -c 1 $DNS_SERVER
    done
  2. /etc/greenboot/check/required.d/ でヘルスチェック用の実行ファイルを追加します。

    chmod +x check-dns.sh

    次の再起動時には、システムが boot-complete.target ユニットに入る前に、起動プロセスの一環としてスクリプトが実行されます。ヘルスチェックが正常に行われた場合は何もしません。ヘルスチェックに失敗した場合は、システムが数回再起動されてから、更新が失敗したとマークされ、前回の更新にロールバックされます。

検証手順

デフォルトゲートウェイにアクセスできるかどうかを確認するには、以下のヘルスチェックスクリプトを実行します。

  1. 標準の終了コード 0 を返すスクリプトを作成します。

    #!/bin/bash
    
    DEF_GW=$(ip r | awk '/^default/ {print $3}')
    SCRIPT=$(basename $0)
    
    count=10
    connected=0
    ping_timeout=5
    interval=5
    
    while [ $count -gt 0 -a $connected -eq 0 ]; do
      echo "$SCRIPT: Pinging default gateway $DEF_GW"
      ping -c 1 -q -W $ping_timeout $DEF_GW > /dev/null 2>&1 && connected=1 || sleep $interval
      ((--count))
    done
    
    if [ $connected -eq 1 ]; then
      echo "$SCRIPT: Default gateway $DEF_GW is reachable."
      exit 0
    else
      echo "$SCRIPT: Failed to ping default gateway $DEF_GW!" 1>&2
      exit 1
    fi
  2. /etc/greenboot/check/required.d/ ディレクトリーでヘルスチェックの実行ファイルを追加します。

    chmod +x check-gw.sh