Ansible lintのプロファイルについて

こちらの記事は[Ansible lint Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ansible-lint) 4日目の記事になります。

Anible lintのルールの分類は２種類あります。`タグ`と`プロファイル`です。今回はprofileについて説明します。

### プロファイルとは

Ansible lintのプロファイルはAnsible playbook、role、collectionなどのコンテンツ（以下Ansibleコンテンツ）を段階的に向上させることを可能にします。

開発の初期の段階ではあまり厳密な記述をせず、自由に書く方が良いかもしれません。次の段階でAnsibleコンテンツや開発メンバーが増えたら少し厳しいルールを適用してコンテンツの書き方に一貫性を持たせるのも良いかもしれません。またAnsibleコンテンツをGalaxy等へ公開する場合、厳密なルールを適用した方が良いかもしれません。

プロファイルを利用する事でそれぞれの状況に合わせたルールの適用がしやすくなります。

### プロファイルの種類

プロファイルの種類は`ansible-lint --list-profiles`で確認できます。以下の6種類があります。

* min
* basic
* moderate
* safety
* shared
* production

### min

一応プロファイルの中に分類されていますがAnsibleがAnsibleコンテンツをロードできるかどうか最低限の検査を行います。どちらかと言えばシンタックスチェックに近い扱いです。

* [internal-error](https://ansible-lint.readthedocs.io/rules/internal-error/)
* [load-failure](https://ansible-lint.readthedocs.io/rules/load-failure/)
* [parser-error](https://ansible-lint.readthedocs.io/rules/parser-error/)
* [syntax-check](https://ansible-lint.readthedocs.io/rules/syntax-check/)

### basic

基本プロファイルです。Ansible lint的に標準的に守るべきルールと言う位置付けらしいです。


* [command-instead-of-module](https://ansible-lint.readthedocs.io/rules/command-instead-of-module/)
* [command-instead-of-shell](https://ansible-lint.readthedocs.io/rules/command-instead-of-shell/)
* [deprecated-bare-vars](https://ansible-lint.readthedocs.io/rules/deprecated-bare-vars/)
* [deprecated-command-syntax](https://ansible-lint.readthedocs.io/rules/deprecated-command-syntax/)
* [deprecated-local-action](https://ansible-lint.readthedocs.io/rules/deprecated-local-action/)
* [deprecated-module](https://ansible-lint.readthedocs.io/rules/deprecated-module/)
* [inline-env-var](https://ansible-lint.readthedocs.io/rules/inline-env-var/)
* [key-order](https://ansible-lint.readthedocs.io/rules/key-order/)
* [literal-compare](https://ansible-lint.readthedocs.io/rules/literal-compare/)
* [jinja](https://ansible-lint.readthedocs.io/rules/jinja/)
* [no-jinja-when](https://ansible-lint.readthedocs.io/rules/no-jinja-when/)
* [no-tabs](https://ansible-lint.readthedocs.io/rules/no-tabs/)
* [partial-become](https://ansible-lint.readthedocs.io/rules/partial-become/)
* [playbook-extension](https://ansible-lint.readthedocs.io/rules/playbook-extension/)
* [role-name](https://ansible-lint.readthedocs.io/rules/role-name/)
* [schema](https://ansible-lint.readthedocs.io/rules/schema/)
* [name](https://ansible-lint.readthedocs.io/rules/name/)
* [var-naming](https://ansible-lint.readthedocs.io/rules/var-naming/)
* [yaml](https://ansible-lint.readthedocs.io/rules/yaml/)


### moderate

Ansibleコンテンツが読みやすくメンテナンスしやすいように記述されている事を保証するプロファイルです。

* [name[template]](https://ansible-lint.readthedocs.io/rules/name/)
* [name[imperative]](https://ansible-lint.readthedocs.io/rules/name/)
* [name[casing]](https://ansible-lint.readthedocs.io/rules/name/)
* [no-free-form](https://ansible-lint.readthedocs.io/rules/no-free-form/)
* [spell-var-name](https://ansible-lint.readthedocs.io/rules/spell-var-name/)

### safety

このプロファイルは実行時に副作用を伴う記述方法やセキュリティー上懸念がある記述があるかをできる限り検査します。プログラミングの観点から言えばコンテンツがsafetyプロファイルの基準を満たしていても利用上100%安全なコンテンツであると言う保証はありません。

* [avoid-implicit](https://ansible-lint.readthedocs.io/rules/avoid-implicit/)
* [latest](https://ansible-lint.readthedocs.io/rules/latest/)
* [package-latest](https://ansible-lint.readthedocs.io/rules/package-latest/)
* [risky-file-permissions](https://ansible-lint.readthedocs.io/rules/risky-file-permissions/)
* [risky-octal](https://ansible-lint.readthedocs.io/rules/risky-octal/)
* [risky-shell-pipe](https://ansible-lint.readthedocs.io/rules/risky-shell-pipe/)

### shared

AnsibleコンテンツをGalaxyやGitHub等に公開するためのプロファイルです。自分以外のユーザーがコンテンツを利用する場合に満たすべきプロファイルと言う扱いみたいです。

* [galaxy](https://ansible-lint.readthedocs.io/rules/galaxy/)
* [ignore-errors](https://ansible-lint.readthedocs.io/rules/ignore-errors/)
* [layout](https://ansible-lint.readthedocs.io/rules/layout/)
* [meta-incorrect](https://ansible-lint.readthedocs.io/rules/meta-incorrect/)
* [meta-no-info](https://ansible-lint.readthedocs.io/rules/meta-no-info/)
* [meta-no-tags](https://ansible-lint.readthedocs.io/rules/meta-no-tags/)
* [meta-video-links](https://ansible-lint.readthedocs.io/rules/meta-video-links/)
* [meta-version](https://ansible-lint.readthedocs.io/rules/meta-version/)
* [meta-unsupported-ansible](https://ansible-lint.readthedocs.io/rules/meta-unsupported-ansible/)
* [no-changed-when](https://ansible-lint.readthedocs.io/rules/no-changed-when/)
* [no-changelog](https://ansible-lint.readthedocs.io/rules/no-changelog/)
* [no-handler](https://ansible-lint.readthedocs.io/rules/no-handler/)
* [no-relative-paths](https://ansible-lint.readthedocs.io/rules/no-relative-paths/)
* [max-block-depth](https://ansible-lint.readthedocs.io/rules/max-block-depth/)
* [max-tasks](https://ansible-lint.readthedocs.io/rules/max-tasks/)
* [unsafe-loop](https://ansible-lint.readthedocs.io/rules/unsafe-loop/)

### production

Ansibleコンテンツが`Ansible Automation Platform（AAP）`に採用される基準を満たすことを保証するプロファイルです。Ansible lintの初期プロファイルです。特に指定しない限りプロファイルには常にproducitonが採用されます。

* [avoid-dot-notation](https://ansible-lint.readthedocs.io/rules/avoid-dot-notation/)
* [disallowed-ignore](https://ansible-lint.readthedocs.io/rules/disallowed-ignore/)
* [fqcn](https://ansible-lint.readthedocs.io/rules/fqcn/)
* [import-task-no-when](https://ansible-lint.readthedocs.io/rules/import-task-no-when/)
* [meta-no-dependencies](https://ansible-lint.readthedocs.io/rules/meta-no-dependencies/)
* [single-entry-point](https://ansible-lint.readthedocs.io/rules/single-entry-point/)
* [use-loop](https://ansible-lint.readthedocs.io/rules/use-loop/)