Ansible自动化(十八) 玩转 Ansible Lookup 插件
1 | 作者:李晓辉 |
Jinja2 模板里有两个查找插件,一个是 lookup
,一个是 query
。其实它们的用法特别简单,就像喊一声“嘿,工具来一下!”——你只要先说出哪个工具(比如 lookup
或 query
),然后在括号里告诉它查找插件的名字和需要的东西就行了。
这就像是你让朋友帮忙,比如“帮我拿锤子”(工具名字),然后补一句“记得带几颗钉子”(插件需要的参数)
我们的课程中,主要是讲lookup查找插件
Lookup插件概述
Ansible 的 lookup 插件就像是在剧本(playbook)运行过程中“拿来主义”的小帮手。它的作用是从外部获取一些数据,让你的任务更加灵活。比如,你可以用它从文件里读取内容、获取环境变量的值、生成随机数,甚至调用一些外部服务获取信息。这样一来,你的任务就不再局限于静态的配置,而是可以根据不同的场景动态调整。
想象一下,你在做饭的时候发现配料表上少了几样东西,而 lookup 插件就是那个帮你跑到厨房橱柜或超市去拿东西的助手。它非常适合需要灵活处理外部数据的场景。
调⽤lookup插件样例
下列变量定义使⽤ file 查找插件将⽂件 /etc/hosts 的内容放⼊ Ansible 变量 hosts 中
1 |
|
上面的表达式将⽣成以下结构
1 | hosts: "127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4\n::1 localhost localhost.localdomain localhost6 localhost6.localdomain6\n\n,\\S\nKernel \\r on an \\m (\\l)" |
从 Ansible 2.5 开始,你可以用 query
函数或者它的短名字 q
来调用查找插件,而不一定非得用 lookup
。两者之间的主要区别是:query
总是返回一个易于操作的列表,而 lookup
返回的是逗号分隔的值,这有时候会让人头疼。
query
返回的是一个列表,每一行是一个独立的元素,适合后续需要逐行处理的情况。lookup
返回的是一个逗号分隔的字符串,可能需要你手动拆分才能使用。
1 |
|
1 | hosts: |
选择查找插件
默认情况下,Ansible 自带了很多查找插件,要查看所有可用的查找插件,可以运行以下命令:
1 | ansible-navigator doc --mode stdout -t lookup -l |
如果你想了解某个具体插件的用途和使用方法,比如想知道 file 插件怎么用,可以运行:
1 | ansible-navigator doc --mode stdout -t lookup file |
file 插件
如果你用 Ansible 的 file
插件加载本地文件的内容到变量里,它会按照你给的路径来找文件。如果你给的是相对路径,它就会去你的 playbook 里的 files
文件夹找那个文件。
1 |
|
file
插件是专门用来读取“执行环境”里的文件的,而不是控制节点(运行命令的机器)或受管主机(目标机器)上的文件。- 但如果你使用
ansible-playbook
命令,或者在运行ansible-navigator
时加了--ee false
参数(表示关闭执行环境),那么“执行环境”就等于你的控制节点,也就是说,这种情况下它会直接读取控制节点上的文件。- 如果你需要读取的文件内容既不在执行环境里也不在项目目录中,那么 ansible.builtin.slurp 模块就能派上用场。它的作用是从受管主机上“抓取”(slurp)文件内容,然后以 Base64 编码的形式加载到变量里。你可以解码后使用它的内容。
1 |
|
template 插件
template
插件和 file
插件的确很像,都会返回文件的内容。但是 template
插件更智能一些,因为它会把文件当作 Jinja2 模板来处理,会在实际应用之前先评估和渲染模板中的逻辑。
如果你传递了一个相对路径的模板文件,template
插件会到 playbook 的 templates
目录里去找这个文件。这就像你在厨房里找调味料,所有的模板文件都乖乖待在 templates
目录里等你用。
假设你的模板文件包含以下内容,并位于 playbook 的 templates 目录中:
1 | Hello, {{ ansible_user }}! |
当你运行这个 playbook 时,模板文件中的变量(如 {{ ansible_user }}
和 {{ ansible_date_time.date }}
)会被自动渲染为实际的值,比如:
1 |
|
pipe 插件
pipe
插件可以运行本地的 shell 命令,并将命令的输出作为结果返回。它非常适合从命令行获取动态数据并用在 playbook 中。
以下 playbook 使用 pipe 插件来运行 date 命令并将结果存储到变量中:
1 |
|
lines 插件
lines 插件用于逐行读取本地文件的内容,并将每一行作为列表中的一个元素返回。它适合处理多行文本的文件。
以下 playbook 使用 lines 插件读取 /etc/hosts 文件的内容,并将每一行存储到变量中:
1 |
|
url 插件
url
插件允许你从指定的 URL 获取数据,并将返回内容用作 Ansible 变量。这非常适合需要从在线资源中动态加载内容的场景,比如配置文件、API 数据等。
1 |
|
处理lookup错误
Ansible 中的大多数插件如果遇到失败情况,会直接中止 Playbook 的执行。但 lookup
插件有点特别,它把执行任务委派给其他插件,这些插件可能不会因为类似的错误(比如找不到文件)就停下来。举例来说,如果 file
插件找不到文件,Playbook 并不会马上中止,而是需要等到你恢复了环境后再继续。
为了应对这些不同的场景,lookup
插件提供了一个 errors
参数,可以用来控制它在发生错误时的行为。
errors
参数在 lookup
插件中主要接受以下值:
ignore
- 如果发生错误(例如,文件找不到),它会忽略错误并返回一个空值,而不会中止 playbook 的执行。
warn
- 如果发生错误,插件会在日志中显示警告,但不会中止 playbook 的执行。警告信息可以帮助你诊断问题。
strict
- 如果发生错误,插件会中止 playbook 的执行。这是一种更严格的模式,确保出现问题时停止继续执行,以便及时修复。
1 |
|
说明:
errors='ignore'
:即使文件缺失,也不会中止 playbook,而是返回空值。default
过滤器:如果file_content
为空或未定义,则输出默认信息“文件不存在”。