GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

willthames

ansible-lint – Ansibleのベストプラクティスチェッカー

投稿日:

Ansibleのベストプラクティスチェッカー

可能性のある糸くず

潜在的に改善される可能性のあるプラクティスと行動のプレイブックをチェックする

セットアップ

ピップを使用する:

pip2 install ansible-lint

ソースから:

git clone https://github.com/willthames/ansible-lint
export PYTHONPATH=$PYTHONPATH:`pwd`/ansible-lint/lib
export PATH=$PATH:`pwd`/ansible-lint/bin

使用法

Usage: ansible-lint playbook.yml|roledirectory ...

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -L                    list all the rules
  -q                    quieter, although not silent output
  -p                    parseable output in the format of pep8
  -r RULESDIR           specify one or more rules directories using one or
                        more -r arguments. Any -r flags override the default
                        rules in ['/path/to/ansible-
                        lint/lib/ansiblelint/rules'], unless -R is also used.
  -R                    Use default rules ['/path/to/ansible-
                        lint/lib/ansiblelint/rules'] in addition to any extra
                        rules directories specified with -r. There is no need
                        to specify this if no -r flags are used
  -t TAGS               only check rules whose id/tags match these values
  -T                    list all the tags
  -x SKIP_LIST          only check rules whose id/tags do not match these
                        values
  --exclude=EXCLUDE_PATHS
                        path to directories or files to skip. This option is
                        repeatable.
  --force-color         Try force colored output (relying on ansible's code)
  --nocolor             disable colored output
  -c /path/to/file      Specify configuration file to use.  Defaults to
                          ".ansible-lint"

偽陽性

いくつかの規則は少しの経験則です。 たとえば、高度なgit、yumまたはaptの使用は、通常、モジュールを使用して達成することは困難です。 この場合、警告が生成されないようにタスクにマークを付ける必要があります。

これには2つのメカニズムがあります.1つはすべてのタスクで動作し、もう1つはコマンドチェックモジュールで動作します。

コマンドまたはシェルモジュールでwarnパラメータを使用します。

スキップするタスクでskip_ansible_lintタグを使用します。

私は小切手をスキップしている理由をコメントすることをお勧めします。 残念ながら、現時点では、このようなコメントを確認することはできません。 (パッチ歓迎)

- name: this would typically fire CommandsInsteadOfArgumentRule
  command: warn=no chmod 644 X

- name: this would typically fire CommandsInsteadOfModuleRule
  command: git pull --rebase
  args:
    warn: False

- name: this would typically fire GitHasVersionRule
  git: src=/path/to/git/repo dest=checkout 
  tags:
  - skip_ansible_lint

ルール

ルールは、ルールごとにクラスファイルを使用して記述されます。 デフォルトルールの名前はDeprecatedVariableRule.pyなどです

各ルール定義には次のものが必要です。

  • ID:一意の識別子
  • 簡単な説明:ルールの簡単な説明
  • 説明:ルールが探している動作
  • タグ:ルールの組み込みまたは除外に使用される1つ以上のタグ
  • 以下の方法の少なくとも1つ:
    • 行がテストと一致しない場合はNoneまたはFalseを返し、 Trueまたはカスタムメッセージを返します(これにより、1つのルールで複数の動作をテストできます。たとえばCommandsInsteadOfModulesRule
    • ファイルとブロックに関する詳細をmatchblock 行がテストと一致しない場合はNoneまたはFalse返し、 Trueまたはカスタムメッセージを返します。
    • matchtaskは、単一のタスクまたはハンドラで動作します。 そのようなタスクは、常にmoduleキーとmodule_argumentsキーを含むように標準化されます。 whenwith_itemsなどの他の一般的なタスク修飾子は、タスクに存在する場合はキーとしても利用できます。

matchを使用するルールの例は次のとおりです。

from ansiblelint import AnsibleLintRule

class DeprecatedVariableRule(AnsibleLintRule):

    id = 'ANSIBLE0001'
    shortdesc = 'Deprecated variable declarations'
    description = 'Check for lines that have old style ${var} ' + \
                  'declarations'
    tags = { 'deprecated' }


    def match(self, file, line):
        return '${' in line

matchtaskを使用するルールの例は次のmatchtaskです。

import ansiblelint.utils
from ansiblelint import AnsibleLintRule

class TaskHasTag(AnsibleLintRule):
    id = 'ANSIBLE0008'
    shortdesc = 'Tasks must have tag'
    description = 'Tasks must have tag'
    tags = ['productivity']


    def matchtask(self, file, task):
        # If the task include another task or make the playbook fail
        # Don't force to have a tag
        if not set(task.keys()).isdisjoint(['include','fail']):
            return False

        # Task should have tags
        if not task.has_key('tags'):
              return True

        return False

matchtasktask引数にはいくつかのキーが含まれています。重要なactionactionです。 task['action']の値には使用されているモジュールが含まれ、引数はキーと値のペアと他の引数のリスト( shell使用されるコマンドなど)の両方として渡されます。

モジュールが実際にパラメータキーとしてargsをとるときの衝突を避けるために、 task['action']['args']task['action']['module_arguments']されました(例えばec2_tag

anonymous-lint 3.0.0 task['action']['module']は、モジュールが引数としてモジュールをtask['action']['__ansible_module__']ときの衝突を避けるために、 task['action']['__ansible_module__']に名前が変更されました。 予防措置として、 task['action']['module_arguments']task['action']['__ansible_arguments__']

望ましくない機能を備えたいくつかのプレイブックがあります。 彼らに頼むような糸を引くことは効果的です:

$ ansible-lint examples/example.yml
[ANSIBLE0004] Git checkouts must contain explicit version
examples/example.yml:15
Task/Handler: git check

[ANSIBLE0004] Git checkouts must contain explicit version
examples/example.yml:18
Task/Handler: git check 2

[ANSIBLE0004] Git checkouts must contain explicit version
examples/example.yml:30
Task/Handler: using git module

[ANSIBLE0002] Trailing whitespace
examples/example.yml:13
    action: do nothing   

[ANSIBLE0002] Trailing whitespace
examples/example.yml:35
    with_items: 

[ANSIBLE0006] git used in place of git module
examples/example.yml:24
Task/Handler: executing git through command

[ANSIBLE0006] git used in place of git module
examples/example.yml:27
Task/Handler: executing git through command

[ANSIBLE0006] git used in place of git module
examples/example.yml:30
Task/Handler: executing git through command

プレイブックに他のプレイブック、タスク、ハンドラまたはロールが含まれている場合は、これらも処理されます。

$ bin/ansible-lint examples/include.yml
[ANSIBLE0004] Checkouts must contain explicit version
/Users/will/src/ansible-lint/examples/roles/bobbins/tasks/main.yml:3
action: git a=b c=d

バージョン2.4.0以降、anonymous-lintはロールだけで動作するようになりました(これはロールのCIに役立ちます)

設定ファイル

.ansible-lint.ansible-lint設定ファイルを使用してローカル設定をサポートしています。 Anonymous-lintは、このファイルが存在するかどうかを作業ディレクトリで確認し、見つかった設定を適用します。 設定ファイルの場所は、 -c path/to/file CLIフラグで上書きすることも-c path/to/fileます。

次の値はCLI対応のものと同じようにサポートされ、機能します。

コマンドラインと設定ファイルの両方に値が指定されている場合、値はマージされます( exclude_pathsようなリストの場合)。あるいは、 quiet場合は “True”の値が優先されます。

exclude_paths:
  - ./my/excluded/directory/
  - ./my/other/excluded/directory/
  - ./last/excluded/directory/
parseable: true
quiet: true
rulesdir:
  - ./rule/directory/
skip_list:
  - skip_this_tag
  - and_this_one_too
tags:
  - run_this_tag
use_default_rules: true
verbosity: 1

事前コミット

事前コミットでlintを使用するには、ローカルリポジトリの.pre-commit-config.yamlファイルに以下を追加します。 sha:をgit commit shaまたはhooks.yamlを含むhooks.yamlなlintのタグに変更してhooks.yaml

- repo: https://github.com/willthames/ansible-lint.git
  sha: v3.3.1
  hooks:
    - id: ansible-lint
      files: \.(yaml|yml)$

貢献する

貢献したい場合はCONTRIBUTING.mdを読んでください。







-willthames

執筆者: