管理対象ノードへのベースラインファイルのデプロイ

AnsibleBeginner
オンラインで実践に進む

はじめに

インベントリとアクセス設定が完了した後、よく行われる次のタスクはベースラインファイルのデプロイです。ベースラインファイルには、バナー、サービススニペット、コンプライアンスマーカーなどが含まれることがあり、これらはホスト間で一貫性を保ちつつ、ホスト固有の値を含める必要があります。

この実験では、小規模なマルチホストインベントリの作成、グループ変数の定義、テンプレートの作成、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 テンプレートを使用して、管理対象ホストエイリアスにベースラインファイルをデプロイしました。これで、再現可能な管理対象ノードの状態変更のための基盤が完成しました。