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

更新されたイメージが正常にデプロイされたかどうかを確認することができます。デプロイが失敗した場合は、以前のバージョンにロールバックすることができます (コミット)。以前の機能状態にロールバックするには、手動で手順を実行するか、自動化されたプロセスを使用することができます。

10.4.1. RHEL for Edge イメージのロールバック方法

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

Greenboot でインテリジェントなロールバックを使用して、アプリケーションの安定性を選択するか、またはセキュリティー更新のあるアプリケーションを選択するかという問題をなくすことができます。

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

Greenboot のディレクトリー構造は次のとおりです。

例10.1 Greenboot ディレクトリー構造

etc
└─ greenboot
   ├─ check
   |   └─ required.d
   |   └─ init.py
   └─ green.d
   └─ red.d
/etc/greenboot/check/required.d
失敗してはならないヘルスチェックが含まれています。
/etc/greenboot/check/wanted.d
失敗する可能性のあるヘルスチェックが含まれています。
/etc/greenboot/green.d
起動が成功した後に実行するスクリプトが含まれています。
/etc/greenboot/red.d
起動に失敗した後に実行するスクリプトが含まれています。システムは起動を 3 回試行し、失敗した場合はスクリプトを実行します。

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

イメージ復元プロセス

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

RHEL for Edge イメージ更新のデプロイメントに失敗した場合、または更新が正常に動作しない場合は、手動で以前のバージョンのデプロイメントにロールバックすることができます。

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

手順

  1. rollback コマンドを実行します。

    # rpm-ostree rollback

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

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

    # systemctl reboot

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

10.4.3. 自動化プロセスを使用した 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