变量是否具有正在执行的当前ansible-playbook的路径?


108

是否有ansible变量具有正在执行的当前ansible-playbook的绝对路径?

一些上下文: 我正在运行/创建一个针对Ansible脚本localhost以配置mysql docker,并希望相对于Ansible脚本安装数据量。

例如,假设我已将存储库签出到~/branch1/,然后运行,ansible-playbook dev.yml我认为它应该将卷保存到~/branch1/.docker_volume/。如果我从那~/branch2开始运行它,则应将其配置为~/branch2/.docker_volume/


2
一个有趣的问题,我从未想过。但是,您所要求的事实表明您可能以非常错误的方式进行了操作。
Antonis Christofides 2015年

我同意,我将详细说明@AntonisChristofides
Josh Unger

Answers:


192

您可以使用playbook_dir变量。


2
我遇到了类似的问题,您的回答解决了它。谢谢。但是,我找不到playbook_dir记录变量的任何地方。您能否指出我的文档。或者,您能否解释一下您是如何知道此变量的?
slayedbylucifer

3
我发现它在ansible代码:github.com/ansible/ansible/blob/...
舍瓦Poliakov

2
另外,还有一个有趣的仓库github.com/lorin/ansible-quickref,包含所有变量。
Seva Poliakov

46

似乎没有一个变量可以完全满足您的需求。

但是,引用docs

inventory_dir包含Ansible的清单主机文件的目录的路径名也可以使用,它是指向Ansible的清单主机文件inventory_file的路径名和文件名。

playbook_dir包含剧本的基本目录。

最后,role_path将返回当前角色的路径名(从1.8开始)。这仅在角色内部起作用。

根据您的设置,这些或$ pwd基于-的解决方案可能就足够了。


2

不幸的是没有。实际上,在Ansible的运行方式中,绝对路径是毫无意义的(并可能造成混淆)。简而言之,当您调用剧本时,对于每个任务,Ansible会将与任务关联的模块物理复制到目标计算机上的临时目录,然后使用必要的参数调用该模块。因此,目标计算机上的绝对路径只是一个临时目录,其中仅包含一些临时文件,甚至不包含完整的剧本。另外,除非在目标计算机上复制整个Ansible目录树,否则在目标计算机上知道Ansible服务器上文件的完整路径几乎没有用。

要查看Ansible定义的所有变量,您只需运行以下命令

$ ansible -m setup hostname

您认为需要知道该剧本的绝对路径的原因是什么?


谢谢布鲁斯,我修改了问题以详细说明我想做的事情。
Josh Unger 2015年

6
绝对局部路径并非毫无意义。例如,它可以用于运行任何本地命令和/或查询不能直接包含在ansible配置中的其他本地文件或服务。Ansible具有local_action模块的事实这一事实意味着存在合理的用例。
Cray 2015年

1

我正在使用像这样的剧本在本地测试我的角色:

---
- hosts: localhost
  roles:
     - role: .

但这已停止与Ansible v2.2一起使用。

我调试了上述解决方案

---
- hosts: all
  tasks:
    - name: Find out playbooks path
      shell: pwd
      register: playbook_path_output
    - debug: var=playbook_path_output.stdout

它产生了我的主目录,而不是“当前工作目录”

我定居了

---
- hosts: all
  roles:
    - role: '{{playbook_dir}}'

按照上面的解决方案。


1

没有内置变量可用于此目的,但是您始终可以使用“ pwd”命令找出剧本的绝对路径,并将其输出注册到变量中。

- name: Find out playbook's path
  shell: pwd
  register: playbook_path_output
- debug: var=playbook_path_output.stdout

现在该路径在变量playbook_path_output.stdout中可用


7
在这种情况下pwd,不返回剧本脚本的路径。它返回进程的当前目录(通常为ansible-playbook)。两者不必相同,并且取决于ansible调用的确切方式。
Cray 2015年

5
@Cray是正确的。无论如何,我只想提及Ansible已经为您准备了此变量:(debug: var=ansible_env.PWD这给了我在ansible-playbook本地计算机上执行的目录以及远程服务器上的主目录)
NS du Toit

4
另外,也可以通过以下方式找到当前目录:{{ lookup('env','PWD') }}
isedwards '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.