2023年8月5日土曜日

Ansible Lintの「よくあるエラー」を解消する

先日、Ansibleを6.0.0から8.1.0にバージョンアップした。

その際にAnsible Lintもバージョンアップされ、今まではエラーとならなかったPlaybookにおいて新たにエラーが出力されるようになった。

本記事では、今回私が遭遇したAnsible Lintの「よくあるエラー」を解消するための方法を記載する。

環境

  • Ansible : 2.15.1
  • Ansible Lint : 6.17.2

Ansible Lintのよくあるエラー

yaml[octal-values]: Forbidden implicit octal value “0644”

https://ansible.readthedocs.io/projects/lint/rules/yaml/

modeのパーミッションをダブルクォートで囲む。

誤った記載

mode: 0644

正しい記載

mode: "0644"

no-changed-when: Commands should not change things if nothing needs doing.

https://ansible.readthedocs.io/projects/lint/rules/no-changed-when/

commandshellモジュールを使う際は、changed_whenにて変更有無の条件を定義する。例えば、以下の例ではコマンド実行結果が0の場合はchangedのステータスに設定する。

正しい記載

    - name: Install go command
      ansible.builtin.command:
        cmd: "{{ item }}"
        chdir: "{{ cri_dockerd.dir_git }}"
      become: true
      environment: "{{ proxy_env }}"
      register: result_cmd              # <- add
      changed_when: result_cmd.rc == 0  # <- add
      loop:
        - "wget https://storage.googleapis.com/golang/getgo/installer_linux"
        - "chmod +x ./installer_linux"
        - "./installer_linux"
      when: result.rc != 0

no-free-form: Avoid using free-form when calling module actions. (ansible.builtin.service)

https://ansible.readthedocs.io/projects/lint/rules/no-free-form/

1行で書くのではなく、きちんとYAMLで書く。

誤った記載

    - name: Enable service
      ansible.builtin.service: name={{ item }} enabled=yes state=started
      loop: "{{ service_enable_list }}"
      become: true

正しい記載

    - name: Enable service
      ansible.builtin.service:
        name: "{{ item }}"
        enabled: true
        state: started
      loop: "{{ service_enable_list }}"
      become: true

run-once[task]: Using run_once may behave differently if strategy is set to free.

https://ansible.readthedocs.io/projects/lint/rules/run-once/

Ansibleの実行戦略(strategy)がfreeの場合、run_onceの指定はお勧めできない(想定通りに動作しない可能性がある)、というもの。freeの場合は、各タスクにおいてすべてのホストの実行の終了を待たずに、次のタスクが実行されるため。

なお、デフォルトはlinearとなり、各タスクのすべてのホストの実行が終了してから、次のタスクに遷移する。

解決策はrun_onceを使わなければよいが、使いたい場合もあるので、その場合は以下の通りタスクのname# noqa: run-once[task]のコメントを付与すると、Ansible Lintがエラーを表示しなくなる。

    - name: Remove local repository # noqa: run-once[task]
      ansible.builtin.file:
        path: "{{ dir_output_config_dest }}"
        state: absent
      delegate_to: localhost
      run_once: true

jinja[invalid]: You need to install “jmespath” prior to running json_query filter

https://ansible.readthedocs.io/projects/lint/rules/jinja/

jmespathがインストールされていないと出力されるエラー。pipにてjmespathをインストールする。

# python3 -m pip install jmespath
WARNING: Running pip install with root privileges is generally not a good idea. Try `python3 -m pip install --user` instead.
Collecting jmespath
  Using cached jmespath-1.0.1-py3-none-any.whl (20 kB)
Installing collected packages: jmespath
Successfully installed jmespath-1.0.1

fqcn[canonical]: You should use canonical module name ansible.windows.win_file instead of ansible.builtin.win_file.

モジュール名が誤っている。ansible.builtin.win_fileではなくansible.windows.win_fileのように正しいモジュール名を記載する。

誤った記載

    - name: Remove windows sciprt & config file
      ansible.builtin.win_file:
        path: "{{ dir_output_config_src }}"
        state: absent

正しい記載

    - name: Remove windows sciprt & config file
      ansible.windows.win_file:
        path: "{{ dir_output_config_src }}"
        state: absent

name[casing]: All names should start with an uppercase letter.

nameの最初の文字は大文字にする。

誤った記載

- name: create test vm from snapshot
  gather_facts: true
  hosts: vmware_servers

正しい記載

- name: Create test vm from snapshot
  gather_facts: true
  hosts: vmware_servers

args[module]: Unsupported parameters for (basic.py) module: login_password, login_user, server_url. Supported parameters include: exact_match, host_inventory, host_ip, host_name, http_login_password, http_login_user, remove_duplicate. (warning)

サポートされてないモジュールのパラメータ指定を行った際にエラーとなる。今回であれば、Zabbixモジュールの記載方法誤り(バージョンアップによって記載方法が変わったため)。Zabbixモジュールの記載については、以下別記事を参照。

yaml[truthy]: Truthy value should be one of [false, true]

yes/noではなくtrue/falseで記載を統一する。

誤った記載

- name: Reboot
ansible.builtin.reboot:
async: 1
poll: 0
changed_when: no
become: yes

正しい記載

- name: Reboot
ansible.builtin.reboot:
async: 1
poll: 0
changed_when: false
become: true

以上。

0 件のコメント:

コメントを投稿

人気の投稿