2014-06-30

アプリケーションエンジニアとサーバープロビジョニングツール

自分はサーバープロビジョニングといえば、AWS上の本番・ステージング・共有開発機もろもろインフラチームにまかせっきりだった。しかしアプリエンジニアがローカル開発環境を作る用途ならChefやPuppetよりもAnsibleがマッチしていると思った次第。

背景

自分の職場だと、インフラチームはPuppetのマニフェストでサーバーを管理している、例えばサーバーにインストールするパッケージ やApacheの設定である。しかし、そのPuppetマニフェストはアプリエンジニアのローカルの環境を構築する用途としてそのまま使えない。

インフラチーム管理下のサーバーにおいてPuppetマニフェストで管理されている部分はアプリケーションエンジニアは触れないため、変更を加えたい場合は都度依頼を出している。

共有開発サーバーとローカル個人環境

例えばApacheとfluentdとElasticsearchはインフラチームが管理しており、KibanaでApacheログが見れるとしよう。Kibanaに思った通りのグラフが出せない時、自由にできる環境がなければどこをいじれば良いのか試行錯誤すらできない。必然的に共有開発サーバーではなく、個人環境が欲しくなる。

Ansibleを使ってみる

ここで欲しいのは、Apacheログがfluentdに回収されてElasticsearchに放りこまれてKibanaで見られる環境をコマンド一発で作れる何かである。Chefでも良かったが、もっと気軽に使える物は無いかとAnsibleを試してみた。

結果、作成が必要だったのは対象のサーバーを指定するファイルとレシピに相当するyamlファイル、コピーして配置する用の設定ファイル(httpd.conf等)だけで済んだ。至って簡潔。しかも対象サーバーにPython 2.4以上さえ入っていれば使える。

リポジトリには起動用のMakefileとREADMEを追加してコミットしておけば良い。

サーバープロビジョニングツールについて

インフラチームが使う高機能な物と、アプリケーションチームが使う簡易な物、それぞれ別の物が流行ると思う。少なくともChefは二度使った経験からすると、使い方とレシピの書き方を思い出すのが面倒すぎる。

ちなみに、本エントリの例題構成をプロビジョニングするAnsibleのPlaybookは次の通りになった。わかりやすい。
- hosts: webserver
  user: vagrant
  sudo: yes
  tasks:
    # Apache
    - name: Install apache
      apt: name=apache2 update_cache=yes
    - name: Copy /etc/apache2/apache2.conf
      copy: src=./settings/apache/apache2.conf dest=/etc/apache2/
    - name: Restart apache
      service: name=apache2 state=restarted

    # Elasticsearch
    - name: Get apt key for elasticsearch
      apt_key: url=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
    - name: Add apt repository
      apt_repository: repo='deb http://packages.elasticsearch.org/elasticsearch/1.1/debian stable main'
    - name: Install JDK
      apt: name=openjdk-7-jre-headless update_cache=yes
    - name: Install elasticsearch
      apt: name=elasticsearch update_cache=yes

    # Elasticsearch Plugins
    - name: Remove elasticsearch-head
      command: /usr/share/elasticsearch/bin/plugin --remove mobz/elasticsearch-head
    - name: Install elasticsearch-head
      command: /usr/share/elasticsearch/bin/plugin --install mobz/elasticsearch-head
    - name: Remove elasticsearch-kibana
      command: /usr/share/elasticsearch/bin/plugin --remove elasticsearch/kibana3
    - name: Install elasticsearch-kibana
      command: /usr/share/elasticsearch/bin/plugin -url http://download.elasticsearch.org/kibana/kibana/kibana-latest.zip --install elasticsearch/kibana3

    - name: Restart elasticsearch
      service: name=elasticsearch state=restarted

    # td-agent
    - name: Get apt key for treasure-data
      apt_key: url=http://packages.treasure-data.com/debian/RPM-GPG-KEY-td-agent
    - name: Add apt repository
      apt_repository: repo='deb http://packages.treasure-data.com/precise/ precise contrib'
    - name: Install td-agent
      apt: name=td-agent update_cache=yes

    - name: Install libcurl-dev
      apt: name=libcurl4-openssl-dev update_cache=yes
    - name: Install plugin
      command: /usr/lib/fluent/ruby/bin/fluent-gem install fluent-plugin-elasticsearch

    - name: Copy td-agent.conf
      copy: src=./settings/td-agent/td-agent.conf dest=/etc/td-agent/
    - name: Restart td-agent
      service: name=td-agent state=restarted

まとめ

Ansibleはアプリエンジニアに向いている、というのと。以前、@voluntasの人に「御社はAnsibleやDockerを使って開発環境を作れるようにしてないんですか?」とつっこまれたのだが、これからはちゃんとできそうだ。

このエントリーをはてなブックマークに追加