通过ansible运行Python脚本

时间:2016-02-01 20:28:56

标签: ansible ansible-2.x

我正在尝试从ansible脚本运行python脚本。我认为这将是一件容易的事情,但我无法弄明白。我有一个像这样的项目结构:

playbook-folder
  roles
    stagecode
      files
        mypythonscript.py
      tasks
        main.yml
  release.yml

我正在尝试在main.yml中的任务中运行mypythonscript.py(这是release.yml中使用的一个角色)。这是任务:

- name: run my script!
  command: ./roles/stagecode/files/mypythonscript.py
  args:
    chdir: /dir/to/be/run/in
  delegate_to: 127.0.0.1
  run_once: true

我也试过../files/mypythonscript.py。我认为ansible的路径是相对于剧本的,但我猜不是吗?

我也尝试过调试以找出我在脚本中间的位置,但也没有运气。

- name: figure out where we are
  stat: path=.
  delegate_to: 127.0.0.1
  run_once: true
  register: righthere

- name: print where we are
  debug: msg="{{righthere.stat.path}}"
  delegate_to: 127.0.0.1
  run_once: true

只打印出“。”。非常有帮助......

3 个答案:

答案 0 :(得分:32)

尝试使用脚本指令,它适用于我

my main.yml

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

get-pip.py 文件应位于同一角色的文件

答案 1 :(得分:12)

如果您希望能够使用脚本的相对路径而不是绝对路径,那么您最好使用role_path magic variable来查找角色的路径并从那里开始工作。

使用您在问题中使用的结构,以下内容应该有效:

- name: run my script!
  command: ./mypythonscript.py
  args:
    chdir: "{{ role_path }}"/files
  delegate_to: 127.0.0.1
  run_once: true

答案 2 :(得分:1)

另一种/直接的解决方案: 假设您已经在 ./env1 下构建了虚拟环境并使用 pip3 安装所需的 python 模块。 现在编写剧本任务,如:

 - name: Run a script using an executable in a system path
  script: ./test.py
  args:
    executable: ./env1/bin/python
  register: python_result
  
  - name: Get stdout or stderr from the output
    debug:
      var: python_result.stdout