Test¶
Jinja の Test は、テンプレート式を評価し、True または False を返す方法です。 Jinja には、これらの多くが同梱されています。公式の Jinja テンプレートドキュメントの「builtin tests」を参照してください。
テストとフィルターの主な相違点は、Jinja テストが比較に使用される点です。Jira ではフィルターはデータ操作に使用され、アプリケーションが異なります。テストは、map()
や select()
などのリスト処理フィルターで使用して、リスト内の項目を選択することもできます。
すべてのテンプレートと同様に、テストは常に、ローカルデータをテストする際にタスクのターゲットでは なく、Ansible コントローラーで実行されます。
このような Jinja2 テストに加えて、Ansible はより多くのものを提供しており、ユーザーは独自のテストを簡単に作成できます。
Test の構文¶
Test の構文 は、フィルター構文 (variable | filter
) とは異なります。従来の Ansible では、jinja のテストとフィルターの両方がテストとして登録されており、フィルター構文を使用してそれを参照できます。
Ansible 2.5 の時点では、jinja テストをフィルターとして使用すると警告が生成されます。
jinja テストを使用するための構文は、以下のとおりです。
variable is test_name
例:
result is failed
文字列のテスト¶
サブ文字列または正規表現に対して文字列と一致させるには、フィルターの「match」、「search」、または「regex」を使用します。
- vars:
- url: “http://example.com/users/foo/resources/bar”
- tasks:
- debug:
msg: “matched pattern 1”
when: url is match(“http://example.com/users/.*/resources/.*”)
- debug:
msg: “matched pattern 2”
when: url is search(“/users/.*/resources/.*”)
- debug:
msg: “matched pattern 3”
when: url is search(“/users/”)
- debug:
msg: “matched pattern 4”
when: url is regex(“example.com/w+/foo”)
「match」には文字列の先頭にゼロ以上の文字が必要です。「search」には文字列のサブセットの一致のみが必要になります。デフォルトでは、「regex」は search のように機能しますが、regex 表現は他のテストも実行するように設定できます。
バージョン比較¶
New in version 1.6.
Note
2.5 では、version_compare
の名前が version
に変更されました。
ansible_facts['distribution_version']
バージョンが「12.04」以降であることを確認するなど、
バージョン番号を比較するには、version
テストを使用できます。
version
テストを使用して ansible_facts['distribution_version']
を評価することもできます:
{{ ansible_facts['distribution_version'] is version('12.04', '>=') }}
ansible_facts['distribution_version']
が 12.04 以上の場合は、このテストで True が返り、それ以外の場合は False が返ります。
version
テストでは、以下の演算子を受け入れます。
<, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne
このテストは、3 番目のパラメーター (strict
) も受け入れます。これは、distutils.version.StrictVersion
で定義されている厳格なバージョン解析を使用すべきかどうかを定義します。 デフォルトは、False
(distutils.version.LooseVersion
を使用) で、True
は厳格なバージョン解析を有効にします:
{{ sample_version_var is version('1.0', operator='lt', strict=True) }}
セット理論テスト¶
New in version 2.1.
Note
2.5 では、issubset
と issuperset
の名前が、subset
および superset
にそれぞれ変更になりました。
リストに別のリストが含まれているか、またはリストが別のリストに含まれているかを確認するには、「subset」および「superset」を使用します:
vars:
a: [1,2,3,4,5]
b: [2,3]
tasks:
- debug:
msg:"A includes B"
when: a is superset(b)
- debug:
msg:"B is included in A"
when: b is subset(a)
リストに値が含まれるかどうかのテスト¶
New in version 2.8.
Ansible には、同様に動作する contains
テストが含まれますが、in
テストで提供される Jinja2 とは逆の動作が含まれています。
contains
テストは、select
フィルター、reject
フィルター、selectattr
、および rejectattr
フィルターと連携するように設計されています。
- vars:
- lacp_groups:
master: lacp0 network: 10.65.100.0/24 gateway: 10.65.100.1 dns4:
- 10.65.100.10
- 10.65.100.11
- interfaces:
- em1
- em2
master: lacp1 network: 10.65.120.0/24 gateway: 10.65.120.1 dns4:
- 10.65.100.10
- 10.65.100.11
- interfaces:
- em3
- em4
- tasks:
- debug:
- msg: “{{ (lacp_groups|selectattr(‘interfaces’, ‘contains’, ‘em1’)|first).master }}”
New in version 2.4.
any および all を使用して、リスト内のいずれかの要素が true かどうかを確認できます。
- vars:
- mylist:
- 1
- “{{ 3 == 3 }}”
- True
- myotherlist:
- False
- True
tasks:
- debug:
msg: “all are true!”
when: mylist is all
- debug:
msg: “at least one is true”
when: myotherlist is any
パスのテスト¶
Note
2.5 では、以下のテストの名前が変更になり、is_
接頭辞が削除されました。
以下のテストは、コントローラー上のパスに関する情報を提供します。
- debug:
msg: “path is a directory”
when: mypath is directory
- debug:
msg: “path is a file”
when: mypath is file
- debug:
msg: “path is a symlink”
when: mypath is link
- debug:
msg: “path already exists”
when: mypath is exists
- debug:
msg: “path is {{ (mypath is abs)|ternary(‘absolute’,’relative’)}}”
- debug:
msg: “path is the same file as path2”
when: mypath is same_file(path2)
- debug:
msg: “path is a mount”
when: mypath is mount
タスクの結果¶
以下のタスクは、タスクのステータスを確認するためのテストを示しています。
tasks:
shell: /usr/bin/foo register: result ignore_errors: True
- debug:
msg: “it failed”
when: result is failed
# in most cases you’ll want a handler, but if you want to do something right now, this is nice - debug:
msg: “it changed”when: result is changed
- debug:
msg: “it succeeded in Ansible >= 2.1”
when: result is succeeded
- debug:
msg: “it succeeded”
when: result is success
- debug:
msg: “it was skipped”
when: result is skipped
Note
2.1 以降、文法を厳密にする必要がある場合に、success、failure、change、および skip を使用して、文法が一致できるようにすることもできます。
See also
- Playbook について
- Playbook の概要
- 条件 (Conditional)
- Playbook の条件付きステートメント
- 変数の使用
- 変数の詳細
- ループ
- Playbook でのループ
- ロール
- ロール別の Playbook の組織
- ベストプラクティス
- Playbook のベストプラクティス
- ユーザーメーリングリスト
- ご質問はございますか。 Google Group をご覧ください。
- irc.freenode.net
- IRC チャットチャンネル #ansible