はじめに
2023/8/14にMolecule 6がリリースされました。
本リリースの変更点はリリースページに詳細がありますが、大きなものは以下の通りです。
- Playbook実行前のカレントディレクトリをシナリオ配下にする
- 外部ドライバーを一時的にサポートしない
- initコマンドを整理
- dependencyの
collections-pathとroles-pathを削除
この中の2. 外部ドライバーを一時的にサポートしないは前々からかなり話題になっていました。
現在Moleculeでは、molecule-pluginsでEC2やpodmanを用意にテスト環境として使えるプラグインを提供しています。
それがサポートされなくなり、defaultドライバ(今までdelegatedドライバと言っていたもの)内で開発者側がAnsibleテスト環境を用意することになります。
筆者もpodmanを使ってLinuxテスト環境を構築していており、影響がありそうなので
今回Molecule v6でコンテナを使ったテストがうまくできるかを検証してみました。
検証
概要
Molecule v5とv6でpodmanを使ったRoleテストを行って以下確認します。
- 設定差分
- 互換性
- 実行時間
- コマンド実行
v5とv6双方の環境用意するのが面倒くさかったので以下シナリオを分けてGitLab Runnerで環境準備しています。
-
molecule/defaultがv5用のシナリオ -
molecule/default6がv6用のシナリオ
レポジトリ
GitLab Runnerの実行結果
コンフィグ差分
バージョン変更したことにより変わった部分は以下の通り。
molecule.yml
Moleculeがpodmanでコンテナを作る際にcontainers.podmanコレクションを使って構築しています。
v5ではプラグイン側で自動的にAnsibleコレクションをダウンロードしてくれていましたが、
v6では明示的にダウンロードする必要があるのでdependency.options.requirements-fileにrequirements.ymlを指定します。
driverはデフォルトでdefaultになったので省略しています。
platforms[*].pre_build_imageは、falseにすることでインスタンスがAnsible実行できるようにMoleculeがローカルコンテナイメージ作成してくれるオプションです。
v6ではそもそも対応しておらず、不要なので削除しています。
dependency:
name: galaxy
+ options:
+ requirements-file: requirements.yml
-driver:
- name: podman
platforms:
- name: instance or instance6
image: quay.io/centos/centos:stream8
- pre_build_image: true
provisioner:
name: ansible
verifier:
name: ansible
requirements.yml
Moleculeがpodmanを操作するために、containers.podmanを記載します。
dockerを使う場合は、ここがcommunity.dockerになります。
collections:
- containers.podman
create.yml, destroy.yml
v5はmoleculeを走らせるとプラグインが勝手にテスト用コンテナを構築・削除してくれましたが、
v6では開発者がAnsibleで構築・削除する必要があります。
こちらは、公式にサンプルとして用意されているものをそのまま使っています。
詳細は以下URLの通り。
互換性
2023/8/15時点で以下確認しました。
- v6でv5用シナリオ(podmanドライバ利用)がテストできるか
- v5でv6用シナリオ(defaultドライバ利用)がテストできるか
1. v6でv5用シナリオ(podmanドライバ利用)がテストできるかは、現時点で問題なく実行可能でした。
しかし、冒頭でも言った通り一時的にサポートしない状態となっているのでどこかのタイミングで利用できない可能性は大いにあります。
利用する際は注意が必要そうです。
2. v5でv6用シナリオ(defaultドライバ利用)がテストできるかは、dependencyで以下WARNINGが出てrequirements.ymlを読み込んでくれない問題点がありました。
事前にコレクションをインストールするか、molecule.ymlでcollections-pathを代わりに使ってあげることで対応可能です。
コレクションがきちんと入っていれば、問題なく実行できるようでした。
Molecule default6 > dependency
[WARNING]: The requirements file
'/builds/miyuk/role_molecule_test/molecule/default6/requirements.yml' contains
collections which will be ignored. To install these collections run 'ansible-
galaxy collection install -r' or to install both at the same time run 'ansible-
galaxy install -r' without a custom install path.
Skipping install, no requirements found
INFO Dependency completed successfully.
WARNING Skipping, missing the requirements file.
実行時間
時間についてv5用シナリオとv6シナリオを比較しました。
v6シナリオのほうがcreateで若干速い結果となりました。
v5シナリオでも内部的にはAnsibleで同じコレクションを利用しているので、おそらくv5の方は他オプションも対応している部分がオーバヘッドになっている可能性があります。
ただし、ほとんど変わらないので気にするほどではなさそうです。
| 工程 | v5 podman | v6 podman | v5 default | v6 default |
|---|---|---|---|---|
| dependency | 0 | 0 | 0 | 2 |
| cleanup | 0 | 0 | 0 | 0 |
| destroy | 12 | 11 | 11 | 12 |
| syntax | 0 | 0 | 0 | 1 |
| create | 13 | 13 | 8 | 7 |
| prepare | 0 | 0 | 0 | 0 |
| converge | 3 | 3 | 3 | 3 |
| idempotence | 3 | 3 | 3 | 3 |
| side_effect | 0 | 0 | 0 | 0 |
| verify | 3 | 2 | 3 | 3 |
| cleanup | 0 | 0 | 0 | 0 |
| destroy | 12 | 11 | 11 | 12 |
| 合計(秒) | 46 | 43 | 39 | 43 |
コマンド実行
各コマンドを使ってみましたが、v6ではmolecule loginが対応できていませんでした。
defaultドライバで別ホストを使う場合、開発者側でインスタンス情報をinstance_config.ymlに保存してそれを使ってSSHログインしに行くようです。
しかし、コンテナの場合はpodman or dockerコマンドでログインするためそのままでは実装できないようでした。
podman execコマンドで代用はできますが、molecule loginはよく使うのでここは大きなマイナスポイントと感じました。
一応、molecule.ymlでlogin_cmd_templateを使うと解決しそうなのでそちらは今後試してみたいと思います。
以下をmolecule.ymlに追記することでmolecule login対応できました。
driver:
options:
managed: false
login_cmd_template: >-
podman exec
-e COLUMNS={columns}
-e LINES={lines}
-e SHELL=bash
-e TERM=xterm
-ti {instance} bash
感想
Molecule v6になってユーザ側が管理すべきファイルが増えましたが、
pluginでブラックボックス化していてものを明示的に宣言できるという意味では分かりやすくなったと思います。
サポートが一時的に止まっていとはいえ、まだ外部ドライバーは今のところ使えそうで互換性は担保できそうです。
シンプルな構成であれば設定変更差分も少ないため、一旦検証すればアップデート対応も苦ではなさそう。
コミュニティでの議論としても以下を目的としており、まだ道半ばだと思うので気長に開発を見守っていきたいと思います。
- グルーコードをなくしてAnsible Playbook開発者がMoleculeテストの成約を下げる
- Ansibleコレクションと連携させる
- 複数の方法、複雑な条件でインスタンスを作成できる
参考URL