16 Nov 2014, 15:32

Ansible、ソースインストールする際のPalybookの書き方

こんにちは。@mosuke5です。
最近、Ansibleを使い始めました、yumやapt-getでインストールできるものは記述も簡単でいいのですが、 どうしてもソースインストールが必要な場合があります。ソースコードでのインストールは結構手間がかかるので、ソースインストールを行う際のPlaybookの書き方と注意点をまとめました。

まず、ソースインストールを行うには以下のフローを行うと仮定します。

  1. ソースファイルの取得(tarで固められていると仮定)
  2. tarファイルの解凍
  3. 解答してできたディレクトリへ移動
  4. configure
  5. make
  6. 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回目以降の実行時にエラーにならないようにどうすればいいかということです。 なにを確認して、インストール済みと判断するのか、インストールがされていればどうすればいいのか。 ここが一番重要なポイントです。
この例は、非常にシンプルな例であるので、実際のユースケースに合わせて上の点を判断してもらえればと思います。

関連する記事はこちら
  • AnsibleとServerspecの実行をRakeタスクにまとめる (2015/12/17)
  • Ansible、実行速度高速化の実験。ControlMasterとPipeliningについて (2015/12/01)
  • serverspecを使ったインフラのテストを導入した理由と工夫している点 (2015/11/02)
  • Ansibleを踏み台サーバ越しに実行する方法 (2015/09/25)
  • Packerやる前にKickstartはじめよう (2015/07/31)
  • comments powered by Disqus
    このエントリーをはてなブックマークに追加