はじめに
インベントリとアクセス設定が完了した後、よく行われる次のタスクはベースラインファイルのデプロイです。ベースラインファイルには、バナー、サービススニペット、コンプライアンスマーカーなどが含まれることがあり、これらはホスト間で一貫性を保ちつつ、ホスト固有の値を含める必要があります。
この実験では、小規模なマルチホストインベントリの作成、グループ変数の定義、テンプレートの作成、Playbook の実行、そしてホストごとのベースラインファイルの検証を行います。
ベースラインデプロイプロジェクトの作成
このステップでは、インベントリ、テンプレート、ファイル、および Playbook を含むプロジェクトを作成します。この構造により、再利用可能なソースコンテンツと Playbook のロジックを分離します。
プロジェクトを作成し、そのディレクトリに移動します。
cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars,playbooks,files,templates,managed}
cd rhce-ansible
ansible.cfg を作成します。
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
retry_files_enabled = False
interpreter_python = auto_silent
EOF
ディレクトリはワークフロー内の役割を分離します。files は変更されずにコピーされるコンテンツを保持し、templates は変数でレンダリングされるコンテンツを保持し、playbooks は自動化ロジックを保持します。managed ディレクトリには、最終的なホストごとの結果が出力されます。
インベントリとベースライン変数の作成
このステップでは、2 つの管理対象ホストエイリアスと共有ベースライン変数を定義します。これらの変数は、後ほどテンプレートで使用します。
このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。これにより、LabEx が各ステップを個別に実行する場合でもコマンドが安定します。
cd /home/labex/project/rhce-ansible
インベントリを作成します。
cat > inventory/hosts <<'EOF'
[managed]
node1 ansible_connection=local
node2 ansible_connection=local
EOF
2 つのエイリアスを使用することで、1 つの Playbook から 2 つの個別の管理対象出力を生成できます。両方のエイリアスが同じ VM 上で実行されますが、Ansible はホストごとに inventory_hostname を個別にレンダリングします。
管理対象ホスト用のグループ変数を作成します。
cat > inventory/group_vars/managed.yml <<'EOF'
baseline_owner: labex
baseline_environment: training
EOF
これらの変数は managed グループ内のすべてのホストに適用されます。これらはベースライン全体で共有されるべき値を表しており、ホスト名はホスト固有のものとして維持されます。
ソースファイルとテンプレートの作成
このステップでは、ソースコンテンツを作成します。プレーンファイルは変更されずにコピーされます。Jinja2 テンプレートは、inventory_hostname や baseline_environment などの変数を使用して、ホスト固有の出力をレンダリングします。
このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。
cd /home/labex/project/rhce-ansible
共有バナーファイルを作成します。
cat > files/banner.txt <<'EOF'
Managed by RHCE Ansible Prep
EOF
バナーはプレーンなソースコンテンツです。記述された通りに正確にコピーされるため、ホストごとに変化させる必要のないテキストに適しています。
テンプレートを作成します。
cat > templates/baseline.conf.j2 <<'EOF'
host={{ inventory_hostname }}
environment={{ baseline_environment }}
owner={{ baseline_owner }}
EOF
テンプレートには Jinja2 式が含まれています。Ansible がこれをレンダリングすると、inventory_hostname は node1 または node2 になり、ベースライン変数は inventory/group_vars/managed.yml から取得されます。
ベースラインデプロイ Playbook の作成
このステップでは、ホストエイリアスごとに 1 つのディレクトリを作成し、共有バナーとレンダリングされたテンプレートの両方をデプロイする Playbook を作成します。Playbook は playbooks ディレクトリに保存されるため、ソースパスには ../files および ../templates を使用します。
このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。
cd /home/labex/project/rhce-ansible
Playbook を作成します。
cat > playbooks/deploy-baseline.yml <<'EOF'
---
- name: Deploy baseline files to managed aliases
hosts: managed
gather_facts: false
tasks:
- name: Create per-host baseline directory
ansible.builtin.file:
path: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}"
state: directory
mode: '0755'
- name: Copy shared banner
ansible.builtin.copy:
src: ../files/banner.txt
dest: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}/banner.txt"
mode: '0644'
- name: Render baseline configuration
ansible.builtin.template:
src: ../templates/baseline.conf.j2
dest: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}/baseline.conf"
mode: '0644'
EOF
これら 3 つのタスクは、一連のデプロイシーケンスとして機能します。まず各ホストエイリアスの宛先ディレクトリが作成され、次に静的なバナーがコピーされ、最後にテンプレートがホスト固有の設定ファイルとしてレンダリングされます。
構文チェックを実行します。
ansible-playbook playbooks/deploy-baseline.yml --syntax-check
構文チェックにより playbook: 行が表示されるはずです。これは、Playbook が管理対象ファイルを書き込む前に、Ansible が相対ソースパスを正しく解析できることを確認するものです。
ベースラインデプロイの実行と検証
このステップでは、Playbook を実行し、レンダリングされたファイルを検査します。レンダリングされた設定は、共有の環境値と所有者値を維持しつつ、ホスト名によって異なる内容になるはずです。
このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。
cd /home/labex/project/rhce-ansible
Playbook を実行します。
ansible-playbook playbooks/deploy-baseline.yml
初回実行時は、管理対象ディレクトリとファイルがまだ存在しないため、変更が報告されるはずです。failed=0 で終了すれば、すべてのホストエイリアスにベースラインが正常にデプロイされたことを意味します。
デプロイされたファイルを検査します。
find managed -maxdepth 3 -type f -print
cat managed/node1/banner.txt managed/node1/baseline.conf managed/node2/banner.txt managed/node2/baseline.conf
banner.txt ファイルは互いに完全に一致しているはずです。baseline.conf ファイルは、同じ environment および owner 値を共有していますが、host= 行は異なっているはずです。
まとめ
インベントリ変数、共有ソースファイル、および Jinja2 テンプレートを使用して、管理対象ホストエイリアスにベースラインファイルをデプロイしました。これで、再現可能な管理対象ノードの状態変更のための基盤が完成しました。


