はじめに
Riverlight Weekend のプログラムは動作しており、用意された代替ソースも承認されました。サイトのプログラム接続だけを新しいメンバーに移し、会場、現在の来場者体験、元のプログラムソースを保ちます。
先に「イベントページを接続する」を完了するか、インベントリのグループ、hostvars、テンプレート、読み取り専用の uri アサーション、handler に慣れている必要があります。この独立したラボには前に学んだ playbook とテンプレートが用意されています。サービスのインストールやソースデータ移行は不要で、時間は著者の見積もりです。
旧ソースを削除せずにプログラムを移す
このステップでは、インベントリのグループを変更して用意された代替プログラムを使い、会場接続と元のソースを保ちます。
独立した環境です。Event Site には動作する Riverlight プログラムがありますが、承認された代替ソースのセッションは異なります。Program を開くと、旧プログラムには Morning sketchbook と Lunch by the river が表示されます。Visit と Visitor guide も動作しており、メンバー変更中も利用できる必要があります。
Controller に切り替えます。開始場所は /home/labex/project です。前のラボで学んだチェック付きの connect.yml とルートテンプレートが提供されており、前の VM のファイルには依存しません。場所が分からなくなったら cd /home/labex/project で戻ります。承認された選択と現在のメンバーを読みます。
cat approved-services.txt
cat inventory.ini
ansible-inventory --graph
承認されたプログラムは現在 web2 の版 2026-revised です。インベントリはまだ旧プログラムの web1 を選んでいます。web2 は会場も別ポートで提供します。同じホストを両グループに所属させられます。グループはサービスの役割を表し、役割ごとに別マシンを必要とするものではありません。2 つのソースコンテナーは学習用 VM のカーネルを共有し、入口はコントローラーで動作します。
ホストデータと 2 つのソースの識別情報を調べます。前と同じく、curl --config はファイルから用意された URL とエラー表示オプションを読みます。
cat host_vars/web2.yml
cat requests/new-program.conf
curl --config requests/new-program.conf
curl --config requests/old-program.conf
新旧両ソースとも利用できますが、現在のサイト入口につなぐのは新しい版だけです。接続の移動は、旧ソースやそのファイルを削除する許可ではありません。
提供された再利用可能な自動化を読みます。
cat connect.yml
cat templates/routes.json.j2
groups['program'][0] がプログラムのメンバーを選び、hostvars がアドレスと program_port を提供します。会場の式は独立して自身のグループと venue_port を使います。HTTP アサーションはテンプレートより前にあります。ルートが変わると、用意されたヘルパーに通知して既存の入口プロセスに再読み込みさせます。
以下の小さなインベントリに置き換えます。最初のラボと同様に、cat、出力リダイレクト、引用符付き here-document を使います。終了記号 EOF は単独行で貼り付け、忘れた場合は Ctrl+C を押して全体を再実行します。ホストデータと承認された版は変えません。
cat > inventory.ini <<'EOF'
[gateway]
entry ansible_connection=local ansible_python_interpreter=/usr/bin/python3
[program]
web2
[venue]
web2
EOF
ansible-inventory --graph
両サービスグループに web2 が入るはずです。ローカルの entry は [gateway] のままです。グループ名の誤記や余分なメンバーがあれば、このファイルで直してから進みます。テンプレートに固定アドレスを書いて埋め合わせないでください。
構文を検査し、提案ルートをプレビューします。
ansible-playbook connect.yml --syntax-check
ansible-playbook connect.yml --check --diff
このプレビューでも読み取り専用 HTTP プローブが実行され、承認済みプログラムと会場を識別する必要があります。差分が出るのはプログラムのルートだけです。会場のアドレスとポートは変わりません。プレビューはゲートウェイを再読み込みしません。変更を適用します。
ansible-playbook connect.yml
テンプレートの変更と RUNNING HANDLER [Reload entry] が期待されます。Event Site の Program を開き、Paper and ink、Acoustic afternoon、Shared supper が旧予定表に代わったことを確認します。Download the schedule をクリックし、Visit と Visitor guide へ進みます。同じ会場と到着案内が維持されている必要があります。
入口には代替プログラムが表示されます。3 セッションと、ダウンロードリンク下の版 2026-revised に注目してください。

Controller に戻り、現在のダウンロードを VM に保存します。-o が出力ファイル名を指定します。
curl -fsS http://127.0.0.1:8081/program/schedule.csv -o schedule.csv
cat schedule.csv
CSV に必要なのは現在の 3 セッションで、旧プログラムの 2 セッションではありません。旧ソースが直接応答し続けることを確認します。
curl --config requests/old-program.conf
引き続き program、riverlight、2026-original と識別されるはずです。入口設定から外れただけで、停止していません。選択中であるかのように扱わずに、データと独立した参照先を残せます。
最後に playbook を再実行します。
ansible-playbook connect.yml
changed=0、failed=0 で、再読み込み handler は不要です。ソースが一時的に使えない場合、既存の事前チェックはテンプレートより前で停止する必要があります。接続失敗は旧ノードを削除せよという指示ではありません。選択したメンバーやソースデータの参照を修正し、再試行します。最初のラボの sha256sum 比較で入口ファイルが変わっていないか確認できます。
管理対象はインベントリのメンバー、再利用可能な connect.yml と templates/routes.json.j2、その playbook 経由のルートファイルだけです。提供されたホスト変数、承認されたサイトと版、ソース内容、主催者の非公開メモ、すべてのソースサービス、ゲートウェイ実装を保ってください。プローブとテンプレートは異なるメンバー名、アドレス、ポートでも再利用できる必要があります。再読み込みには /opt/labex/service-links/reload.py と本プロジェクトの入口ディレクトリを使います。学んだ直接の uri、assert、template タスクと、範囲を限定した再読み込み command handler を使用してください。失敗を隠したり check mode で書き込んだりしないでください。
まとめ
新しいアドレスを埋め込まずにサービスのメンバーを変え、ルートをプレビューして適用し、実際のサイトと CSV で新しいプログラムを確認しました。旧ソースは独立して利用でき、会場と来場者ガイドも維持されました。



