在 Ansible 中使用 pyenv
Using pyenv in Ansible
我正在使用 Ansible 来设置基于 Ubuntu 的 Vagrant 和 DigitalOcean 盒子,并想使用 pyenv 来管理几个不同网站的环境。
我在尝试使用我安装的 pyenv 安装 python 版本时遇到权限问题,这可能是因为我缺乏基本的 *nix 知识。
我有一个 deploy
用户和组,我已经为他们安装了 pyenv,但很明显用户的操作出现了问题,因为下面的最终任务失败了(为清楚起见,所有变量都替换为字符串):
- name: Install pyenv
git:
repo: https://github.com/yyuu/pyenv.git
dest: "/home/deploy/.pyenv"
- name: Install pyenv-virtualenv plugin
git:
repo: https://github.com/yyuu/pyenv-virtualenv.git
dest: "/home/deploy/.pyenv/plugins/pyenv-virtualenv"
- name: Add path etc to .bashrc.
lineinfile:
dest: "/home/deploy/.bashrc"
state: present
create: yes
line: "{{ item }}"
with_items:
- 'export PYENV_ROOT="$HOME/.pyenv"'
- 'export PATH="$PYENV_ROOT/bin:$PATH"'
- 'eval "$(pyenv init -)"'
- 'eval "$(pyenv virtualenv-init -)"'
- name: Ensure .pyenv permissions are set properly
file: path=/home/deploy/.pyenv
recurse=yes
owner=deploy
group=deploy
state=directory
- name: Install default python version
become: yes
become_user: 'deploy'
shell: . /home/deploy/.bashrc && pyenv install 3.5.1
creates="/home/deploy/.pyenv/versions/3.5.1"
执行 vagrant up
时一切正常,直到:
TASK [python : Install default python version] *********************************
fatal: [192.168.33.15]: FAILED! => {"changed": true, "cmd": ". /home/deploy/.bashrc && pyenv install 3.5.1", "delta": "0:00:00.002111", "end": "2016-02-16 11:48:26.930971", "failed": true, "rc": 127, "start": "2016-02-16 11:48:26.928860", "stderr": "/bin/sh: 1: pyenv: not found", "stdout": "", "stdout_lines": [], "warnings": []}
更新: 如果它很重要,在这种情况下(Vagrant 框)我的 vagrant.yml
剧本将 remote_user
设置为 vagrant
:
- name: Create a virtual machine via vagrant
hosts: all
become: yes
become_method: sudo
remote_user: vagrant
...
更新 2: 如果我以 deploy
用户身份 ssh 进入 Vagrant VM,那么我可以使用 pyenv
OK。如果我作为 vagrant
然后 sudo -u deploy bash -i
ssh 进入,我得到 pyenv: command not found
...
更新 3: 问题的根源 可能 是 /home/deploy/.bashrc
或 /home/deploy/.profile
都没有来源当使用 sudo
切换到 deploy
用户时(通过每个文件的 echo
ing 测试),但是当以 deploy
身份登录时。但是,我认为 /home/deploy/.bashrc
是 是由失败的任务引起的 - 回显文本出现在标准输出中。
因为你的错误是:
pyenv: not found
只需尝试在您的任务中使用 pyenv 的绝对路径即可。这是处理 shell
任务的推荐方法:
登录到您的机器并找到 pyenv
的路径
which pyenv
然后将您的任务更改为
# /path/to/pyenv is the result of the previous command
...
shell: . /home/deploy/.bashrc && /path/to/pyenv install 3.5.1
...
我正在使用 Ansible 来设置基于 Ubuntu 的 Vagrant 和 DigitalOcean 盒子,并想使用 pyenv 来管理几个不同网站的环境。
我在尝试使用我安装的 pyenv 安装 python 版本时遇到权限问题,这可能是因为我缺乏基本的 *nix 知识。
我有一个 deploy
用户和组,我已经为他们安装了 pyenv,但很明显用户的操作出现了问题,因为下面的最终任务失败了(为清楚起见,所有变量都替换为字符串):
- name: Install pyenv
git:
repo: https://github.com/yyuu/pyenv.git
dest: "/home/deploy/.pyenv"
- name: Install pyenv-virtualenv plugin
git:
repo: https://github.com/yyuu/pyenv-virtualenv.git
dest: "/home/deploy/.pyenv/plugins/pyenv-virtualenv"
- name: Add path etc to .bashrc.
lineinfile:
dest: "/home/deploy/.bashrc"
state: present
create: yes
line: "{{ item }}"
with_items:
- 'export PYENV_ROOT="$HOME/.pyenv"'
- 'export PATH="$PYENV_ROOT/bin:$PATH"'
- 'eval "$(pyenv init -)"'
- 'eval "$(pyenv virtualenv-init -)"'
- name: Ensure .pyenv permissions are set properly
file: path=/home/deploy/.pyenv
recurse=yes
owner=deploy
group=deploy
state=directory
- name: Install default python version
become: yes
become_user: 'deploy'
shell: . /home/deploy/.bashrc && pyenv install 3.5.1
creates="/home/deploy/.pyenv/versions/3.5.1"
执行 vagrant up
时一切正常,直到:
TASK [python : Install default python version] ********************************* fatal: [192.168.33.15]: FAILED! => {"changed": true, "cmd": ". /home/deploy/.bashrc && pyenv install 3.5.1", "delta": "0:00:00.002111", "end": "2016-02-16 11:48:26.930971", "failed": true, "rc": 127, "start": "2016-02-16 11:48:26.928860", "stderr": "/bin/sh: 1: pyenv: not found", "stdout": "", "stdout_lines": [], "warnings": []}
更新: 如果它很重要,在这种情况下(Vagrant 框)我的 vagrant.yml
剧本将 remote_user
设置为 vagrant
:
- name: Create a virtual machine via vagrant
hosts: all
become: yes
become_method: sudo
remote_user: vagrant
...
更新 2: 如果我以 deploy
用户身份 ssh 进入 Vagrant VM,那么我可以使用 pyenv
OK。如果我作为 vagrant
然后 sudo -u deploy bash -i
ssh 进入,我得到 pyenv: command not found
...
更新 3: 问题的根源 可能 是 /home/deploy/.bashrc
或 /home/deploy/.profile
都没有来源当使用 sudo
切换到 deploy
用户时(通过每个文件的 echo
ing 测试),但是当以 deploy
身份登录时。但是,我认为 /home/deploy/.bashrc
是 是由失败的任务引起的 - 回显文本出现在标准输出中。
因为你的错误是:
pyenv: not found
只需尝试在您的任务中使用 pyenv 的绝对路径即可。这是处理 shell
任务的推荐方法:
登录到您的机器并找到 pyenv
which pyenv
然后将您的任务更改为
# /path/to/pyenv is the result of the previous command
...
shell: . /home/deploy/.bashrc && /path/to/pyenv install 3.5.1
...