Slide 1

Slide 1 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. Ansible Lintの警告への対処 虎の穴ラボ株式会社 山田 T O R A N O A N A L a b 1

Slide 2

Slide 2 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 概要 虎の穴ラボの通販チームでは、一部で Ansibleを使い環境構築を行っています。 今回は「Ansible Lintの警告への対処」と題して、AnsibleのリンターであるAnsible Lint を実行して出力された警告への対処策をいくつかまとめてみました。 前提 ● 基本的にAnsibleの定義ファイルはYAML形式で記述しています。 2

Slide 3

Slide 3 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 目次 1. true/falseの指定 2. コマンドやシェルの実行 3. booleanの判定 4. コレクションの利用 3

Slide 4

Slide 4 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 1. true/falseの指定 4

Slide 5

Slide 5 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 1. true/falseの指定 パラメータでbooleanの値を指定するところにtrue/false以外の文字列で指定した場合、以下 のような警告を受けます。 定義例 警告例 5 yaml[truthy]: Truthy value should be one of [false, true] (真偽値は[false, true]のいずれかになります。) - name: Setup Server gather_facts: yes

Slide 6

Slide 6 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 1. true/falseの指定 この場合はbooleanの値を指定するところに、trueまたはfalseを指定することで対処できま す。 定義例 6 - name: Setup Server gather_facts: true

Slide 7

Slide 7 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 1. true/falseの指定 これはYAMLの使用が関連しているようです。 YAML 1.1までの仕様では、以下のような文字列は Booleanとして認識されます。 y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off| OFF そのため、ネット上にはon、off、yes、noで定義している例も多く見られます。 7

Slide 8

Slide 8 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 1. true/falseの指定 公式ドキュメントでもyes/noを使用している箇所が多かったらしく、 2022年6月、Ansibleコミュ ニティに以下のようなIssueがあげられました。 Disconnect between Docs and Ansible-lint in regards to truthy statements (booleans) https://github.com/ansible-community/community-topics/issues/116 8 現在、Ansible Docs は真偽値のステートメントに対して常に yes/no を使用しています。 しかしながら yes/no が使用されている場合、Ansible-Lint はエラーをスローし、 true/false の使用を推奨します。 これはかなり一貫性がなく、(少なくとも私の側では) 混乱を招きます。

Slide 9

Slide 9 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 1. true/falseの指定 これを受け、公式ドキュメントのbooleanをtrue/falseに変更するプルリクが作成されていま す。 Convert 'default', 'choices', 'sample' to type; change booleans to 'true' and 'false' https://github.com/ansible-community/antsibull-docs/pull/19/ booleanに指定する値は、Ansible Lintに従いtrue/false形式で問題なさそうです。 9

Slide 10

Slide 10 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 2. コマンドやシェルの実行 10

Slide 11

Slide 11 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 2. コマンドやシェルの実行 ansible.builtin.shellモジュールやansible.builtin.commandモジュールを使用するとき、 以下のような警告を受けることがあります。 定義例 警告例 11 no-changed-when: Commands should not change things if nothing needs doing. (何もする必要がなければ、コマンドで変更しないでください。) - name: Get nginx version ansible.builtin.shell: | nginx -version 2>&1 | sed -r "s/^nginx version: nginx\///g" register: nginx_version

Slide 12

Slide 12 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 2. コマンドやシェルの実行 この場合は、タスクの設定にchanged_whenパラメータを追加することで対処できます。 定義例 12 - name: Get nginx version ansible.builtin.shell: | nginx -version 2>&1 | sed -r "s/^nginx version: nginx\///g" register: nginx_version changed_when: false

Slide 13

Slide 13 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 2. コマンドやシェルの実行 また、以下のタスクのようにansible.builtin.shellモジュールのスクリプトでパイプを使用する と、以下のような警告が出ることがあります。 定義例 警告例 13 risky-shell-pipe: Shells that use pipes should set the pipefail option. (パイプを使用するシェルでは、 pipefail オプションを設定する必要があります。) - name: Get nginx version ansible.builtin.shell: | nginx -version 2>&1 | sed -r "s/^nginx version: nginx\///g" register: nginx_version changed_when: false

Slide 14

Slide 14 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 2. コマンドやシェルの実行 この場合は、以下のように実行前に set -o pipefailを実行しておくことで対処できます。 定義例 14 - name: Get nginx version ansible.builtin.shell: | set -o pipefail nginx -version 2>&1 | sed -r "s/^nginx version: nginx\///g" register: nginx_version changed_when: false

