Лучший способ всегда запускать 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/ Flexible-with-forced- commands/

1 ответ

Решение

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

Не уверен, насколько он чистый, но он работает. Я просто немного опираюсь на то, что упоминал здесь Микепурвис.

---
# 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 $@
Другие вопросы по тегам