ansible-lint 도입

6128 단어 Ansible


배경



ansible/ansible-lint

Ansible-playbook이 많아져 관리가 번거롭게 되었기 때문에 메모 쓰기 정도에 기사를 썼다.

설치



pip로 쉽게 도입 가능
$ pip install ansible-lint

옵션에 대해서는 --help에서 볼 수 있습니다.
Usage: ansible-lint [options] [playbook.yml [playbook2 ...]]|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
  --parseable-severity  parseable output including severity of rule
  -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
  -v                    Increase verbosity level
  -x SKIP_LIST          only check rules whose id/tags do not match these
                        values
  --nocolor             disable colored output
  --force-color         Try force colored output (relying on ansible's code)
  --exclude=EXCLUDE_PATHS
                        path to directories or files to skip. This option is
                        repeatable.
  -c /path/to/file      Specify configuration file to use.  Defaults to
                          ".ansible-lint"

실행


$ ansible-lint 

세세한 설정 등은 실행 디렉토리에 「.ansible-lint」를 작성해 그곳에 기재해 갑니다.

.ansible-lint
exclude_paths:
  - ./common_script/
  - ./ansible/bin/
  - ./ansible/module/
  - ./ansible/apps/
parseable: true
quiet: true
skip_list:
  - skip_this_tag # skipするタグを指定
  - skip_this_id # skipするidを指定
use_default_rules: true
verbosity: 1

특정의 룰만을 실행하고 싶은 경우는 -t를 붙이는 것으로 실행이 가능.

규칙



ansible-lint에 대한 규칙을 직접 만들 수 있습니다.
README에도 작성하는 방법이 기재되어 있지만 그 중 시도해 보려고합니다.
다음은 기본 규칙의 거의 직역입니다. 별로 보지 않는 녀석은 생략하고 있습니다. (추기해 나갈 예정)

ANSIBLE0002: Trailing whitespace

줄 끝에 공백이 있음

ANSIBLE0004: Git checkouts must contain explicit version

git 모듈에서 version을 지정하지 않거나 HEAD로 지정하면 나옵니다.

ANSIBLE0005: Mercurial checkouts must contain explicit revision

ANSIBLE0004의 hg 버전. revision을 지정하지 않거나 default로 지정하면 경고가 발생합니다.

ANSIBLE000a6: Using command rather than module

git, curl, service 그 외, Ansible 모듈이 사용할 수 있는 곳에서 command, shell을 직접 두드리고 있으면 경고가 나온다.

ANSIBLE0007: Using command rather than an argument to e.g. file

chmod, mkdir, rm 그 외, file 모듈의 인수로 할 수 있는 것으로 command, shell을 직접 두드리고 있다고 경고가 나온다.

ANSIBLE0008: Deprecated sudo

become, become_user가 아닌 sudo, 사용하고 있으면 경고가 나온다.

ANSIBLE0009: Octal file permissions must contain leading zero

file 모듈 등에서 mode를 지정할 때 0666과 같은 표기가 아니라 666과 같은 표기를 하고 있다고 경고가 나온다.

ANSIBLE0011: All tasks should be named

작업에 이름을 지정하지 않으면 경고

ANSIBLE0012: Commands should not change things if nothing needs doing

command, shell 등이 when, creates 등에서 조건부로 실행되어 있지 않은 경우 경고.

ANSIBLE0013: Use shell only when shell functionality is required

쉘 모듈 흔들림 오류 대체 모듈이 있다면 그 곳을 사용할 수 있습니다.

ANSIBLE0014: Environment variables don't work as part of command

command, shell 명령 내에서 환경 변수를 사용하면 경고

ANSIBLE0015: Using bare variables is deprecated

{{ var}} 형식 이외의 변수를 사용했을 경우에 경고된다.

ANSIBLE0016: Tasks that run when changed should likely be handlers

when: result.changed 같은 일을 한다면 보통 handlers 사용하면 변경된 경우의 태스크 실행할 수 있기 때문에 그렇게 하자, 같은 규칙.

ANSIBLE0017: become_user requires become to work as expected

become없이 become_user하고 있다고 경고합니다.

ANSIBLE0018: Deprecated always_run

always_run을 사용하고 있다고 경고합니다. check_mode가 대체입니다.

GitHub Actions와의 협력



CI와의 연계도 간단하고 아래와 같이 정의해 두는 것으로 Ansible의 playbook 수정 때마다 linter가 달리는 구조가 된다.
# https://github.com/ansible/ansible-lint |
- name: Lint Ansible
  shell: bash
  run: |
    find . -maxdepth 1 -name '*.yml' | xargs ansible-lint -v linux_init.yml

좋은 웹페이지 즐겨찾기