Slide 15

Slide 15 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 3. booleanの判定 15

Slide 16

Slide 16 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 3. booleanの判定 タスクの実行可否をwhenで変数の値を判定して行う場合があります。その際、変数が booleanの場合、判定方法によっては以下のような警告を受けます。 定義例 警告例 16 literal-compare: Don't compare to literal True/False. (リテラル値のTrue/Falseと比較しないでください) - name: Creation of directory ansible.builtin.file: path: "{{ dir_path }}" state: directory mode: "0755" when: - dir_check.stat.exists == False # ディレクトリが無ければ作成

Slide 17

Slide 17 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 3. booleanの判定 booleanの値を判定する場合は、比較演算子を使わず、論理演算子を使うなどすることで対処 できます。 定義例 17 - name: Creation of directory ansible.builtin.file: path: "{{ dir_path }}" state: directory mode: "0755" when: - not dir_check.stat.exists # ディレクトリが無ければ作成

Slide 18

Slide 18 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 4. コレクションの利用 18

Slide 19

Slide 19 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 4. ロールの利用 ansible-coreには含まれないコレクションを利用する際、既にインストール済みでありながら、 以下のようなエラーが発生する場合があります。 定義例 警告例 19 Error: couldn't resolve module/action 'ansible.posix.selinux'. This often indicates a misspelling, missing collection, or incorrect module path. (モジュール/アクション 'ansible.posix.selinux' を解決できませんでした。これは多くの場合、スペルミ ス、コレクションの欠落、またはモジュールパスの誤りを示します。) - name: Set SELinux to permissive ansible.posix.selinux: policy: targeted state: permissive

Slide 20

Slide 20 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 4. ロールの利用 この場合は、requirements.ymlというファイルを以下のような内容で作成することで対処でき ます。 定義例 20 --- # A valid collection name must be in the format .. # (有効なコレクション名は、 . の形式である必要があります。) collections: - name: ansible.posix

Slide 21

Slide 21 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 4. ロールの利用 これについてはAnsible Lintのメンテナー側でも認識されており、原因はリンター側が依存関 係を見つけられないために発生するエラーのようです。 以下のIssueでは、ユーザーに対処方法を知らせるメッセージについて改善することを検討す る旨、書かれています。 https://github.com/ansible/ansible-lint/issues/4027 21 基本的にこれはバグというよりは機能ですが、ユーザーに対処方法を知らせるメッセージング を改善できるという点には同意します。そのため、この問題は未解決のままです。

Slide 22

Slide 22 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. おまけ On/Offの定義 22

Slide 23

Slide 23 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. おまけ On/Offの定義 設定ファイルの配置時、値を変数で定義する箇所があります。 その定義する値がOn/Offといった文字列の場合 変数の定義例 設定ファイルの定義例 23 apache_server_signature: Off ServerSignature {{ apache_server_signature }}

Slide 24

Slide 24 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. おまけ On/Offの定義 これは、以下のように定義がされた設定ファイルが出力されることを想定していますが 実際には以下のように定義がされた設定ファイルが出力されます。 24 ServerSignature: Off ServerSignature: False

Slide 25

Slide 25 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. おまけ On/Offの定義 原因はYAMLの仕様によるもののようです。 YAML 1.1までの仕様では、以下のような文字列は Booleanとして認識されます。 y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off| OFF そのためAnsibleはBooleanとして解析し、Offという文字列をTrueに置き換えて出力している と思われます。 25

Slide 26

Slide 26 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. おまけ On/Offの定義 対処策 YAML 1.1でBooleanとして定義された文字列は、ダブルクォーテーションで括るなどして、 Booleanではなく文字列として認識するように記述します。 定義例 設定ファイルの出力例 26 apache_server_signature: "Off" ServerSignature: Off

Slide 27

Slide 27 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. おまけ On/Offの定義 YAML 1.2ではtrue/falseのみをBooleanとして認識するように仕様が変更された模様です。 (参考: https://yaml.org/spec/1.2.0/#id2602744 ) しかしながら、比較的最近のansible core 2.17.3でも同様の動作が確認でき、まだ Ansibleで はYAML 1.2のこの仕様には対応していない模様です。 (実行環境のPythonのバージョンによるものかもしれません) 既存の定義ファイルにも影響する仕様変更のため、対応しない可能性もあります。 27

Slide 28

Slide 28 text

Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. ご清聴ありがとうございました。 28