Ansible 创建虚拟环境

76 投票
4 回答
88989 浏览
提问于 2025-04-27 22:11

如何使用Ansible为特定的Python版本创建一个虚拟环境?Ansible的标准库里有没有相关的命令?

我想要的类似于:

- virtualenv: dest=venv python_version:/usr/bin/python3
暂无标签

4 个回答

2

在Centos-7系统上:

使用的Ansible版本:2.9(这个脚本应该适用于2及以上版本的Ansible)

完整的Ansible脚本,用于创建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
11

在 ansible 2.0 中,你可以为你的虚拟环境指定一个 Python 版本,方法是使用 virtualenv_python

比如说:

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

你可以使用pip模块和一个特定的virtualenv工具来实现这个功能:

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

有时候我在指定 virtualenv_command 的时候会遇到一些奇怪的问题,比如我明明指定要用 virtualenv-3.4 来创建虚拟环境,却得到一个 Python 2.7 的可执行文件。

如果你也遇到这个问题,你可以通过 command 模块手动创建虚拟环境:

- 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 这个路径下没有虚拟环境时才会执行。)

然后你可以像往常一样使用 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

(使用这个,你就不需要先手动创建虚拟环境了)

撰写回答