Ansible Builderを使ったイメージビルドでAutomation Hub(console.redhat.com)のコレクションをインストールする場合の定義ファイルについて。
条件として、各定義ファイル内に認証情報を記述せずに実行時に外部から指定し、バージョン管理対象のファイルに機密情報を含まない形にする。
お題は以下のエントリと同様に次のコレクションをインストールするものとする。
| コレクション名 | 配布元 |
|---|---|
| ansible.platform | automation hub |
| ansible.controller | automation hub |
| community.proxmox | galaxy |
認証設定
Execution Environmentのv3ではansible.cfgはビルド時には使用しないので、基本すべてexecution-environment.ymlに記述していく。
設定例としては以下を参考。
Building EEs with environment variables for Galaxy configuration — Ansible Builder Documentation
execution-environment.ymlは基本的には上記ドキュメントの通りだが、不要な設定がイメージに残らないように少しアレンジしている。
version: 3 images: base_image: name: registry.redhat.io/ansible-automation-platform-25/ee-minimal-rhel8:latest dependencies: galaxy: requirements.yml additional_build_steps: prepend_galaxy: - ARG ANSIBLE_GALAXY_SERVER_LIST=automation_hub,release_galaxy - ARG ANSIBLE_GALAXY_SERVER_AUTOMATION_HUB_URL=https://console.redhat.com/api/automation-hub/content/published/ - ARG ANSIBLE_GALAXY_SERVER_AUTOMATION_HUB_AUTH_URL=https://sso.redhat.com/auth/realms/redhat-external/protocol/openid-connect/token - ARG ANSIBLE_GALAXY_SERVER_AUTOMATION_HUB_TOKEN - ARG ANSIBLE_GALAXY_SERVER_RELEASE_GALAXY_URL=https://galaxy.ansible.com/ options: package_manager_path: /usr/bin/microdnf
imagesとdependenciesは書いてる通りなので説明は割愛。
ポイントはadditional_build_steps.prepend_galaxyにリスト形式で記載しているのはビルドを行うコンテナ内で使用する環境変数で、これはDockerfile/Containerfileで使う構文のARGと同様。内容についてはCLI(ansible-galaxy)でインストールする際にansible.cfgに記述する内容と同等。
公式ドキュメントには(トークン以外には)ENVが使われているが、コレクションインストールに必要な情報はビルドのみで使用し、ビルド結果のイメージでは不要なのでARGに変更している。
(ENVを使った環境変数指定はビルドした成果物であるイメージでも有効だがARGはビルドのみで有効という違いがあり、EEの実行時にAnsible Galaxy関連の情報は不要なのでARGを使って残らないようにしている)
指定する環境変数は以下の通り。
ANSIBLE_GALAXY_SERVER_LIST=automation_hub,release_galaxyに指定したautomation_hubとrelease_galaxyの文字列がそのまま以降の環境変数名となる。
具体的にはANSIBLE_GALAXY_SERVER_****_URLやANSIBLE_GALAXY_SERVER_****_TOKENの****の部分。
| 環境変数名 | 値の説明 |
|---|---|
| ANSIBLE_GALAXY_SERVER_LIST | Automation HubとGalaxyの2項目を設定するためカンマ区切りでキー名を指定 |
| ANSIBLE_GALAXY_SERVER_AUTOMATION_HUB_URL | ansible.cfgのgalaxy_server以下で指定したurlの内容 |
| ANSIBLE_GALAXY_SERVER_AUTOMATION_HUB_AUTH_URL | ansible.cfgのgalaxy_server以下で指定したauth_urlの内容 |
| ANSIBLE_GALAXY_SERVER_AUTOMATION_HUB_TOKEN | ansible.cfgのgalaxy_server以下で指定したauth_tokenに相当するがトークンは実行時に指定するためブランク |
| ANSIBLE_GALAXY_SERVER_RELEASE_GALAXY_URL | 前述のurlと同様だがこれはAutomation HubでなくGalaxy用 |
requirements.ymlは同じディレクトリに以下の内容で作成
--- collections: - name: ansible.platform - name: ansible.controller - name: community.proxmox
拡張性を考慮してname:を入れてるけど、コレクション名だけでもOK
ビルド
トークンを環境変数REDHAT_AH_TOKENにセットした上で、以下を実行すればビルド可能。ただし…
ansible-builder build --tag custom --context . --build-arg ANSIBLE_GALAXY_SERVER_AUTOMATION_HUB_TOKEN=$REDHAT_AH_TOKEN
ただし、手動での作業ならこれでも大丈夫だが、ansible-builderの実行は「Running command」という名目でSTDOUTに--build-arg=ANSIBLE_GALAXY_SERVER_AUTOMATION_HUB_TOKEN=$REDHAT_AH_TOKENの中身が展開されて出力(表示)されるため、CI/CDなどの仕組みのログに残ってしまう問題がある。
そこで、ansible-builderはContainerfileの出力のみを行い、ビルド自体はpodman buildを別途実行するのが簡単で良い。
(例えばGitHub ActionsであればコンテナビルドのためのActionがあるのでこの構成の方が都合が良い場合が多い)
# カレントディレクトリにContainerfile作成 ansible-builder create -c . # 作成されたContainerfileで環境変数指定しつつイメージビルド podman build -f ./Containerfile -t custom --build-arg=ANSIBLE_GALAXY_SERVER_AUTOMATION_HUB_TOKEN=$REDHAT_AH_TOKEN
2段階に分かれているので、execution-environment.ymlを更新した後に手動でリビルドする際は、ansible-builder createでContainerfileを再生成するのを忘れずに。
あと上記サンプルはベースイメージをregistry.redhat.ioからpullする設定でコンテナレジストリへの認証が必要なため、これは事前にイメージビルドとは別にpodman loginしておく。