Python
Ansible

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

More than 1 year has passed since last update.

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/
cd /var/tmp/Python-2.7.10/
./configure CFLAGS=-fPIC --enable-shared --prefix=/usr/local/
make
make 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

become: yes
tasks:

- name: Install gcc
yum: name=gcc state=latest

- 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
creates=/usr/local/bin/python
environment:
LANG: C
LC_ALL: C
LC_MESSAGES: C

- name: Unarchive Python
unarchive: src=/var/tmp/Python-2.7.10.tgz dest=/var/tmp/ copy=no

- name: Install Python
command: >
{{ item }}
chdir=/var/tmp/Python-2.7.10/
creates=/usr/local/bin/python
with_items:
- './configure CFLAGS=-fPIC --enable-shared --prefix=/usr/local/'
- make
- make install

- 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でインストールしています。


Create tmp directory

この後にUnarchive Pythonを実行した際に保存先のディレクトリが必要だったのでここで予め作っています。


Download Python

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


Unarchive Python

tgzを解凍します。copy=yesの場合はAnsibleを実行しているホストのファイルを参照します。今回はサーバー上のファイルを参照したいためcopy=noとしています。これを実行した際、ファイルが存在するはずなのに'No such file or directory'というエラーに遭遇したため、environmentを追加しました。

参考:Ansible の unarchive で No such file or directory


Install Python

ここではcommandを使ってconfiguremakemake installを実行しているだけです。その際、chdirでソースの置かれているディレクトリに移動しています。これらのコマンドはよく使うのでAnsibleのデフォルトの機能であるのかと思っていましたが、調べた時はちょっとわからなかったです。createsを指定していて、すでに/usr/local/bin/pythonが存在している場合はスキップされます。


Link Python lib

冒頭に書いたエラーの対策としてシンボリックリンクを貼っています。