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を実行した時にエラーになったので最後にシンボリックリンクを貼っています。
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
を使ってconfigure
・make
・make install
を実行しているだけです。その際、chdir
でソースの置かれているディレクトリに移動しています。これらのコマンドはよく使うのでAnsibleのデフォルトの機能であるのかと思っていましたが、調べた時はちょっとわからなかったです。creates
を指定していて、すでに/usr/local/bin/python
が存在している場合はスキップされます。
Link Python lib
冒頭に書いたエラーの対策としてシンボリックリンクを貼っています。