Ansible pyenv virtualenv出现pip错误?

5
我有一个Ansible任务。
- name: Install setuptools in virtual environment
  pip:
      name: setuptools-git
      virtualenv: "myenv"
      virtualenv_command: "/root/.pyenv/bin/pyenv virtualenv 2.7.13"

但是它出现了错误。
fatal: [localhost]: FAILED! => {
    "changed": false,
    "invocation": {
        "module_args": {
            "chdir": null,
            "editable": false,
            "executable": null,
            "extra_args": "",
            "name": [
                "setuptools-git"
            ],
            "requirements": null,
            "state": "present",
            "umask": null,
            "use_mirrors": true,
            "version": null,
            "virtualenv": "myenv",
            "virtualenv_command": "/root/.pyenv/bin/pyenv virtualenv 2.7.13",
            "virtualenv_python": null,
            "virtualenv_site_packages": false
        }
    },
    "msg": "Unable to find pip in the virtualenv, myenv, under any of these names: pip2, pip. Make sure pip is present in the virtualenv."
}

当我检查virtualenv中的pip文件时,它已经存在。

# ls -alh /root/.pyenv/versions/myenv/bin/pip
-rwxr-xr-x 1 root root 243 Jan 16 17:40 /root/.pyenv/versions/myenv/bin/pip

同名有两个虚拟环境

# /root/.pyenv/bin/pyenv virtualenvs
2.7.13/envs/myenv (created from /root/.pyenv/versions/2.7.13)
myenv (created from /root/.pyenv/versions/2.7.13)

我无法在virtualenv变量中使用executable


我们假设/root/.pyenv/versions/myenv/bin/pip被符号链接到了2.7.13 - techraf
@techraf,我更新了我的问题,希望你能在那里找到答案。 - Nilesh
2个回答

2
最初的回答:
我发现一种绕过使用pip模块的方法,直接执行一些shell命令来安装包到由pyenv管理的虚拟环境中。这里提供了一些我使用的变量、我创建的.pyenvrc文件以及执行shell魔法的ansible任务。
变量:
# Installation paths
pyenv_root: "{{ ansible_env.HOME }}/.pyenv"
pyenv_rc: "{{ pyenv_root }}/.pyenvrc"
# Whatever your virtualenv is named
pyenv_venv_name: "foo_virtualenv"
project_dir: /path/to/your/project

任务:


- name: Pip - install requirements using shell
  shell: |
    # cd to project directory
    cd {{ project_dir }}
    # Check to see if we are already inside a virtualenv
    if ! [[ ${VIRTUAL_ENV} ]]; then
        # Load pyenv into the shell
        source {{ pyenv_rc }}
        # Activate the virtualenv
        pyenv activate {{ pyenv_venv_name }}
    fi
    # Install python requirements 
    pip install -r requirements.txt
  args:
    executable: /bin/bash
  register: pip_script_result

Contents of .pyenvrc:

# Add pyenv into path if installed into default location
export PYENV_ROOT="{{ pyenv_root }}"
export PATH="${PYENV_ROOT}/bin:${PATH}"

# Initialise pyenv and pyenv-virtualenv if installed
if [[ -d $HOME/.pyenv ]];then
    eval "$(pyenv init -)"
    if [ -d "${PYENV_ROOT}/plugins/pyenv-virtualenv" ]; then
        eval "$(pyenv virtualenv-init -)"
    fi
fi

# Disable prompt changing
export PYENV_VIRTUALENV_DISABLE_PROMPT=1

在上面的例子中,我使用piprequirements.txt的内容安装到了我管理的pyenv虚拟环境中。您应该能够调整pip install行以满足您的需求。"最初的回答"。

1
基本上,对于virtualenv属性,您需要传递虚拟环境路径。请参见以下示例。
- hosts: 1.2.3.4
  user: remoteuser
  environment:
    PYENV_ROOT: /home/<user home dir>/.pyenv
    PYENV_VERSION: myenv
    PYENV_SHELL: bash
    PYENV_ACTIVATE_SHELL: 1
  tasks:
  - pip:
      name: setuptools-git
      virtualenv: "/home/<user home dir>/.pyenv/versions/myenv"
      virtualenv_command: /home/<user home dir>/.pyenv/bin/pyenv virtualenv 3.4.0 myenv

我希望这可以解决你的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接