先日、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/
command
やshell
モジュールを使う際は、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 件のコメント:
コメントを投稿