🐕

GitHub Actionsでansible-lintを実行する

2022/11/06に公開

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をインストールして実行してくれる。

requirements.yml
---

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を利用したい場合は以下のように記述する。

ansible-lint.yml
# 注意: 現在は利用できない
- 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@mainansible-lint-action@v6 を指定してansible-lint v6.8.2などを利用する。
それ以外の特定バージョンを利用したい場合は、 ansible/ansible-lint-action は利用せず、自前でCI環境を構築した方がよさそう。
ansibleおよびansible-coreやansible-lintの対応バージョンはかなり複雑なので注意が必要。

参考:

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