入れる機会があったのでメモしておく
dotfilesで使っているAnsibleに入れた
ansible/ansible-lint: Best practices checker for Ansible
インストール
pip install ansible-lint
設定
- .ansible-lint
parseable: true quiet: true use_default_rules: true verbosity: 1 skip_list: - '401'
他にも指定できるみたいだがいったんはデフォルトに近い形で設定する
parseable, quietは出力フォーマットに影響があるので好みの設定で使えば良さそう
各種設定はREADME読むのが良さそう
実行
実行してみる
playbook1つ指定するとそこで読み込んでいるroleなどもlintの対象にしてくれる
$ ansible-lint ubuntu.yml mac.yml development.yml
Examining development.yml of type playbook
Examining roles/common/tasks/debian.yml of type tasks
Examining roles/common/tasks/main.yml of type tasks
Examining roles/common/tasks/redhat.yml of type tasks
Examining roles/git/tasks/main.yml of type tasks
Examining roles/zsh/tasks/main.yml of type tasks
Examining roles/zsh/tasks/source.yml of type tasks
Examining roles/jo/tasks/main.yml of type tasks
Examining roles/peco/tasks/main.yml of type tasks
Examining roles/jq/tasks/main.yml of type tasks
Examining roles/docker-compose/tasks/main.yml of type tasks
Examining roles/terraform/tasks/main.yml of type tasks
Examining roles/embulk/tasks/main.yml of type tasks
Examining roles/sshrc/tasks/main.yml of type tasks
Examining roles/vim8/tasks/main.yml of type tasks
Examining roles/tmux/tasks/main.yml of type tasks
Examining roles/docker/tasks/main.yml of type tasks
Examining roles/samba/tasks/main.yml of type tasks
Examining roles/q/tasks/main.yml of type tasks
Examining roles/nginx/tasks/main.yml of type tasks
Examining roles/notofont/tasks/main.yml of type tasks
Examining roles/by_pip/tasks/main.yml of type tasks
Examining roles/preconfig/tasks/main.yml of type tasks
Examining roles/anyenv/tasks/main.yml of type tasks
Examining roles/direnv/tasks/main.yml of type tasks
Examining roles/powerline/tasks/main.yml of type tasks
Examining roles/zsh_syntax_highlighting/tasks/main.yml of type tasks
Examining roles/postconfig/tasks/main.yml of type tasks
Examining mac.yml of type playbook
Examining roles/brew/tasks/main.yml of type tasks
Examining ubuntu.yml of type playbook
roles/anyenv/tasks/main.yml:1: [E401] Git checkouts must contain explicit version
roles/anyenv/tasks/main.yml:26: [E305] Use shell only when shell functionality is required
roles/anyenv/tasks/main.yml:33: [E305] Use shell only when shell functionality is required
roles/anyenv/tasks/main.yml:48: [E404] Doesn't need a relative path in role
roles/anyenv/tasks/main.yml:60: [E305] Use shell only when shell functionality is required
roles/anyenv/tasks/main.yml:67: [E305] Use shell only when shell functionality is required
roles/anyenv/tasks/main.yml:75: [E305] Use shell only when shell functionality is required
roles/direnv/tasks/main.yml:4: [E206] Variables should have spaces before and after: {{ var_name }}
roles/direnv/tasks/main.yml:9: [E305] Use shell only when shell functionality is required
roles/direnv/tasks/main.yml:12: [E206] Variables should have spaces before and after: {{ var_name }}
roles/docker-compose/tasks/main.yml:4: [E206] Variables should have spaces before and after: {{ var_name }}
roles/docker-compose/tasks/main.yml:9: [E305] Use shell only when shell functionality is required
roles/docker-compose/tasks/main.yml:12: [E206] Variables should have spaces before and after: {{ var_name }}
roles/docker/tasks/main.yml:4: [E206] Variables should have spaces before and after: {{ var_name }}
roles/docker/tasks/main.yml:9: [E305] Use shell only when shell functionality is required
roles/docker/tasks/main.yml:12: [E206] Variables should have spaces before and after: {{ var_name }}
roles/docker/tasks/main.yml:20: [E305] Use shell only when shell functionality is required
roles/embulk/tasks/main.yml:7: [E206] Variables should have spaces before and after: {{ var_name }}
roles/embulk/tasks/main.yml:12: [E305] Use shell only when shell functionality is required
roles/embulk/tasks/main.yml:15: [E206] Variables should have spaces before and after: {{ var_name }}
roles/git/tasks/main.yml:12: [E206] Variables should have spaces before and after: {{ var_name }}
roles/git/tasks/main.yml:17: [E303] git used in place of git module
roles/git/tasks/main.yml:17: [E305] Use shell only when shell functionality is required
roles/git/tasks/main.yml:20: [E206] Variables should have spaces before and after: {{ var_name }}
roles/jo/tasks/main.yml:4: [E206] Variables should have spaces before and after: {{ var_name }}
roles/jo/tasks/main.yml:9: [E305] Use shell only when shell functionality is required
roles/jo/tasks/main.yml:12: [E206] Variables should have spaces before and after: {{ var_name }}
roles/notofont/tasks/main.yml:2: [E206] Variables should have spaces before and after: {{ var_name }}
roles/notofont/tasks/main.yml:38: [E301] Commands should not change things if nothing needs doing
roles/postconfig/tasks/main.yml:70: [E401] Git checkouts must contain explicit version
roles/postconfig/tasks/main.yml:78: [E301] Commands should not change things if nothing needs doing
roles/powerline/tasks/main.yml:1: [E403] Package installs should not use latest
roles/powerline/tasks/main.yml:4: [E301] Commands should not change things if nothing needs doing
roles/powerline/tasks/main.yml:4: [E305] Use shell only when shell functionality is required
roles/preconfig/tasks/main.yml:13: [E401] Git checkouts must contain explicit version
roles/samba/tasks/main.yml:12: [E503] Tasks that run when changed should likely be handlers
roles/terraform/tasks/main.yml:4: [E206] Variables should have spaces before and after: {{ var_name }}
roles/terraform/tasks/main.yml:12: [E206] Variables should have spaces before and after: {{ var_name }}
roles/tmux/tasks/main.yml:4: [E206] Variables should have spaces before and after: {{ var_name }}
roles/tmux/tasks/main.yml:9: [E305] Use shell only when shell functionality is required
roles/tmux/tasks/main.yml:12: [E206] Variables should have spaces before and after: {{ var_name }}
roles/zsh/tasks/main.yml:27: [E401] Git checkouts must contain explicit version
roles/zsh_syntax_highlighting/tasks/main.yml:1: [E401] Git checkouts must contain explicit version
めちゃくちゃ出てきた…
特定ルールの除外
- skip_list
Exxxの部分のコードを指定すると指摘をスキップできる
Gitのcheckoutバージョンの指定はまぁいいかなということで今回除外した
[E401] Git checkouts must contain explicit version
- .ansible-lint
skip_list: - '401'
特定行のlint除外
ansible/ansible-lint: Best practices checker for Ansible
対象行の末尾に # noqa 401 というようにコードを指定すると除外できる
「全体としては適用したいがこの場合はやむなし」のような事情がある場合などに使う
- 例
- name: get git version # noqa 303
- noqa
いきなり「noqaを書くことで除外できます」といわれて「何の略なんだ?」が気になったので調べた
noqaの元はno quality assuranceらしい
flake8,pep8などのツールもnoqa + コードで指定した気がするのでPython製のツールはこういう感じでやりますよっていう感じなのかな
What does '# noqa' mean in Python comments? - Stack Overflow
とりあえずコードで除外指定できるのはコメントがスッキリして個人的には好きです
※2022-02-28現在、ルール指定の方法にIDを使うのは非推奨になっていく模様(ansible-lintの特定ルール除外方法 | >> swfz[:memo])