$30 off During Our Annual Pro Sale. View Details »

【虎の穴ラボ Tech Talk #1】Ansible Lintの警告への対処

【虎の穴ラボ Tech Talk #1】Ansible Lintの警告への対処

2024年 9月12日に開催された「虎の穴ラボ Tech Talk #1 〜社内技術LT〜」の発表資料になります。

https://yumenosora.connpass.com/event/328090/

虎の穴ラボ株式会社

September 19, 2024
Tweet

More Decks by 虎の穴ラボ株式会社

Other Decks in Technology

Transcript

  1. Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. Ansible

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

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

    1. true/falseの指定 2. コマンドやシェルの実行 3. booleanの判定 4. コレクションの利用 3
  4. 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
  5. Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 1.

    true/falseの指定 この場合はbooleanの値を指定するところに、trueまたはfalseを指定することで対処できま す。 定義例 6 - name: Setup Server gather_facts: true
  6. 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
  7. 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 の使用を推奨します。 これはかなり一貫性がなく、(少なくとも私の側では) 混乱を招きます。
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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 # ディレクトリが無ければ作成
  14. 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 # ディレクトリが無ければ作成
  15. 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
  16. Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 4.

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

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

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

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

    対処策 YAML 1.1でBooleanとして定義された文字列は、ダブルクォーテーションで括るなどして、 Booleanではなく文字列として認識するように記述します。 定義例 設定ファイルの出力例 26 apache_server_signature: "Off" ServerSignature: Off
  22. 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