Contents
ansible-lint 4.3.1から動的に自作したカスタムルールを読み込める仕組みが導入されました。
この実装によって、自作したカスタムルールをパッケージングして配布することが可能になったので、その方法について簡単にですがメモしておきます。
カスタムパッケージの動的読み込みの利点
- コマンドのオプションでカスタムルールのディレクトリを指定しなくてもよい
- 標準カスタムルールを作成してパッケージングしておくことで組織内に配布・導入しやすくなった
- pipでインストールできるためシンプルに対応できる
カスタムルール導入方法
導入方法については以下のサンプルを元に説明します。
環境
ここでは Python 3.6
以上を想定しています。
事前準備
事前準備として venv
を作成します。
1 2 |
$ python3 -m venv venv && . venv/bin/activate && pip install --upgrade pip |
ansible-lintを実行するには依存関係でansibleが必要になるので、ここではansible-coreをインストールします。
1 2 |
(venv)$ pip install ansible-core |
ここで詳細に説明しないこと
- Ansible Lintのカスタムルールの作り方
- Pythonのパッケージングのやり方
- PyPIへの登録
カスタムルールについて
サンプルで作ったカスタムルールはタスクの名前が Example
で始まっていた場合、警告が発生するようにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
from typing import Any, Dict, Union, Optional from ansiblelint.file_utils import Lintable from ansiblelint.rules import AnsibleLintRule import re class ExampleRule(AnsibleLintRule): id = "10000" shortdesc = "Shouldn't begin 'Example' in the name." description = "Example custom rule." severity = "MEDIUM" tags = [""] def matchtask( self, task: Dict[str, Any], file: "Optional[Lintable]" = None ) -> Union[bool, str]: if re.match(r'Example', task['name']): return True return False |
Pythonパッケージングについて
サンプルにあるファイルと以下を参照ください。
チュートリアル
もし、パッケージングをしたことない人であればチュートリアルを先にやった方が理解ができると思いますので、リンクとして貼り付けておきます。
setuptools
setup.cfg
については上記ドキュメントを参照ください。
カスタムルールインストール先
パッケージのインストール時にカスタムルールは以下のパスに保存するようにしてください。
1 2 |
ansiblelint/rules/custom/<your_custom_rules_subdir> |
パッケージを作成してインストール
pipでbuildモジュールをインストールします。
1 2 |
(venv)$ pip install build |
GitHubからサンプルをクローンします。
1 2 |
(venv)$ git clone https://github.com/sky-joker/ansible-lint-custom-rule-package-sample.git |
パッケージを作成します。
1 2 3 4 |
(venv)$ cd ansible-lint-custom-rule-package-sample (venv)$ python -m build (venv)$ ls dist/example_lint_rules-0.0.1.tar.gz |
パッケージをインストールします。
1 2 |
(venv)$ pip install dist/example_lint_rules-0.0.1.tar.gz |
GitHubからインストール
GitHubから直接インストールする場合は以下のように実行します。
1 2 |
(venv)$ pip install git+https://github.com/sky-joker/ansible-lint-custom-rule-package-sample.git |
動作確認
カスタムルールがインストールされたか確認します。
1 2 3 4 5 6 7 8 9 10 11 12 |
(venv)$ pip show example-lint-rules Name: example-lint-rules Version: 0.0.1 Summary: Example Lint Rules Home-page: https://github.com/sky-joker/ansible-lint-custom-rule-package-sample Author: sky-joker Author-email: None License: MIT Location: xxxxxxxx/test/venv/lib/python3.9/site-packages Requires: ansible-lint Required-by: |
LintでテストするサンプルのPlaybookを作成します。
1 2 |
(venv)$ vi main.yml |
1 2 3 4 5 6 7 8 9 |
--- - name: Sample Playbook hosts: localhost gather_facts: false tasks: - name: Example debug: msg: "Hello World!" |
ansible-lintを実行してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
(venv)$ ansible-lint main.yml (snip) 10000: Shouldn't begin 'Example' in the name. main.yml:6 Task/Handler: Example You can skip specific rules or tags by adding them to your configuration file: # .ansible-lint warn_list: # or 'skip_list' to silence them completely - 10000 # Shouldn't begin 'Example' in the name. Finished with 1 failure(s), 0 warning(s) on 1 files. |
動きました 🙂
補足ですが、インストールしたカスタムルールの具体的なパスは次の通りです。
1 2 |
venv/lib/python3.9/site-packages/ansiblelint/rules/custom/example_lint_rules/ExampleRule.py |
パッケージ化して配布できるのは便利ですね 🙂