GitHub Actionsでansible-lintを実行する
GitHub Actionsでansible-lintを実行したい。
特に、ansible 2.9以降のバージョンに更新する上でCI環境を整備するときの注意点をまとめる。
actionリポジトリの変更
従来は ansible-community/ansible-lint-action
として提供されていたが、ansible/ansible-lint-action
に変更になった。正確には、ansible-community/ansible-lint-action
でも使えたが、ついに使えなくなったみたい。
どうやら、リポジトリがansible-communityからansibleに移管された?
このため、ansible-lint-actionを利用する場合はリポジトリの修正が必要。
workflowの記載例は以下の通り。
- name: Run ansible-lint
uses: ansible/ansible-lint-action@main
READMEなど、一部 ansible-community/ansible-lint-action
表記が残っているので注意が必要。修正プルリクは出ているので今後修正されるはず。
利用collectionをrequirements.ymlに記載する
ansible 2.9以降からさまざまなモジュール等がcollectionsとしてansible-coreから分離されており、必要に応じて追加でインストールする必要がある。例えば、community.general.gem
を利用しているのに追加インストールしていない場合、以下のようなエラーメッセージが出力される。
# ローカルでのエラー
WARNING Unable to resolve FQCN for module community.general.gem
# GitHub Actions上でのエラー
couldn't resolve module/action 'community.general.gem'. This often indicates a misspelling, missing collection, or incorrect module path.
ローカル環境では ansible-galaxy collection install <collection名>
でインストールしていればよい。
GitHub Actions環境はコンテナとして実行されるため、事前にインストールしておくことはできない。
これに対処するため、ドキュメントに従い依存するcollectionはrequirements.ymlで管理する。
これにより、ansible-lint-actionは自動的に必要なcollectionをインストールして実行してくれる。
---
collections:
- community.general
- ansible.posix
ただし、ansible-lint-actionがrequirements.ymlの内容を参照して自動的にインストールしてくれるという挙動はドキュメントからは見つからなかった。
ローカルでcollectionsをインストールせずにansible-lintを実行しても自動的にcollectionsをインストールしてはくれないので、おそらくansible-lint-actionの機能として提供している?(コードを見てもそれらしき実装は見つけられなかった)。
ドキュメントでは複数collectionを利用する場合にはrequirements.ymlを利用すると便利みたいな紹介ではあるが、CI環境を考慮すると1つのcollectionしか利用しなくてもrequirements.ymlで管理した方がよさそう。
ansible-lintバージョンの差し替え
利用するansibleバージョンの関係から、古いansible-lintを利用したい場合、従来はoverride-depsで指定していた。例えばansible 2.9 および ansible-lint 4.2.0を利用したい場合は以下のように記述する。
# 注意: 現在は利用できない
- name: Lint Ansible Playbook
uses: ansible/ansible-lint-action@main
with:
override-deps: |
ansible==2.9
ansible-lint==4.2.0
しかし、ansible-lint-action環境が整備された結果、override-deptsは利用できなくなった。
提供されているansible-lint-actionのバージョニングが始まったのもv6からで、対応するansibleバージョンは以下の通り。
ansible-lint-action | ansible-lint | ansible |
---|---|---|
v6.0.1 | v5.3.1 | 2.9+ |
v6.0.2 | v6.0.2 | 2.12+ |
v6.8.2(最新) | v6.8.2 | 2.12+ |
ansible 2.9系を利用しているなら ansible-lint-action@v6.0.1
を指定して ansible-lint v5.3.1を利用する。
ansible 6 (ansible-core 2.13)を利用しているなら最新の ansible-lint-action@main
や ansible-lint-action@v6
を指定してansible-lint v6.8.2などを利用する。
それ以外の特定バージョンを利用したい場合は、 ansible/ansible-lint-action
は利用せず、自前でCI環境を構築した方がよさそう。
ansibleおよびansible-coreやansible-lintの対応バージョンはかなり複雑なので注意が必要。
参考:
- [2022-03-16] [Ansible] ansible-lint 6.0.0 のインストールで ansible-core 2.12.3 も一緒にインストールされる
- [2022-07-08] [Ansible] ansible 6.0.0 で ansible-community コマンドが追加された
CI環境
GitHub Actionsの実行環境は creator-ee で環境構築している。これはansible-core, ansible-lint, moleculeを含んだ開発環境。
Red Hat 色が強く、DockerではなくPodman(Containerfile)や Quay.io を利用している。
creator-eeの導入により、ansible-lint実行時に利用バージョンを差し替えることはできなくなったが、各種バージョンが固定されて把握しやすくなった。
ansible-lint-actionにおける利用バージョンを確認する場合は、対応するcreator-eeのバージョンを確認し、creator-eeと対応するansible-coreやansible-lintなどのバージョンをチェックすればよい。
Discussion