变量有当前正在执行的可控剧本的路径?

有没有一个安赛布尔变量具有当前正在执行的剧本的绝对路径?

一些上下文: 我正在运行/创建一个针对 localhost的安塞尔脚本来配置一个 MySQL Docker 容器,并希望挂载相对于安塞尔剧本的数据量。

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

170690 次浏览

可惜没有。事实上,绝对路径在 Anble 运行的上下文中有点没有意义(并且可能会造成混淆)。简而言之,当您调用一个剧本时,对于每个任务,Anble 物理地将与该任务相关联的模块复制到目标机器上的一个临时目录,然后使用必要的参数调用该模块。因此,目标机器上的绝对路径只是一个临时目录,其中只包含几个临时文件,它甚至不包含完整的剧本。此外,在目标计算机上,除非您要在目标计算机上复制整个安塞尔目录树,否则了解安塞尔服务器上文件的完整路径几乎毫无用处。

要看到所有的变量都是由安塞尔定义的,你可以简单地运行 以下命令:

$ ansible -m setup hostname

你认为你需要知道进入剧本的绝对路径的原因是什么?

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

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

现在,变量 playbook _ path _ output. stdout 中提供了路径

似乎没有一个变量能够准确地保存你想要的东西。

然而,引用 那些文件的话:

同样可用的是,inventory_dir是目录保存的路径名 安赛尔的库存主机文件,inventory_file是路径名和 指向安塞尔库存主机文件的文件名。

Playbook _ dir 包含 playbook 基本目录。

最后,role_path将返回当前角色的路径名(因为 这只在角色内部起作用。

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

您可以使用 playbook_dir变量。

请参阅有关 神奇的变量的文档。

我用这样的剧本来测试我在当地的角色:

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

但是这个不能用于安赛布尔2.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}}'

根据上述解决方案。

我用在这样的剧本里,

---


- hosts: test-server
remote_user: root
tasks:
- name: Test output
shell: 'pwd'
register: command_output
args:
chdir: /root/new-folder/  # <<<<<<<<<< there
- debug:
var: command_output.stdout_lines