インフラエンジニアbacchiのわかったことまとめ

bacchi.me

ansibleでpyenvをインストールして、任意のバージョンのpythonを入れて、pipモジュールも入れる

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
  • B!