こんにちは。@mosuke5です。
最近、Ansibleを使い始めました、yumやapt-getでインストールできるものは記述も簡単でいいのですが、
どうしてもソースインストールが必要な場合があります。ソースコードでのインストールは結構手間がかかるので、ソースインストールを行う際のPlaybookの書き方と注意点をまとめました。
まず、ソースインストールを行うには以下のフローを行うと仮定します。
- ソースファイルの取得(tarで固められていると仮定)
- tarファイルの解凍
- 解答してできたディレクトリへ移動
- configure
- make
- make install
また、Ansibleの運用では通常、何回も同じPlaybookを対象のサーバに実行していくため、 すでにインストールされている場合は、インストールをスキップする必要があります。いわゆる冪等性です。 yumやapt-getで管理されていれば上記を心配することはないのだが、やはりソースインストールだとこの壁があります。
今回は例として、ubuntu13にemacsをソースインストールするのを例としてみた。
環境
【Ansible実行側】
- さくらVPSの1G
- OS:Centos 7
- IPアドレス:192.168.33.1
【設定対象側】
上記さくらVPS上にたてたVagrantの仮想サーバ
- OS: Ubuntu 13.10
- IPアドレス:192.168.33.100
Playbook
以下playbookの例です。重要なのは、何を判断してインストール済みとするかです。
※本記事は2014年にかかれたもので、Ansibleのバージョンが古いです。最新の書き方にそぐわない可能性があるので注意してください。
---
- hosts: 192.168.33.100
user: vagrant
sudo: yes
vars:
src_dir: /usr/local/src
emacs_ver: emacs-23.4
tasks:
## emacsのソースファイルを取得済みか確認
- name: check exist emacs source file
command: ls -l {{src_dir}}/{{emacs_ver}}.tar.gz
ignore_errors: True
register: result1
## emacsのソースファイル取得。ただし、すでに取得済みならスキップ
- name: get emacs source file
command: chdir={{src_dir}} wget http://mirror.jre655.com/GNU/emacs/{{emacs_ver}}.tar.gz
when: result1|failed
## emacsのソースインストールを解凍
- name: get emacs source file
command: chdir={{src_dir}} tar xvf {{emacs_ver}}.tar.gz
when: result1|failed
## emacsがインストールされているか確認
# 確認基準はemacsコマンドのpathが通っているかで判断した
- name: check emacs install
command: which emacs
ignore_errors: True
register: result2
## emacsのインストール。ただしすでにemacsがインストールされいたらスキップ
- name: expand emacs src
command: chdir={{src_dir}} tar xvf {{emacs_ver}}.tar.gz
when: result2|failed
- name: comfigure emacs
command: chdir={{src_dir}}/{{emacs_ver}} ./configure
when: result2|failed
- name: make emacs
command: chdir={{src_dir}}/{{emacs_ver}} make
when: result2|failed
- name: install emacs
command: chdir={{src_dir}}/{{emacs_ver}} make install
when: result2|failed
まとめ
考えてほしいところは、2回目以降の実行時にエラーにならないようにどうすればいいかということです。
なにを確認して、インストール済みと判断するのか、インストールがされていればどうすればいいのか。
ここが一番重要なポイントです。
この例は、非常にシンプルな例であるので、実際のユースケースに合わせて上の点を判断してもらえればと思います。