【问题标题】:Ansible creating a virtualenvAnsible 创建一个 virtualenv
【发布时间】:2014-10-16 10:30:06
【问题描述】:

如何使用 ansible 为特定的 python 版本创建 virtualenv。 ansible标准库中有命令吗?

我想要类似的东西:

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

【问题讨论】:

    标签: python ansible


    【解决方案1】:

    我有时会在指定 virtualenv_command 时遇到一些不稳定的行为(例如:在我的 virtualenv 中获取 python 2.7 可执行文件,即使我指定使用 virtualenv-3.4 运行命令。

    如果您遇到该问题,您可以使用 command 模块手动创建 virtualenv:

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

    (注意:通过指定creates,此命令将仅在/user/home/venvs/myenv不存在virtualenv的情况下运行)。

    然后您可以使用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)

    【讨论】:

    • 最后一个对我有用(现在 Ansible 2 的文档中提到了这种方式)。只有一件事:我需要在安装kallithea 时指定chdir,否则当前目录(在requirements.txt 中引用)是错误的。拥有chdir=/my_app 可能在这里工作
    • 如果您在 virtualenv 中需要 Python 3.x 并且您的 Ansible 使用的是 Python 2.x,则最后两个 pip 任务不起作用。因为 Ansible 使用的是 Python2,它会生成一个绕过 virtualenv 的 pip2 install 命令,并将使用任何系统级 pip 安装来代替 - 因此这些包安装在系统级而不是 virtualenv 中。对于 Python 3 的这个设置,我必须使用 shell 命令来创建 virtualenv 和 pip 安装。
    • 起作用的是shell: source "{{ app_home }}/.virtualenvs/myenv/bin/activate" && pip3 install -r "{{ app_home }}/tests/requirements.txt"
    • 请不要在 Python3 中使用virtualenv shell 命令。那里叫pyvenv
    • 仅供参考,pyvenv 自 Python 3.6.0 起已被弃用。现在是python3 -m venv:docs.python.org/3/library/venv.html
    【解决方案2】:

    您可以使用 pip 模块和特定的 virtualenv 二进制文件:

    - pip: virtualenv=/path/to/venv virtualenv_command=/path/to/virtualenv3 ...
    

    【讨论】:

    • 这样做是要求提供名称或要求。我需要设置这些选项中的任何一个吗?或者有没有办法创建一个空的 virtualenv
    • @user204088 为什么需要一个空的 virtualenv?如果 Ansible pip 模块不存在,它会很好地为您创建一个,或者如果存在则使用它......
    • 您可能已经想通了,但它要求提供名称/要求,因为 pip 需要知道要安装什么。它不能像上面指定的那样仅用于创建虚拟环境。相反,它会在安装您指定的包的过程中创建虚拟环境。
    • @Stefano 你是绝对正确的。我认为这里的其他答案更完整。
    【解决方案3】:

    使用 ansible 2.0,您可以使用 virtualenv_python 为您的 virtualenv 指定 python 版本

    例如:

    - name: Initiate virtualenv
      pip: virtualenv="{{ virtualenv_dir }}" 
           virtualenv_python=python3.4
           requirements={{ app_dir }}/requirements.txt
    

    【讨论】:

    • 在 Ansible 1.* 中已经可以使用 virtualenv_command 例如。 virtualenv_command: "python3.4 /path/to/virtualenv"
    • 使用 ansible 3,您可以在清单文件中使用 ansible_python_interpreter 指定 python 解释器版本
    【解决方案4】:

    在 Centos-7 上:

    Ansible 版本:2.9(此脚本应该适用于 ansible 版本 2 +)

    创建 Python3.6 虚拟环境的完整 ansible 脚本

      - 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
    

    【讨论】:

      猜你喜欢
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-18
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多