lookup プラグイン

lookup プラグインは、Jinja2 テンプレート言語への Ansible 固有の拡張です。lookup プラグインを使用して、Playbook 内の外部ソース (ファイル、データベース、キー/値のストア、API、その他のサービス) からデータにアクセスできます。templating はすべて、Ansible 制御マシンで lookup を実行し、評価されます。Ansible は、標準の一時システムで利用可能な lookup プラグインにより返されたデータを提供します。lookup プラグインを使用すると、変数やテンプレートに外部ソースからの情報を読み込むことができます。create custom lookup plugins できます。

注釈

  • ルックアップは、ロールやプレイに相対する作業ディレクトリーで実行されます。一方、ローカルタスクは、実行されたスクリプトに相対して実行されます。

  • wantlist=True を lookup に渡して、Jinja2 テンプレート「for」ループで使用できます。

  • デフォルトでは、ルックアップの戻り値はセキュリティー上の理由で安全でないと識別されます。ルックアップがアクセスする外部ソースを信頼する場合は、allow_unsafe=True を渡して Jinja2 テンプレートがルックアップ値を評価できるようにします。

警告

  • ルックアップの中には、シェルに引数を渡すものがあります。リモート/信頼されていないソースから変数を使用する場合には、|quote フィルターを使用して、安全に使用できるようにします。

lookup プラグインの有効化

Ansibleは、検出したすべての lookup プラグインを有効にします。カスタム lookup を有効にするには、プレイに隣接する lookup_plugins ディレクトリー、インストールしたコレクションの plugins/lookup/ ディレクトリー、スタンドアロンロール、または ansible.cfg で設定したルックアップディレクトリソースのいずれかに置きます。

lookup プラグインの使用

lookup プラグインは、Ansible でテンプレートを使用できる場所で使用できます。これはプレイ、変数ファイル、または template モジュールの Jinja2 テンプレートで使用できます。lookup プラグインの使用の詳細は、ルックアップ (lookup) を参照してください。

vars:
  file_contents: "{{ lookup('file', 'path/to/file.txt') }}"

lookup はループには欠かせない要素です。with_ と表示される場合は、アンダースコアの後の部分が lookup の名前になります。このような理由から、lookup はリストを出力することが想定されます。たとえば、with_itemsitems lookup を使用します。

tasks:
  - name: count to 3
    debug: msg={{ item }}
    with_items: [1, 2, 3]

lookup と filterstests、またはそれぞれを組み合わせて複雑なデータ生成やデータ操作が可能です。以下に例を示します。

tasks:
  - name: valid but useless and over complicated chained lookups and filters
    debug: msg="find the answer here:\n{{ lookup('url', 'https://google.com/search/?q=' + item|urlencode)|join(' ') }}"
    with_nested:
      - "{{ lookup('consul_kv', 'bcs/' + lookup('file', '/the/question') + ', host=localhost, port=2000')|shuffle }}"
      - "{{ lookup('sequence', 'end=42 start=2 step=2')|map('log', 4)|list) }}"
      - ['a', 'c', 'd', 'c']

バージョン 2.6 で追加.

errorsignorewarn、または strict に設定して、すべての lookup プラグインでエラーの動作を制御できます。デフォルト設定は strict で、lookup がエラーを返すとタスクは失敗します。以下に例を示します。

lookup エラーを無視するには、以下を行います。

- name: if this file does not exist, I do not care .. file plugin itself warns anyway ...
  debug: msg="{{ lookup('file', '/nosuchfile', errors='ignore') }}"
[WARNING]: Unable to find '/nosuchfile' in expected paths (use -vvvvv to see paths)

ok: [localhost] => {
    "msg": ""
}

失敗させるのではなく警告を出すには、以下を使用します。

- name: if this file does not exist, let me know, but continue
  debug: msg="{{ lookup('file', '/nosuchfile', errors='warn') }}"
[WARNING]: Unable to find '/nosuchfile' in expected paths (use -vvvvv to see paths)

[WARNING]: An unhandled exception occurred while running the lookup plugin 'file'. Error was a <class 'ansible.errors.AnsibleError'>, original message: could not locate file in lookup: /nosuchfile

ok: [localhost] => {
    "msg": ""
}

致命的なエラーを取得する (デフォルト) には、以下を行います:

- name: if this file does not exist, FAIL (this is the default)
  debug: msg="{{ lookup('file', '/nosuchfile', errors='strict') }}"
[WARNING]: Unable to find '/nosuchfile' in expected paths (use -vvvvv to see paths)

fatal: [localhost]: FAILED! => {"msg": "An unhandled exception occurred while running the lookup plugin 'file'. Error was a <class 'ansible.errors.AnsibleError'>, original message: could not locate file in lookup: /nosuchfile"}

ルックアップが強制的にリストを返すようにする: query および wantlist=True

バージョン 2.5 で追加.

Ansible 2.5 では、lookup プラグインを呼び出すために query と呼ばれる新しい Jinja2 関数が追加されました。lookupquery の相違点は、query が常にリストを返すことです。lookup のデフォルト動作は、コンマ区切りの値の文字列を返すことです。lookup は、wantlist=True を使用してリストを返すように明示的に設定できます。

この機能により、新しい loop キーワードを操作するための、より簡単で一貫性のあるインターフェースが提供され、同時に lookup の他の使い方との後方互換性も維持されます。

以下の例はどちらも同等の操作ができます。

lookup('dict', dict_variable, wantlist=True)

query('dict', dict_variable)

上記の例のように、query を使用する場合、wantlist=True の動作は暗黙的になります。

また、query の短縮形となる q が導入されました。

q('dict', dict_variable)

プラグイン一覧

ansible-doc -t lookup -l を使用して、利用可能なプラグインの一覧を表示します。ansible-doc -t lookup <plugin name> を使用して、特定のドキュメントと例を参照してください。

参考

Ansible Playbook

Playbook の概要

inventory プラグイン

Ansible inventory プラグインの使用

callback プラグイン

Ansible callback プラグイン

filter プラグイン

Jinja2 filter プラグイン

test プラグイン

Jinja2 test プラグイン

User Mailing List

ご質問はございますか。Google Group をご覧ください。

リアルタイムチャット

Ansible チャットチャンネルへの参加方法