pyenv 環境をマルチユーザで共有する話

# Overview

共有の開発環境とかで、ユーザごとに pyenv 入れると容量がえらいことになるので、
共通で1つ入れて一般ユーザで使い回せるようにする話。

## 要点

* `pyenv` group を作る
* システム内に1つ pyenv を入れる
  * `pyenv` group 所有にして、
  * group 読み込み権限を付ける
* 一般ユーザを `pyenv` group に所属させる

docker も採用してる手法。

# 環境

docker でもいいんだけど、せっかくなので vagrant でいきます。

```bash
$ vagrant -v
Vagrant 2.2.3
```

```rb:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
end
```

## ホスト側

### 起動して

```bash
$ vagrant up
```

### vmに入る

```bash
$ vagrant ssh
Last login: Wed Feb  5 03:53:55 2020 from 10.0.2.2
[vagrant@localhost ~]$
```

## 以降は vm の中で実行

### rootになっておきます

```bash
[vagrant@localhost ~]$ sudo su -
Last login: 水  2月  5 03:50:50 UTC 2020 on pts/1
[root@localhost ~]#
```

### pyenv環境を作成

#### 環境変数設定用の sh を用意しておく

```bash:pyenv.sh
if [ -e /opt/pyenv ]; then
    export PYENV_ROOT=/opt/pyenv
    export PATH="${PYENV_ROOT}/bin:$PATH"
    eval "$(pyenv init -)"
fi
```

`/opt/pyenv` に install します。

```bash
$ yum install -y \
    @development zlib-devel bzip2 bzip2-devel readline-devel sqlite \
    sqlite-devel openssl-devel xz xz-devel libffi-devel findutils

$ curl https://pyenv.run | PYENV_ROOT=/opt/pyenv bash

$ groupadd pyenv \
    && chown -R :pyenv /opt/pyenv/ \
    && chmod g+r -R /opt/pyenv/

$ cp /vagrant/pyenv.sh /etc/profile.d/
```


### 確認

vm に入り直して

```bash
[vagrant@localhost ~]$ pyenv -v
pyenv 1.2.16

[vagrant@localhost ~]$ pyenv versions
* system (set by /opt/pyenv/version)
```

### バージョン指定で python を入れる

`pyenv install` は root じゃないとできないので、

```bash
[root@localhost ~]# pyenv install 3.8.1
(..snip..)

[root@localhost ~]# pyenv install 3.7.6
(..snip..)
```

入りました。

```bash
[root@localhost ~]# pyenv  versions
* system (set by /opt/pyenv/version)
  3.7.6
  3.8.1
```

一般ユーザでも確認。
書き込み権限を付けてないので `pyenv: cannot rehash: /opt/pyenv/shims isn't writable` とか出るけど気にせず。


```bash
[root@localhost ~]# su - vagrant
Last login: Wed Feb  5 04:01:04 UTC 2020 from 10.0.2.2 on pts/0
pyenv: cannot rehash: /opt/pyenv/shims isn't writable
[vagrant@localhost ~]$ pyenv versions
* system (set by /opt/pyenv/version)
  3.7.6
  3.8.1
```

ここまでが準備。

# 動作確認

vm の中で実行する。

## 一般ユーザを追加

`pyenv` グループに所属させるのを忘れずに。

```bash
[root@localhost ~]# useradd foo -G pyenv

[root@localhost ~]# id foo
uid=1001(foo) gid=1002(foo) groups=1002(foo),1001(pyenv)
```

既存ユーザを group に追加する場合はこう。

```bash
[root@localhost ~]# useradd bar
[root@localhost ~]# gpasswd -a bar pyenv

[root@localhost ~]# id bar
uid=1002(bar) gid=1003(bar) groups=1003(bar),1001(pyenv)
```

## 一般ユーザで pyenv を使用する

`pyenv global` は使えないので、各ユーザごとに `pyenv local` する。

### 3.7.6 を使いたい人

```bash
[root@localhost ~]# su - bar
Last login: Wed Feb  5 03:55:34 UTC 2020 on pts/2
pyenv: cannot rehash: /opt/pyenv/shims isn't writable

[bar@localhost ~]$ pyenv local 3.7.6
[bar@localhost ~]$ python -V
Python 3.7.6
```

#### virtualenv in pyenv も使える

```bash
[bar@localhost ~]$ python -m venv .venv
[bar@localhost ~]$ . .venv/bin/activate

(.venv) [bar@localhost ~]$ python -V
Python 3.7.6
(.venv) [bar@localhost ~]$ which python
~/.venv/bin/python
```

```bash
(.venv) [bar@localhost ~]$ pip install numpy==1.18.1

(.venv) [bar@localhost ~]$ python -c 'import numpy; print(numpy.__version__)'
1.18.1
```

### 3.8.1 を使いたい人

```bash
[root@localhost ~]# su - foo
Last login: Wed Feb  5 03:54:47 UTC 2020 on pts/1
pyenv: cannot rehash: /opt/pyenv/shims isn't writable

[foo@localhost ~]$ pyenv local 3.8.1
[foo@localhost ~]$ python -V
Python 3.8.1
```

virtualenv を使わない場合は `pip install` に `--user` オプションをつけるのを忘れずに。

```bash
[foo@localhost ~]$ python -m pip install --user numpy==1.15

[foo@localhost ~]$ python -c 'import numpy; print(numpy.__version__)'
1.15.0
```

おわり。

ちゃんと運用してないから使い込んでくとどうなるかは不明。
At Your Own Risk でどうぞ。

# というか

docker 使おう。