7

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

- local_action: command python release.py
  register: release_url

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

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

我有一个目录结构如下:

  • group_vars/
  • 角色/
    • 鬼/
      • 任务/
        • 主要的.yml
      • 模板/
      • 释放.py
  • 网站.yml

但是角色/幽灵文件夹名称可以更改(并且硬编码不会让您从另一个目录运行剧本)。

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

4

3 回答 3

6

从 ansible 1.8 开始,role_path定义了一个可用于此目的的变量。

于 2015-01-20T21:59:15.720 回答
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

于 2013-11-06T19:15:37.000 回答
0

在看到这个 SO 问题之前,我提交了一个拉取请求,但这是它的要点。

  1. 将脚本移动到角色内的“文件”目录
  2. 由于我们不知道脚本将在哪个路径中,因此将其复制到 /tmp:

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

    - name: get ghost release version
      local_action: command python /tmp/release.py
      register: ghost_release
      sudo: no
    

我们选择sudo: no外部剧本将其全局设置为on. 我们不需要 root 来执行此操作,如果它需要输入密码,它可能会破坏 ansible 运行。

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

于 2014-11-24T14:47:38.183 回答