Ansible 中的搜索路径

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

配置路径

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

任务路径

在任务中使用的相对路径通常指向被管理节点上的远程文件和目录。但是,传递给 lookup 插件的路径以及在 action 插件中使用的一些路径,例如 templatecopy 模块的“src”路径,则指向控制节点上的本地文件和目录。

解析本地相对路径

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

具体来说,Ansible 会按照以下顺序查找文件:

  1. 在当前角色中。

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

    2. 直接在其目录中。

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

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

  4. 与第 1 条类似,在当前 play 文件的目录中。

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

注意

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

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

搜索路径故障排除

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