这看起来应该很简单:
tasks:
- name: install python packages
pip: name=${item} virtualenv=~/buildbot-env
with_items: [ buildbot ]
- name: create buildbot master
command: buildbot create-master ~/buildbot creates=~/buildbot/buildbot.tac
但是,除非首先获取virtualenv的激活脚本,否则命令将不会成功,并且似乎没有在Ansible command module中执行此操作。
我已尝试在各种.profile,.bashrc,.bash_login等中获取激活脚本,但没有运气。或者,有shell命令,但它似乎是一种尴尬的黑客攻击:
- name: create buildbot master
shell: source ~/buildbot-env/bin/activate && \
buildbot create-master ~/buildbot \
creates=~/buildbot/buildbot.tac executable=/bin/bash
有更好的方法吗?
答案 0 :(得分:25)
这是包装器方法的通用版本。
venv_exec.j2:
#!/bin/bash
source {{ venv }}/bin/activate
$@
然后是剧本:
tasks:
- pip: name={{ item }} virtualenv={{ venv }}
with_items:
- buildbot
- template: src=venv_exec.j2 dest={{ venv }}/exec mode=755
- command: "{{ venv }}/exec buildbot create-master {{ buildbot_master }}"
答案 1 :(得分:22)
更好的方法是使用已安装脚本的完整路径 - 它将自动在其virtualenv中运行:
tasks:
- name: install python packages
pip: name={{ item }} virtualenv={{ venv }}
with_items: [ buildbot ]
- name: create buildbot master
command: "{{ venv }}/bin/buildbot create-master ~/buildbot
creates=~/buildbot/buildbot.tac"
答案 2 :(得分:8)
这是一种为整个游戏启用virtualenv的方法;这个例子在一个剧本中构建了virtualenv,然后在下一个剧本中开始使用它。
不确定它有多干净,但它确实有效。我只是建立一下mikepurvis在这里提到的内容。
---
# Build virtualenv
- hosts: all
vars:
PROJECT_HOME: "/tmp/my_test_home"
ansible_python_interpreter: "/usr/local/bin/python"
tasks:
- name: "Create virtualenv"
shell: virtualenv "{{ PROJECT_HOME }}/venv"
creates="{{ PROJECT_HOME }}/venv/bin/activate"
- name: "Copy virtualenv wrapper file"
synchronize: src=pyvenv
dest="{{ PROJECT_HOME }}/venv/bin/pyvenv"
# Use virtualenv
- hosts: all
vars:
PROJECT_HOME: "/tmp/my_test_home"
ansible_python_interpreter: "/tmp/my_test_home/venv/bin/pyvenv"
tasks:
- name: "Guard code, so we are more certain we are in a virtualenv"
shell: echo $VIRTUAL_ENV
register: command_result
failed_when: command_result.stdout == ""
pyenv包装文件:
#!/bin/bash
source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/activate"
python $@
答案 3 :(得分:2)
只需在shell中运行virtualenvs pip:
shell: ~/buildbot-env/pip install ${item}
像魅力一样工作。我不知道pip模块对virtualenvs做了什么,但它似乎没用。
答案 4 :(得分:1)
正如我在上面评论的那样,我创建了一个脚本,比如称为buildbot.sh
:
source ~/buildbot-env/bin/activate
buildbot create-master [and more stuff]
然后使用如下任务在遥控器上运行它:
- name: Create buildbot master
script: buildbot.sh
对我而言,这似乎仍然是不必要的,但它可能比在shell命令中运行它更清晰。你的剧本看起来更干净,代价是不能立即看到剧本的作用。
至少有些模块似乎确实使用了virtualenv,因为django_manage
和rax_clb
已经有了内置的virtualenv参数。对于Ansible来说,包含一个命令在virtenv类型的模块可能不是一个很大的步骤。