ロールとコンテンツコレクションのインストール

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

はじめに

Ansible のコンテンツは、ロール(roles)とコレクション(collections)から構成されます。制限された実験環境では、インターネットからダウンロードするよりも、ローカルのコンテンツアーカイブを使用する方が安全です。

この実験では、ローカルロールをパッケージ化し、要件ファイル(requirements file)を通じてインストールし、プリインストールされているコレクションを確認し、インストールしたロールを適用します。

コンテンツインストールプロジェクトの作成

このステップでは、ローカルコンテンツのソース、インストールされたロール、プレイブック、および出力ディレクトリを含むプロジェクトを作成します。

cd /home/labex/project
mkdir -p rhce-ansible/{inventory,roles,vendor_src/local_message/{tasks,meta},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'
[managed]
host ansible_connection=local
EOF

この実験では、ロールのソースとインストールされたロールのコンテンツを分離しています。vendor_src/local_message は受け取った、あるいは作成したコンテンツを表し、roles/local_message は Ansible が実際に読み込むインストール済みのコピーとなります。

ローカルロールソースの構築

このステップでは、インストール先の roles ディレクトリの外側に小さなロールソースを作成します。これは、信頼できるソースからロールコンテンツを受け取る状況をシミュレートしています。 このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。これにより、LabEx が各ステップを個別に実行する場合でもコマンドが安定します。

cd /home/labex/project/rhce-ansible
cat > vendor_src/local_message/tasks/main.yml <<'EOF'
---
- name: Ensure local message directory exists
  ansible.builtin.file:
    path: /home/labex/project/rhce-ansible/managed/local-message
    state: directory
    mode: '0755'

- name: Write message from installed role
  ansible.builtin.copy:
    dest: /home/labex/project/rhce-ansible/managed/local-message/message.txt
    content: |
      installed_role=local_message
    mode: '0644'
EOF
cat > vendor_src/local_message/meta/main.yml <<'EOF'
---
galaxy_info:
  author: LabEx
  description: Local role for RHCE Ansible prep
  license: MIT
  min_ansible_version: '2.16'
dependencies: []
EOF

ロールソースは、通常のロールと同じ基本的な構造を持っています。tasks/main.yml にタスクロジック、meta/main.yml にロールのメタデータが含まれます。タスクは、インストールされたロールが実行されたことを証明するために、目に見えるメッセージを書き込みます。

tar -czf vendor_src/local_message.tar.gz -C vendor_src local_message

このアーカイブは、オフラインのロールパッケージをシミュレートします。ローカルアーカイブを使用することで、requirements.yml のワークフローを学習しながら、実験の再現性を保つことができます。

ls -l vendor_src/local_message.tar.gz

要件ファイルからのロールのインストール

このステップでは、ローカルアーカイブを指すロール要件ファイルを作成し、それを roles ディレクトリにインストールします。 このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。

cd /home/labex/project/rhce-ansible
cat > requirements.yml <<'EOF'
---
roles:
  - name: local_message
    src: file:///home/labex/project/rhce-ansible/vendor_src/local_message.tar.gz
EOF

file:// ソースは、ansible-galaxy に対してローカルアーカイブを指定します。これはリモートソースを使用する場合と同じ考え方ですが、ネットワークアクセスに依存しません。

ansible-galaxy role install -r requirements.yml -p roles --force

-r オプションは要件ファイルを読み込み、-p roles はインストールディレクトリを選択し、--force は実験を再実行する場合にコマンドを繰り返し実行可能にします。

find roles/local_message -maxdepth 2 -type f -print

インストールされたロールの tasks/main.yml と meta/main.yml が表示されるはずです。プレイブックは、元の vendor_src ディレクトリではなく、インストールされたロールのパスを使用します。

インストール済みコレクションの内容確認

このステップでは、インストール済みのコレクションを確認します。RHEL10 イメージには一般的なコレクションが既に含まれているため、この実験ではインターネットからのダウンロードを避けつつ、コレクションの検出方法を示します。 このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。

cd /home/labex/project/rhce-ansible
ansible-galaxy collection list ansible.posix | tee reports/collection-list.txt
ansible-doc ansible.posix.acl | sed -n "1,20p"

コレクションは、名前空間の下にモジュールをパッケージ化します。ここでは ansible.posix.acl は ansible.posix コレクションの acl モジュールを意味し、ansible-doc は Ansible がローカルでドキュメントを見つけられることを証明しています。

インストール済みロールの適用

このステップでは、要件ファイルからインストールしたロールを適用します。これにより、Ansible がインストールされたロールのコンテンツを見つけて実行できることが証明されます。 このステップのコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。

cd /home/labex/project/rhce-ansible
cat > playbooks/use-installed-role.yml <<'EOF'
---
- name: Use a locally installed role
  hosts: managed
  gather_facts: false
  roles:
    - role: local_message
EOF

roles_path がインストールディレクトリを指しているため、プレイブックは local_message を参照するだけで済みます。これにより、プレイブックはアーカイブの場所から独立したものになります。

ansible-playbook playbooks/use-installed-role.yml | tee reports/installed-role-run.txt

実行は failed=0 で終了し、インストールされたロールのタスクからメッセージファイルが作成されるはずです。

cat managed/local-message/message.txt

まとめ

requirements.yml を通じてローカルロールをパッケージ化およびインストールし、インストール済みのコレクションの内容を確認し、プレイブックからインストールされたロールを適用しました。