Лучший способ всегда запускать ansible внутри virtualenv на удаленных машинах?

Есть ли лучший способ запустить ansible внутри virtualenv на удаленных машинах?

Пока я вижу, как изменить файл .bashrc вручную или с помощью самого ansible.

Например:

 tasks:
    - name: "Enable virtualenv in .bashrc"
      lineinfile: dest=.bashrc
                  line="source {{ PROJECT_HOME }}/venv/bin/activate"

    #
    # Put tasks that rely on this precondition here (?)
    #

    # Optionally, disable this later on
    - name: "Disable virtualenv in .bashrc"
      lineinfile: dest=.bashrc
                  line="source {{ PROJECT_HOME }}/venv/bin/activate"
                  state=absent

TODO: проверьте, можно ли это сделать с помощью авторизованных ключей ssh: http://binblog.info/2008/10/20/openssh-going-flexible-with-forced-commands/


person Matt Schlobohm    schedule 13.12.2013    source источник


Ответы (1)


Вот способ включить виртуальную среду для всей игры; этот пример создает виртуальную среду в одном воспроизведении, а затем начинает использовать его в следующем.

Не уверен, насколько это чисто, но работает. Я просто немного развиваю то, что здесь упомянул 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 $@
person Matt Schlobohm    schedule 14.12.2013
comment
Хорошее решение - по-видимому, настоящие задачи идут после задач сторожевого кода. Я думаю, что часть файла оболочки pyenv в конце имеет опечатку в имени — должно быть pyvenv, чтобы соответствовать задачам Ansible. Также неэкранированные вложенные кавычки оболочки в этом скрипте выглядят немного странно, но пока это работает... - person RichVel; 09.09.2016