Ansible создает виртуальную среду

Как создать виртуальную среду для конкретной версии Python с помощью ansible. Есть ли команда в стандартной библиотеке ansible?

Я хотел бы что-то вроде:

- virtualenv: dest=venv python_version:/usr/bin/python3

person user204088    schedule 16.10.2014    source источник


Ответы (4)


Время от времени я сталкивался с неустойчивым поведением при указании virtualenv_command (например: получение исполняемого файла python 2.7 в моем virtualenv, хотя я указал запустить команду с virtualenv-3.4.

Если у вас возникла эта проблема, вы можете создать виртуальную среду вручную с помощью модуля command:

- name: Manually create the initial virtualenv
  command:
    cmd: virtualenv /user/home/venvs/myenv -p python3.4
    creates: "/user/home/venvs/myenv"

(примечание: при указании creates эта команда будет выполняться только в том случае, если virtualenv не существует в /user/home/venvs/myenv).

Затем вы можете установить свои требования как обычно с помощью команды pip:

- name: Install requirements
  pip: 
    requirements=/my_app/requirements.txt 
    virtualenv=/user/home/venvs/myenv

Обновить

Я обнаружил, что указание virtualenv_python (доступно в Ansible 2.0+) также работает в случае, указанном выше. Например:

- name: Install requirements
  pip: 
    requirements: /my_app/requirements.txt
    virtualenv: /user/home/venvs/myenv
    virtualenv_python: python3.4

(с этим вам не нужно сначала вручную создавать virtualenv)

person toast38coza    schedule 11.06.2015
comment
Последний работал у меня (сейчас этот способ упоминается в документах Ansible 2). Только одно: мне нужно было указать chdir при установке kallithea, иначе текущий каталог (на который ссылается внутри requirements.txt) неверен. Здесь может подойти chdir=/my_app - person FibreFoX; 05.04.2016
comment
Последние две задачи pip не работают, если вам нужен Python 3.x внутри virtualenv, а ваш Ansible использует Python 2.x. Поскольку Ansible использует Python2, он генерирует команду pip2 install, которая обходит virtualenv и вместо этого будет использовать любую установку pip на системном уровне, поэтому пакеты устанавливаются на системном уровне, а не в virtualenv. Для этой настройки с Python 3 мне пришлось использовать команды оболочки для создания установки virtualenv и pip. - person RichVel; 09.12.2016
comment
Что сработало, так это shell: source "{{ app_home }}/.virtualenvs/myenv/bin/activate" && pip3 install -r "{{ app_home }}/tests/requirements.txt". - person RichVel; 09.12.2016
comment
Пожалуйста, не используйте команду оболочки virtualenv с Python3. Там это называется pyvenv. - person erikbwork; 09.11.2017
comment
К вашему сведению, pyvenv устарел, начиная с Python 3.6.0. Теперь python3 -m venv: docs.python.org/3/library/venv.html - person Juha Untinen; 16.08.2018

Вы можете сделать это с помощью модуля pip и определенного двоичного файла virtualenv:

- pip: virtualenv=/path/to/venv virtualenv_command=/path/to/virtualenv3 ...
person Schnouki    schedule 16.10.2014
comment
Для этого нужно указать имя или требования. Нужно ли устанавливать любой из этих параметров? Или есть способ создать пустой виртуальный файл? - person user204088; 16.10.2014
comment
@user204088 user204088, а зачем тебе пустой виртуал? Модуль Ansible pip прекрасно создает его для вас, если он не существует, или использует его, если он существует... - person Stefano; 18.12.2014
comment
Вы, вероятно, уже поняли это, но он запрашивает имя/требования, потому что pip должен знать, что устанавливать. Его нельзя использовать, как указано выше, исключительно для создания виртуальной среды. Вместо этого он создает виртуальную среду в ходе установки указанных вами пакетов. - person Jim; 19.01.2016
comment
@Стефано, ты абсолютно прав. Я думаю, что другие ответы здесь более полны. - person Victor 'Chris' Cabral; 09.02.2016

С помощью ansible 2.0 вы можете указать версию Python для своего виртуального окружения с помощью virtualenv_python

Например:

- name: Initiate virtualenv
  pip: virtualenv="{{ virtualenv_dir }}" 
       virtualenv_python=python3.4
       requirements={{ app_dir }}/requirements.txt
person Tristan    schedule 25.01.2016
comment
это уже было возможно в Ansible 1. * с использованием virtualenv_command, например. virtualenv_command: "python3.4 /path/to/virtualenv" - person Stefano; 10.02.2016
comment
с помощью ansible 3 вы можете указать версию интерпретатора Python с помощью ansible_python_interpreter в файле инвентаря - person Beatriz Fonseca; 08.05.2021

На Центос-7:

Ansible Version: 2.9 (этот скрипт должен работать для ansible версии 2+)

Полный невозможный скрипт для создания виртуальной среды Python3.6

  - name: Enable EPEL Repository on CentOS 7
    yum:
      name: epel-release
      state: latest


  - name: check if virtualenv library already installed or not
    stat:
      path: /usr/bin/virtualenv
    register: pip_virtualenv_installed
    

  - name: Download Pip-Installer
    get_url:
      url: https://bootstrap.pypa.io/pip/2.7/get-pip.py
      dest: /tmp/get-pip.py
    when: pip_virtualenv_installed.stat.exists == False


  - name: Install pip
    shell: /usr/bin/python /tmp/get-pip.py
    when: pip_virtualenv_installed.stat.exists == False


  - name: Install virtualenv module
    pip:
      name: virtualenv
    when: pip_virtualenv_installed.stat.exists == False


  - name: Install Python 3.6
    yum:
      name:
        - python36
        - python36-devel
        - python36-libs
        - python3-setuptools
        - gcc
        - gcc-c++
      state: present


  - name: Create Python3-virtual environment folder
    file:
      name: /opt/python3-virtualenv
      state: directory


  - name: Initiate virtualenv
    pip:
      virtualenv: /opt/python3-virtualenv
      virtualenv_python: python3.6
      requirements: /opt/python3-virtualenv/requirements.txt
person Manju N    schedule 29.06.2021