查找插件

查找插件是 Jinja2 模板语言的 Ansible 特定扩展。您可以使用查找插件来访问来自外部源(文件、数据库、键/值存储、API 和其他服务)的数据,在您的 Playbook 中。与所有模板一样,查找在 Ansible 控制机器上执行和评估。Ansible 使用标准模板系统使查找插件返回的数据可用。您可以使用查找插件从外部源加载变量或模板信息。您可以创建自定义查找插件

注意

  • 查找的执行工作目录相对于角色或 Play,而不是相对于执行脚本的本地任务。

  • wantlist=True 传递给查找,以便在 Jinja2 模板“for”循环中使用。

  • 默认情况下,出于安全原因,查找返回值被标记为不安全。如果您信任查找访问的外部源,请传递 allow_unsafe=True 以允许 Jinja2 模板评估查找值。

警告

  • 某些查找会将参数传递给 shell。当使用来自远程/不受信任来源的变量时,请使用 |quote 过滤器以确保安全使用。

启用查找插件

Ansible 会启用它可以找到的所有查找插件。您可以通过将自定义查找插件放到与您的 Play 相邻的 lookup_plugins 目录中,或者放在您已安装的集合的 plugins/lookup/ 目录中,或者放在一个独立的 Role 中,或者在 ansible.cfg 中配置的查找目录源之一中来激活它。

使用查找插件

您可以在 Ansible 中可以使用模板的任何地方使用查找插件:在 Play 中,在变量文件中,或者用于 模板 模块的 Jinja2 模板中。有关使用查找插件的更多信息,请参阅查找

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

查找是循环的组成部分。无论您在哪里看到 with_,下划线后面的部分都是查找的名称。因此,查找预计会输出列表;例如,with_items 使用 items 查找

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

您可以将查找与过滤器测试 甚至彼此结合使用,以进行一些复杂的数据生成和操作。例如

tasks:
  - name: 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 版本新增功能。

您可以通过将 errors 设置为 ignorewarnstrict 来控制所有查找插件中错误的行为方式。默认设置为 strict,如果查找返回错误,则会导致任务失败。例如

忽略查找错误

- 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"}

强制查找返回列表:querywantlist=True

2.5 版本新增功能。

在 Ansible 2.5 中,添加了一个名为 query 的新 Jinja2 函数,用于调用查找插件。lookupquery 之间的主要区别在于 query 始终返回一个列表。 lookup 的默认行为是返回一个逗号分隔的值的字符串。lookup 可以使用 wantlist=True 显式配置为返回列表。

此功能为与新的 loop 关键字交互提供了一个更简单、更一致的接口,同时保持与其他 lookup 用法的向后兼容性。

以下示例等效

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

query('dict', dict_variable)

如上所示,当使用 query 时,wantlist=True 的行为是隐式的。

此外,引入了 q 作为 query 的简写形式

q('dict', dict_variable)

插件列表

您可以使用 ansible-doc -t lookup -l 查看可用插件的列表。 使用 ansible-doc -t lookup <插件 名称> 查看插件特定的文档和示例。

另请参阅

Ansible Playbook

Playbook 简介

清单插件

Ansible 清单插件

回调插件

Ansible 回调插件

过滤器插件

Jinja2 过滤器插件

测试插件

Jinja2 测试插件

沟通

有问题?需要帮助?想要分享您的想法?请访问 Ansible 通信指南