はじめに
実際の RHEL 自動化では、パッケージのインストール、サービス管理、ファイアウォールルールの設定を 1 つの収束型(convergent)Playbook にまとめることが一般的です。
この実験では、httpd をインストールし、サービスが有効かつ実行中であることを確認し、firewalld で HTTP 通信を許可します。最後に、Playbook が冪等(べきとう)であることを検証します。
RHEL サービス自動化プロジェクトの作成
このステップでは、RHEL 10 VM 上でパッケージ、サービス、ファイアウォールの状態を自動化するための 1 ホスト構成のプロジェクトを作成します。
cd /home/labex/project
mkdir -p rhce-ansible/{inventory,playbooks,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[web]
host ansible_connection=local
EOF
この Playbook はローカルの RHEL システムに対して実際に変更を加えるため、この実験ではローカルホストのエイリアスを 1 つ使用します。これにより、通常のインベントリ指定を通じて、Ansible のパッケージ、サービス、ファイアウォールモジュールの操作を練習できます。
Web サービスの状態定義
このステップでは、目的の状態を変数として保存します。パッケージ名、サービス名、ファイアウォール設定名を変数として保持することで、Playbook の調整が容易になります。 このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。これにより、LabEx が各ステップを個別に実行する場合でもコマンドが安定します。
cd /home/labex/project/rhce-ansible
mkdir -p inventory/group_vars
cat > inventory/group_vars/web.yml <<'EOF'
web_package: httpd
web_service: httpd
firewall_service: http
EOF
これらの名前を変数に保持することで、Playbook は「このパッケージをインストールし、このサービスを管理し、この firewalld サービスを許可する」というポリシーのように読み取れるようになります。将来的に別のサービスを自動化する場合でも、タスク構造をそのまま維持できます。
cat inventory/group_vars/web.yml
パッケージ・サービス・ファイアウォール用 Playbook の作成
このステップでは、特権昇格(privilege escalation)を使用する Playbook を作成します。package、service、および ansible.posix.firewalld モジュールを使用して、Web スタックの状態を収束させます。
このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。
cd /home/labex/project/rhce-ansible
cat > playbooks/web-stack.yml <<'EOF'
---
- name: Configure a basic web stack
hosts: web
become: true
gather_facts: false
tasks:
- name: Install web package
ansible.builtin.package:
name: "{{ web_package }}"
state: present
- name: Ensure web service is enabled and running
ansible.builtin.service:
name: "{{ web_service }}"
state: started
enabled: true
- name: Allow web traffic through the firewall
ansible.posix.firewalld:
service: "{{ firewall_service }}"
permanent: true
immediate: true
state: enabled
EOF
これら 3 つのタスクは、関連する RHEL の状態を収束させます。package は RPM がインストールされていることを保証し、service は systemd ユニットが実行中かつ有効であることを保証し、ansible.posix.firewalld は HTTP サービスを即時かつ永続的に許可します。
ansible-playbook playbooks/web-stack.yml --syntax-check
Web スタック Playbook の実行
このステップでは、Playbook を実行します。パッケージのインストールは、ファイルのみを扱う実験よりも時間がかかる場合があります。これは RHEL のパッケージマネージャーを使用するためです。
cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/web-stack.yml | tee reports/web-stack-first.txt
初回実行時は dnf が httpd をインストールするため、時間がかかることがあります。完了後のリキャップ(要約)を確認し、以下の RHEL ツールを使用して、Playbook の出力だけでなく、実際のシステム状態を確認してください。
rpm -q httpd
rpm -q は、インストールされた httpd パッケージ名とバージョンを表示するはずです。
systemctl is-active httpd
サービスが active と表示されれば、Web サービスが現在実行中であることが確認できます。
sudo firewall-cmd --list-services | tr " " "
" | grep -Fx http
これはアクティブな firewalld サービスを確認し、正確に http が含まれているかをチェックします。ファイアウォールの開放は、パッケージのインストールやサービスの起動とは別の状態管理です。
冪等性の確認のための再実行
このステップでは、同じ Playbook を再度実行します。パッケージ、サービス、ファイアウォールがすでに正しい状態であれば、リキャップには変更がない(changed=0)ことが報告されるはずです。
cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/web-stack.yml | tee reports/web-stack-second.txt
2 回目の実行はより高速になり、修正の必要がないはずです。これが、パッケージ、サービス、ファイアウォールのワークフローを組み合わせた場合の冪等性チェックです。
grep -E 'host.*changed=0' reports/web-stack-second.txt
まとめ
パッケージのインストール、サービスの管理、ファイアウォールの開放を行い、RHEL のシステム状態を検証しました。また、2 回目の実行で Playbook が収束することを確認し、冪等性を証明しました。


