自分はサーバープロビジョニングといえば、AWS上の本番・ステージング・共有開発機もろもろインフラチームにまかせっきりだった。しかしアプリエンジニアがローカル開発環境を作る用途ならChefやPuppetよりもAnsibleがマッチしていると思った次第。
インフラチーム管理下のサーバーにおいてPuppetマニフェストで管理されている部分はアプリケーションエンジニアは触れないため、変更を加えたい場合は都度依頼を出している。
結果、作成が必要だったのは対象のサーバーを指定するファイルとレシピに相当するyamlファイル、コピーして配置する用の設定ファイル(httpd.conf等)だけで済んだ。至って簡潔。しかも対象サーバーにPython 2.4以上さえ入っていれば使える。
リポジトリには起動用のMakefileとREADMEを追加してコミットしておけば良い。
ちなみに、本エントリの例題構成をプロビジョニングするAnsibleのPlaybookは次の通りになった。わかりやすい。
背景
自分の職場だと、インフラチームは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