はじめに
再利用可能な Playbook は、開発用と本番用の答えを別々にハードコードせず、環境データを利用する必要があります。インベントリの選択、変数のスコープ、対象のファクトによって、各ノードが受け取る内容が決まります。
異なる SSH ノードを選択する 2 つのインベントリを使い、各ソースの隣にグループとホストのデータを保存して、1 つの Playbook で設定を生成します。また、一時的な追加変数による上書きを適用し、安定した基準状態に戻します。
環境ごとにインベントリデータを分ける
このステップでは、開発環境と本番環境に、別々のインベントリソースとグループ変数の値を与えます。
プロジェクトに移動します。
cd /home/labex/project
実習には 2 つの小さなインベントリが用意されています。自動化を実行する前に、それぞれを読んでください。
cat inventories/dev/hosts.ini
cat inventories/prod/hosts.ini
dev の app グループには web1、prod の app グループには web2 が含まれます。アドレスと SSH 設定は準備済みです。これらは、localhost の 2 つの名前ではなく、実際に異なるノードです。
-i は、この呼び出しのインベントリソースを選択し、プロジェクトのデフォルトインベントリを上書きします。各環境を個別にプレビューします。
ansible app -i inventories/dev/hosts.ini --list-hosts
ansible app -i inventories/prod/hosts.ini --list-hosts
dev には web1、prod には web2 が表示されるはずです。独立した環境を模倣するために、これらのソースを組み合わせないでください。ソースは統合される場合があり、同じインベントリのホスト名は依然として 1 ホストを識別します。各環境の呼び出しを明示してください。
変数は、自動化で利用する名前付きの値です。YAML マッピングは name: value の行を使用します。Ansible は、インベントリの隣の group_vars/app.yml を、その app グループ用に読み込みます。各環境で、同じグループ名に異なるデータを作成してください。
cat > inventories/dev/group_vars/app.yml <<'EOF'
environment_label: development
release_channel: preview
EOF
cat > inventories/prod/group_vars/app.yml <<'EOF'
environment_label: production
release_channel: stable
EOF
解決済みのインベントリデータを調べます。--list は、ホストの値を持つ _meta.hostvars オブジェクトを含む JSON を返します。
ansible-inventory -i inventories/dev/hosts.ini --list
ansible-inventory -i inventories/prod/hosts.ini --list
dev ホストの値は development/preview、prod ホストの値は production/stable に解決されるはずです。変数ファイルは、意図したインベントリとグループが実際に読み込んで初めて役立ちます。
ホスト変数と実際のファクトを利用する
このステップでは、1 ホストのグループ値を上書きし、環境データを実際の管理対象設定に反映します。
host_vars 以下のファイルには、インベントリのホスト名を付けます。同じホストとキーについては、ここで使うホスト変数がグループ変数を上書きします。開発環境の canary に、ホスト固有のリリースチャネルを与えます。
cat > inventories/dev/host_vars/web1.yml <<'EOF'
release_channel: canary
EOF
開発環境の environment_label は development のままですが、web1 の release_channel は canary に解決されるようになります。本番環境は stable のままです。dev の解決結果を確認してください。
ansible-inventory -i inventories/dev/hosts.ini --list
どちらのインベントリにも使える、再利用可能な Playbook を 1 つ記述します。
cat > deploy-info.yml <<'EOF'
- name: Configure environment-specific application settings
hosts: app
gather_facts: true
vars:
banner_prefix: Managed environment
tasks:
- name: Write settings from variables and facts
ansible.builtin.copy:
dest: /home/automation/app-settings.conf
content: |
[application]
environment={{ environment_label }}
channel={{ release_channel }}
host={{ inventory_hostname }}
distribution={{ ansible_facts.distribution }}
label={{ banner_prefix }}
mode: "0640"
EOF
vars は、Play レベルの値 banner_prefix を定義します。copy の内容中では、{{ variable_name }} が実行時に値を挿入します。これは基本的な値の置換です。独立した Jinja テンプレートの管理は、後の実習で扱います。
YAML の | は、続くインデントされた内容を、末尾の改行を含む複数行テキストとして保持します。inventory_hostname は現在のインベントリ名です。gather_facts が true の場合、Ansible はタスクの前に対象データを収集し、ansible_facts.distribution は実際のオペレーティングシステムのディストリビューションを提供します。これは対象データであり、コントローラーについてのファクトではありません。
構文をチェックし、同じ Playbook を各環境で個別に実行します。
ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml --syntax-check
ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml
ansible-playbook -i inventories/prod/hosts.ini deploy-info.yml
それぞれのインベントリを使い、両方の実際のファイルを読みます。
ansible app -i inventories/dev/hosts.ini -m ansible.builtin.command -a 'cat /home/automation/app-settings.conf'
ansible app -i inventories/prod/hosts.ini -m ansible.builtin.command -a 'cat /home/automation/app-settings.conf'
開発環境には environment=development、channel=canary、host=web1 が含まれるはずです。本番環境には environment=production、channel=stable、host=web2 が含まれるはずです。両方に distribution=Ubuntu と label=Managed environment が含まれるはずです。共通の Playbook が、異なるデータを利用して異なる対象内容を生成しました。
1 回の呼び出しを上書きし、基準状態に戻す
このステップでは、保存済みのインベントリデータを編集せずに追加変数を使用し、その後、収束した基準状態に戻します。
-e は、この実行用の追加変数を指定します。ここで実演しているグループとホストの値を上書きします。開発環境だけに、一時的に hotfix チャネルを選択します。
ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml -e release_channel=hotfix
その結果の dev 設定を読みます。
ansible app -i inventories/dev/hosts.ini -m ansible.builtin.command -a 'cat /home/automation/app-settings.conf'
チャネルは hotfix になるはずです。-e はソースの group_vars と host_vars ファイルを編集せず、本番環境も選択していません。
追加変数なしで実行し、web1 に保存された canary チャネルを復元します。
ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml
次に、両方の基準環境をプレビューします。
ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml --check
ansible-playbook -i inventories/prod/hosts.ini deploy-info.yml --check
選択された各ホストは、未適用の変更ゼロ、失敗と到達不能の結果なしを報告するはずです。ここで練習したのは、グループデータ、ホストの上書き、追加変数の上書きという限定的な優先順位の関係です。より複雑な優先順位の規則は、この実習の範囲外です。
まとめ
異なる環境のインベントリを選択し、グループデータを読み込み、ホスト固有の上書きを適用して、共通の Playbook で実際の対象ファクトを反映しました。一時的な追加変数が 1 回の呼び出しを変更し、その後の基準状態の実行で、両環境を安定した宣言済みの設定に戻しました。


