はじめに
hosts: "{{ targets }}"
のように、hosts
に変数を利用していると、ansible-lint のチェックで変数未定義のエラーになってしまいます。
$ ansible-lint debug.yml WARNING Listing 1 violation(s) that are fatal syntax-check[specific]: The field 'hosts' has an invalid value, which includes an undefined variable. The error was: 'targets' is undefined. 'targets' is undefined assert.yml:2:3 Rule Violation Summary count tag profile rule associated tags 1 syntax-check[specific] min core, unskippable Failed: 1 failure(s), 0 warning(s) on 1 files.
これにひっかかると、他のチェックがされなくなるのでどうにかしたいところです。
かといって、このチェックは .config/ansible-lint.yml
の設定の skip_list
に指定してスキップすることはできません。
私が分かっている範囲では、これを回避するには2つの方法があります。
- 検証環境
- ansible-lint 6.22.2
対処案1: default
フィルターを利用
ルール syntax-check
の説明ページにもありますが、変数未定義時の代わりの値を指定する default
フィルターを利用する方法です。これ自体はもともと Ansible でも利用できる機能です。
--- - name: Test play hosts: "{{ targets | default([]) }}" gather_facts: false connection: local tasks: - name: Debug ansible.builtin.debug: msg: Hello
こんな風にしておけば、変数未定義のエラーは起こらなくなります。
対処案2: ansible-lint としての extra_vars で定義しておく
対処案1では Playbook を修正する必要がありますが、修正したくない場合こちらの案が候補になります。
ansible-lint の設定ファイル内の extra_vars
で変数を定義しておけばエラーは起こらなくなります。
.config/ansible.yml
:
--- extra_vars: targets: []
Playbook は以下の通り。default
フィルターは利用しません。
--- - name: Test play hosts: "{{ targets }}" gather_facts: false connection: local tasks: - name: Debug ansible.builtin.debug: msg: Hello
おわりに
設定ファイルが思いのほか気が利いてるので、一度目を通すと新しい発見があるかもしれません。
参考
関連 issue