再利用可能なロールの作成と適用

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

はじめに

ロール(Roles)は、デフォルト値、タスク、テンプレート、ファイル、ハンドラーを再利用可能な構造にパッケージ化する仕組みです。これにより、Playbook を簡潔に保ち、自動化コードの共有が容易になります。

この実験では、手動でロールを作成し、デフォルト値、テンプレート、タスクを追加した後、2 つのホストエイリアスに対してそのロールを適用します。

ロール練習用プロジェクトの作成

このステップでは、ロール用ディレクトリと 2 つのローカル Web ホストエイリアスを含むプロジェクトを作成します。

cd /home/labex/project
mkdir -p rhce-ansible/{inventory,roles,playbooks,managed,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
roles_path = ./roles
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[web]
web1 ansible_connection=local
web2 ansible_connection=local
EOF

roles_path = ./roles という設定は、Playbook で使用されるロール名を Ansible がどこで検索すべきかを指定するものです。これがない場合、Ansible はシステムレベルやユーザーレベルのロールパスのみを検索する可能性があります。

ロールディレクトリ構造の作成

このステップでは、ロールの主要なディレクトリを作成します。defaults には優先度の低い変数を、tasks にはタスクのロジックを、templates には Jinja2 テンプレートを格納します。 このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。これにより、LabEx が各ステップを個別に実行する場合でもコマンドが安定して動作します。

cd /home/labex/project/rhce-ansible
mkdir -p roles/web_banner/{defaults,tasks,templates}
find roles/web_banner -maxdepth 2 -type d | sort

出力には、ロールのルートディレクトリに加え、defaults、tasks、templates が表示されるはずです。これらの名前は Ansible にとって重要な意味を持ちます。例えば、tasks/main.yml はそのロールにおけるタスクの起点となります。

ロールのデフォルト値とテンプレートの追加

このステップでは、デフォルトの変数とテンプレートを追加します。Playbook やインベントリで上書きされない限り、ロールはこれらの値を使用します。 このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。

cd /home/labex/project/rhce-ansible
cat > roles/web_banner/defaults/main.yml <<'EOF'
---
banner_message: Welcome to RHCE Ansible Prep
EOF
cat > roles/web_banner/templates/banner.txt.j2 <<'EOF'
Host: {{ inventory_hostname }}
Message: {{ banner_message }}
EOF

デフォルト値は優先度の低いロール変数です。Playbook やインベントリで値が提供されていない場合にロールが使用できる値を提供しつつ、後から呼び出し側で上書きすることも可能です。

cat roles/web_banner/defaults/main.yml roles/web_banner/templates/banner.txt.j2

テンプレートは、現在のホストエイリアスとデフォルトメッセージを組み合わせます。ロールが 2 つのホストに対して実行されると、同じテンプレートから 2 つの異なる Host: 行が生成されるはずです。

ロールタスクの追加とロールの適用

このステップでは、tasks/main.yml を作成し、ロールを適用する Playbook を作成します。このロールはホストごとのディレクトリを作成し、ホストごとにバナーファイルを生成します。 このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。

cd /home/labex/project/rhce-ansible
cat > roles/web_banner/tasks/main.yml <<'EOF'
---
- name: Ensure host banner directory exists
  ansible.builtin.file:
    path: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}"
    state: directory
    mode: '0755'

- name: Render host banner
  ansible.builtin.template:
    src: banner.txt.j2
    dest: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}/banner.txt"
    mode: '0644'
EOF
cat > playbooks/apply-role.yml <<'EOF'
---
- name: Apply reusable web banner role
  hosts: web
  gather_facts: false
  roles:
    - role: web_banner
EOF

ロールのタスクファイルには実装が含まれ、playbooks/apply-role.yml はロール名を指定するだけで済むため、非常に簡潔になります。これこそがロールの最大の利点であり、すべての Playbook でタスクを繰り返すことなく、構造を再利用できる点です。

ansible-playbook playbooks/apply-role.yml --syntax-check

ロールベースの Playbook の実行

このステップでは、Playbook を実行し、生成されたファイルを確認します。ロールが再利用可能な実装を保持しているため、Playbook は簡潔なままです。 このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/apply-role.yml | tee reports/role-run.txt

実行により、web グループ内のホストエイリアスごとにロールが 1 回ずつ実行されます。failed=0 であれば、roles_path を通じてロールが正しく認識され、タスクが完了したことを意味します。

cat managed/web1/banner.txt managed/web2/banner.txt

生成されたファイルは同じメッセージを共有しつつ、異なる Host: 行を持っているはずです。これは、ロールが同じロジックを再利用しながら、ホストごとのデータを正しくレンダリングしていることを証明しています。

まとめ

再利用可能なロール構造を構築し、デフォルト値、タスク、テンプレートを追加しました。さらに、Playbook からロールを適用し、生成された出力を検証しました。