Ansible 中的搜索路径

您可以控制 Ansible 在您的控制节点上搜索资源的路径(包括配置、模块、角色、ssh 密钥等),以及您正在管理的远程节点上的资源。尽可能使用绝对路径告诉 Ansible 在哪里查找资源。但是,绝对路径并不总是切实可行的。此页面介绍了 Ansible 如何解释相对搜索路径,以及当 Ansible 无法找到您需要的资源时如何进行故障排除。

配置路径

默认情况下,这些路径应该相对于配置文件。有些路径专门相对于当前工作目录或 playbook,并且应该在其描述中进行说明。诸如 SSH 密钥之类的路径使用当前工作目录,因为这反映了底层工具的使用方式。

任务路径

任务中使用的相对路径通常指的是受管理节点上的远程文件和目录。但是,传递给查找插件的路径以及某些操作插件中使用的路径(例如 templatecopy 模块的“src”路径)指的是控制节点上的本地文件和目录。

解析本地相对路径

当您为本地文件指定相对路径时,Ansible 将首先尝试在当前任务的角色中查找该文件,然后在包含或依赖于当前角色的其他角色中查找,然后相对于定义任务的文件查找,最后相对于当前 playbook 查找。它将找到第一个匹配的文件。这样,如果存在多个具有相同文件名的文件,Ansible 将找到最接近当前任务的文件,并且该文件很可能是您想要的文件。

具体来说,Ansible 按以下顺序尝试查找文件

  1. 在当前角色中。

    1. 在其相应的子目录中:“files”、“vars”、“templates”或“tasks”;具体取决于 Ansible 正在搜索的文件类型。

    2. 直接在其目录中。

  2. 类似 1,在使用 include_roleimport_role 或角色依赖关系调用此当前角色的父角色中。如果父角色有自己的父角色,Ansible 将对该角色重复此步骤。

  3. 类似 1,在当前任务文件的目录中。

  4. 类似 1,在当前 playbook 文件的目录中。

Ansible 不会在当前工作目录中搜索本地文件;换句话说,就是您执行 Ansible 的目录。

注意

  • 当前工作目录可能因连接插件以及操作是本地还是远程而异。对于远程操作,它通常是登录 shell 将用户放置到的目录。对于本地操作,它要么是您从中执行 Ansible 的目录,要么在某些情况下是 playbook 目录。

  • 搜索路径上下文是累加的,这意味着 Ansible 在解析文件路径时使用“栈”上下文。在解析任务中文件的本地相对路径时,使用 include_roleimport_role 语句包含任务的角色的上下文在栈中具有最高优先级。如果您使用 include_taskimport_task 语句导入任务,则 Ansible 将使用导入文件的上下文。

搜索路径故障排除

当您执行 Ansible 时,变量 ansible_search_path 将包含已搜索的路径,以及其搜索顺序,但不列出其子目录。如果您通过传递 -vvvvv 参数以详细级别 5 运行 Ansible,则 Ansible 将报告其搜索的每个目录,但搜索任务文件时除外。