てくなべ (tekunabe)

ansible / network automation / 学習メモ

[ansible] ansible-builder で Automation Hub 経由のコレクションをインストールしたイメージをビルドする

この記事は、Ansible Advent Calendar 2021 (Adventar版) 16日目の記事です。

はじめに

ansible-builder では、requirements.yml にインストールしたいコレクションを指定し、Execution Environment 定義ファイル(デフォルトでは execution-environment.yml)に

dependencies:
  galaxy: requirements.yml

のように指定すると、ビルドするイメージ内にコレクションをインストールできます。

Execution Environment Definition — ansible-builder 1.0.1 documentation

デフォルトでは Ansible Galaxy 経由のコレクションです。

Automation Hub 経由のコレクションをインストールするには、少し仕込みが必要です。この記事では手順を紹介します。

  • 動作確認環境
    • ansible-builder 1.0.1

requirements.yml の用意

今回はこんなものを利用します。ansible.controller コレクションが Galaxy になく Automation Hub の方にしかないコレクションです。

---
collections:
  - cisco.ios
  - cisco.iosxr
  - cisco.nxos
  - junipernetworks.junos
  - seiko.smartcs
  - ansible.controller  # Galaxy になく Automation Hub の方にしかないもの

ansible.cfg の用意

(Automation Hub 経由のコレクションをansible-galaxy collection install でインストールしたい場合と同じです)

Automation Hub への接続するためのトークンを取得し、ansible.cfg で接続先やトークンの指定をします。

以下の過去の記事をご参照ください。

tekunabe.hatenablog.jp

Execution Environment 定義ファイルの用意

Execution Environment 定義ファイル(デフォルトでは execution-environment.yml)内の、ansible_configansible.cfg のパスを指定します。

先程用意した requirements.yml も指定します。

version: 1

build_arg_defaults:
  EE_BASE_IMAGE: 'quay.io/ansible/ansible-runner:stable-2.12-devel'
ansible_config: ansible.cfg  # ポイント1
dependencies:
  galaxy: requirements.yml  # ポイント2

ビルド

ここまで作ったファイルは以下のとおりです。

$ ls -1
ansible.cfg
execution-environment.yml
requirements.yml

この場所で通常通り、ansible-builder build コマンドでビルドします。

ansible-builder build -t localhost/my-ee

確認

ビルドしたイメージに目的のコレクションがインストールされたことを確認します。

ansible-navigator collections で確認する場合

コマンド例

ansible-navigator collections --pp never --eei localhost/my-ee 

今回は、ローカルのイメージを使うので、pull しないオプション --pp never を指定しています。

各オプションは ansible-navigator.yml で指定してもOKです。

結果例

  NAME                    VERSION  SHADOWED  TYPE       PATH
0│ansible.controller      4.1.0       False  contained  /usr/share/ansible/collections/ansible_collections/ansible/controller/
1│ansible.netcommon       2.5.0       False  contained  /usr/share/ansible/collections/ansible_collections/ansible/netcommon/
2│ansible.utils           2.4.3       False  contained  /usr/share/ansible/collections/ansible_collections/ansible/utils/
3│cisco.ios               2.6.0       False  contained  /usr/share/ansible/collections/ansible_collections/cisco/ios/
4│cisco.iosxr             2.6.0       False  contained  /usr/share/ansible/collections/ansible_collections/cisco/iosxr/
5│cisco.nxos              2.8.1       False  contained  /usr/share/ansible/collections/ansible_collections/cisco/nxos/
6│junipernetworks.junos   2.8.0G ON ITFalse  contained  /usr/share/ansible/collections/ansible_collections/junipernetworks/junos/
7│seiko.smartcs           1.4.1       False  contained  /usr/share/ansible/collections/ansible_collections/seiko/smartcs/

ansible.controller コレクション含め、インストールされていることが分かります。

コンテナ内の ansible-galaxy collection list で確認する場合

コマンド例

podman run -it localhost/my-ee ansible-galaxy collection list

結果例

$ podman run -it localhost/my-ee ansible-galaxy collection list

# /usr/share/ansible/collections/ansible_collections
Collection            Version
--------------------- -------
ansible.controller    4.1.0  
ansible.netcommon     2.5.0  
ansible.utils         2.4.3  
cisco.ios             2.6.0  
cisco.iosxr           2.6.0  
cisco.nxos            2.8.1  
junipernetworks.junos 2.8.0  
seiko.smartcs         1.4.1