ansibleでpyenvをインストールして、任意のバージョンのpythonを入れて、pipモジュールも入れるplaybookを書いた。
このplaybookのミソは↓のtask
- set_fact: ansible_python_interpreter=/root/.pyenv/shims/python
このtaskがない状態でplaybookを流すと、pyenvで入れたpipではなく、OSコマンドのpipをたたいてしまう。
AnsibleはOSのプリインストールのpythonを使おうとするため、set_factモジュールを使い、pythonインタプリタの指定を変更してやる必要があります。
playbook
適当に改変して使ってください。
main.yml
- yum: name={{ item }} state=present enablerepo=epel conf_file=/etc/yum.conf.noexclude
with_items:
- git
- git: repo=git://github.com/pyenv/pyenv.git dest=/root/.pyenv accept_hostkey=yes
- blockinfile:
dest: /root/.bash_profile
content: |
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
notify: source bash_profile
- shell: bash -lc "pyenv versions | grep {{ python_version }}"
register: pyenv_version
ignore_errors: yes
changed_when: False
- shell: bash -lc "pyenv install {{ python_version }}"
when: pyenv_version|failed
- shell: bash -lc "pyenv global {{ python_version }}"
when: pyenv_version|failed
- set_fact: ansible_python_interpreter=/root/.pyenv/shims/python
- pip: name={{ item.name }}
with_items:
- pip_pkg
ignore_errors: yes
handlers/main.yml
- name: source bash_profile
shell: bash -lc "source /root/.bash_profile"
host_varsやgroup_varsに仕込む
python_version: 2.7.13