获取相对路径的任务文件的目录

时间:2013-10-15 19:54:13

标签: ansible

在我的剧本中,我运行一个执行脚本的local_action并存储该值以供将来使用:

- local_action: command python release.py
  register: release_url

这很好用,直到我将我的剧本移到子目录中。事实证明,该命令从您当前的工作目录(您运行ansible)运行,因此路径需要如下所示:

- local_action: command python roles/ghost/release.py

我有一个目录结构如下:

  • group_vars /
  • 角色/
    • 鬼/
      • 任务/
        • main.yml
      • 模板/
      • release.py
  • site.yml

然而,角色/ ghost 文件夹名称可以更改(并且硬编码不会让您从另一个目录运行该剧本。)

如何获取tasks / main.yml(发出local_action命令)的目录路径,以便给出相对路径?

3 个答案:

答案 0 :(得分:6)

答案 1 :(得分:2)

您可以将release.py脚本放在roles / ghost / files /中,然后将其与local_action一起使用

- name: local scrpt 
  local_action: script release.py

这样你可能不需要获取目录路径

这引用了在目录布局部分http://www.ansibleworks.com/docs/playbooks_best_practices.html

中这样做

答案 2 :(得分:0)

在我看到这个问题之前我提交了pull request,但这是它的要点。

  1. 将脚本移动到角色
  2. 中的“files”目录
  3. 由于我们无法知道脚本将在哪条路径中,因此请将其复制到/ tmp:

    - name: copy ghost release script to tmp
      local_action: copy src=release.py dest=/tmp/release.py
      sudo: no
    
  4. 然后我们可以运行脚本

    - name: get ghost release version
      local_action: command python /tmp/release.py
      register: ghost_release
      sudo: no
    
  5. 如果外部剧本将其全局设置为sudo: no,我们选择on。我们不需要root用于此操作,如果需要输入密码,它可能会破坏ansible运行。

    通过使用事实以某种方式随机化文件名,然后在我们运行脚本后的额外步骤中删除文件,可能还有更好的方法来执行第2步。这可以最大程度地降低可能存在名为/tmp/release.py的文件所涉及的风险。