パッケージ、サービス、ファイアウォールの自動化

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

はじめに

実際の 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 が収束することを確認し、冪等性を証明しました。