1
0

[Ansible]Ansible Builder v3.1で追加された依存関係の除外オプション

Posted at

Ansible Builderは、Ansibleの実行環境(EE)コンテナを作成するためのツールです。
EEで利用するAnsibleコレクションPythonパッケージLinuxパッケージを明示的に指定してあげることで、Builderが依存関係を解決してコンテナ化してくれます。

先日、Ansible Builder v3.1がリリースされて依存関係の解決のためのオプションが追加されたためその機能について動作を検証しました。

ansible-builderの依存関係解決

PythonパッケージとLinuxパッケージの依存関係は、pipdnfコマンドをそのまま動かしています。

Ansibleコレクションの依存関係は、ansible-galaxyコマンドだと依存するAnsibleコレクションのみを解決してくれます。
一方、Ansible BuilderではさらにPythonパッケージLinuxパッケージの依存関係を解決してくれます。
これは、ありがたい反面Builder利用者側で依存関係を制御することができないという問題点がありました。

例えば、複数のAnsibleコレクションが指定した依存関係でバージョン衝突が起こり得ます。

これを解決するためAnsible Builder v3.1では、Ansibleコレクションの依存関係を無視できるオプションができました。

追加されたオプション(exclude)について

execution-environment.ymlで以下のように記載することでAnsibleコレクションの依存関係解決を無視することができます。

dependencies:
  exclude:
    python:
      - <無視したいPythonパッケージ>
    system:
      - <無視したいLinuxパッケージ>
    all_from_collections:
      - <Python、Linuxの依存関係を無視したいAnsibleコレクション>

正規表現が使えるためazure関連のものすべてを無視したい場合は、azure-.*で指定できます。

また、Pythonパッケージ以外にもLinuxパッケージも指定することができたり、Ansbleコレクション単位で無視をすることもできます。

Pythonパッケージ、Linuxパッケージを指定する際の注意点としては、無視できるのはAnsibleコレクションで直接指定される依存関係のみで、間接的な依存関係は無視されません。

検証したこと

概要

やりたいこと

以下をインストールしたEEを作成する。

  • Ansibleコレクション
    • azure.azcollectionの最新版(2.4.0)
  • Pythonパッケージ
    • ansible-lintの最新版(24.6.1)

問題点

azure.azcollectionはPythonパッケージのazure-cli-core==2.34.0に依存しており、さらにpackaging>=20.9,<22.0に間接依存しています。
azure-cli-core==2.61.0packagingの依存関係自体ないのでそちらはインストールできます。

一方、ansible-lintblack>=24.3.0経由でpackaging>=22.0に間接依存しています。

このpackaging>=20.9,<22.0packaging>=22.0がコンフリクトを起こしてしまうため、ビルド中に以下エラーが出て失敗してしまいます。

ERROR: Cannot install -r /tmp/src/requirements.txt (line 5), -r /tmp/src/requirements.txt (line 52), ansible-lint and packaging because these package versions have conflicting dependencies.

The conflict is caused by:
    The user requested packaging
    azure-cli-core 2.34.0 depends on packaging<22.0 and >=20.9
    ansible-lint 24.6.1 depends on packaging>=21.3
    ansible-compat 24.5.1a0 depends on packaging
    ansible-core 2.13.0 depends on packaging
    black 24.4.2 depends on packaging>=22.0

定義ファイル

EEを作成する3ファイルは以下の通り。

execution-environment.yml

コンテナのベースイメージはデフォルトでPython3.9が入っているが、ansible-lintの最新版をインストールできないためPython3.11に置き換えている。

execution-environment.yml
---
version: 3

images:
  base_image:
    name: quay.io/centos/centos:stream9-minimal

options:
  package_manager_path: /usr/bin/microdnf
dependencies:
  python_interpreter:
    package_system: python3.11
    python_path: /usr/bin/python3.11
  ansible_core:
    package_pip: ansible-core==2.17.1
  ansible_runner:
    package_pip: ansible-runner==2.4.0
  python: requirements.txt
  galaxy: requirements.yml
additional_build_steps:
  append_base:
    - RUN alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 0

requirements.yml

---
collections:
  - name: azure.azcollection
    version: 2.4.0

requirements.txt

ansible-lint==24.6.1

解決方法

execution-environment.ymlazure-cli-coreを無視する対象に指定します。

execution-environment.yml
dependencies:
  exclude:
    python:
      - azure-cli-core

また、このままだとazure-cli-core自体がインストールされないので、requirements.txtazure-cli-coreを指定する必要があります。

requirements.txt
azure-cli-core==2.61.0

ここでインストールされた依存関係がAnsibleコレクションで利用できるかは利用者側で別途確認が必要です。

結果

Pythonパッケージでazure-cli-coreがインストールされ、バージョンも2.61.0になっていることが確認できます。
Azure Ansibleコレクションの動作は調べ切れていないですが、調査した限りはある程度の後方互換性があるようなので問題ないかと思います。

bash-5.1$ pip3 list | grep azure-cli-core
azure-cli-core                       2.61.0

参考リンク

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0