我正在尝试从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
只打印出“。”。非常有帮助......
答案 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