Blog Entry  (May 14, 2016, 8:18 a.m.)

Tilo Mitra's avatar

AnsibleでソースからPythonをインストールする

Ansibleを使ってCentOSにPython2.7.10をソースからインストールしてみたいと思います。今回はPythonですが、流用すれば他のライブラリのインストールにも使えると思います。

やりたいこと(コマンド)

大体やりたいことは下記の通りです。インストール先に /usr/local/ 、ソースの一時保存先に /var/tmp/ を指定しています。

yum install gcc
wget https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz -P /var/tmp/
tar xvzf /var/tmp/Python-2.7.10.tgz -C /var/tmp/
/var/tmp/Python-2.7.10/configure CFLAGS=-fPIC --enable-shared --prefix=/usr/local/
make -I /var/tmp/Python-2.7.10/
make -I /var/tmp/Python-2.7.10/ install
ln /usr/local/lib/libpython2.7.so.1.0 /lib64/libpython2.7.so.1.0

configure を実行した際にエラーになるかもしれないので gcc のインストールも行っています。 make install を実行した時点でインストールはできていますが、インストールしたPythonを実行した時にエラーになったので最後にシンボリックリンクを貼っています。

参考: Python エラー対処:error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

playbook

ソース

- hosts: all
  sudo: yes
  tasks:
    - name: Install gcc
      yum: name=gcc state=latest
    - name: Check Python
      command: /usr/local/bin/python -V
      ignore_errors: True
      register: check_python_result
    - name: Create tmp directory
      file: path=/var/tmp/Python-2.7.10 state=directory
    - name: Download Python
      get_url: url=https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz dest=/var/tmp/Python-2.7.10.tgz
    - name: Unarchive Python
      unarchive: src=/var/tmp/Python-2.7.10.tgz dest=/var/tmp/ copy=no
    - name: Install Python
      command: "{{ item }}"
      with_items:
        - /var/tmp/Python-2.7.10/configure CFLAGS=-fPIC --enable-shared --prefix=/usr/local/
        - make -I /var/tmp/Python-2.7.10/
        - make -I /var/tmp/Python-2.7.10/ install
      when: check_python_result | failed
    - name: Link Python lib
      file: src=/usr/local/lib/libpython2.7.so.1.0 dest=/lib64/libpython2.7.so.1.0 state=link

説明

Install gcc

前述したとおり、 gcc が無ければエラーになるので yum でインストールしています。

Check Python

冪等性を保つために、指定されたPATHにPythonがインストールされているかチェックしています。結果を check_python_result という名前で保存し、エラーになっていなければ後の Install Python をスキップする判断に利用します。ただし、Python自体が入っていない時だけではなく、 error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory などがでた時にもエラーとして扱ってしまうので、この判断方法はもう少し考えないとならないですね。

Create tmp directory

この後に Download Python を実行した際に保存先のディレクトリが無ければならないのでここで予め作っています。

Download Python

Pythonのソースをダウンロードします。すでに存在する場合はダウンロードしません。

Unarchive Python

tgzを解凍します。 copy=yes の場合はAnsibleを実行しているホストのファイルを参照します。今回はサーバー上のファイルを参照したいため copy=no としています。

Install Python

ここでは command を使って configure make make install を実行しているだけです。これらのコマンドはよく使うのでAnsibleのデフォルトの機能であるのかと思っていましたが、調べた時はちょっとわからなかったです。 Check Python の結果を参照し、すでに指定のPATHにPythonが入っている場合はスキップされます。

Link Python lib

前述のエラーの対策としてシンボリックリンクを貼っています。

元の記事へ