開発ツールの変遷あれこれ


DSS で開発を始めて、早2年半。

Scala を開発技術の軸に据えていることは創業以来変わりないですが、
その周辺のツールは色々変わりました。

Dev

  • ソースコード管理: GitLab => GitHub プライベートリポジトリ
  • ドキュメント管理: GitLab => (Sphinx) => GitHub docs専用リポジトリ + wiki
  • タスク管理: Redmine => GitHub Issue + Waffle.io
  • CI: Jenkins => CircleCI
  • デプロイ: (Capistrano) => Fabric => Ansible + sbt-art
  • DWH: Hadoop(HBase/Hive) => Amazon Redshift
  • 単体テスト: Specs2 => ScalaTest + ScalaCheck

Ops

  • チャット: IP Messenger => IRC => HipChat (+ Slack) + Hubot
  • 監視: Nagios => Zabbix => Amazon CloudWatch + Grafana + 自作ツール

こうして見ると、オンプレミスから着実に AWS + SaaS 構成に移行しています。
CircleCI はまだ始めたばかりなので、これからノウハウを溜めていく予定。

あ、そういえばこんなスライドも作りました。

チーム開発での最優先事項はツールであるという言葉もありますし、
今後もより良いものがあれば積極的に取り入れていきたいですね。

不思議の国のAnsible – 第4話


 
logo


不思議の国のAnsible1

第4話 全ては脚本のままに

 

前回より続く

 

はじめての playbook

 


アリスは レベルが上がった!

コマンド ansible-playbook を手に入れた!
モジュール yum をおぼえた!


icon_bob01よしっ、それでは早速 playbook を書いていこう!
icon_alice01はい! お願いします!
icon_bob01と、その前に……以前 ansible コマンドを実行したとき
SSH接続のための鍵の設定をしたのを覚えてる?
icon_alice01はい。
icon_bob01実は、鍵の設定を Ansible の hosts ファイルに書いておくこともできる。
こうすれば playbook を実行するときにもその鍵を使ってログインできるんだ。

/etc/ansible/hosts

icon_bob01このように、ansible_ssh_user と ansible_ssh_private_key_file を指定しておこう。
icon_alice01はい。できました。

icon_alice01ちゃんとつながりますね。
icon_bob01よし、ではこのような YAML ファイルを作ってみよう。
04-01.yml

icon_alice01たったこれだけですか?
icon_bob01うん。playbook として必要な最低要素はこれだけなんだ。

まず最上位にシーケンスを作って、その中にマッピングを書く。
マッピングには hosts と tasks という 2つの名前が定義されているね。

hosts には値を文字列として書いて、
tasks にはさらに内部にシーケンス書く。そのシーケンスの中身が、ping という名前のマッピングだね。

icon_alice01きちんと YAML のフォーマットに沿っていますね。
icon_bob01hosts の箇所には、どのサーバに対して処理を行うかを書く。
今回は all と書いてあるので、さっき書いた Ansible の hosts ファイル中に登録されている全てのサーバが対象となる。

tasks には、実行すべきモジュールとそのパラメータをシーケンスとして書くんだけど
ping モジュールはパラメータを必要としないので、値は空になっている。

tasks の直下のシーケンス一個一個がそれぞれタスクとして認識されるんだ。

icon_alice01Python で構造をチェックしてみますね。

icon_alice01ping に対応する部分には None が入るんですね。

それでは、実行してみましょうか。

icon_bob01ちょっと待って。その前に構文チェックをしてみよう。

環境によっては以下のようなメッセージが表示されることがあります。
これは EPEL のビルド済みパッケージのバージョンが原因で表示される警告であり、対応するライブラリ(gmp)を更新すれば解消されます。

Ansible の動作上は問題ないのでメッセージは無視して構いません。

icon_bob01このように表示されればOKだ。

icon_alice01大丈夫でした!
icon_bob01ちなみに、例えば hosts を書き忘れるとこんな感じになる。

icon_alice01書き間違いにすぐ気づけるのは便利ですね。
icon_bob01–list-hosts や –list-tasks も、事前に情報を確認するための便利オプションだ。

icon_bob01では playbook を実行してみよう。ansible-playbook コマンドのパラメータとして YAML ファイルのパスを渡すだけでいい。

icon_alice01ok と結果が返ってきましたね。
icon_bob01おめでとう!
ちなみに -v オプションを付けると、詳細な情報を表示できる。
-vv , -vvv まで 3段階で詳細度を変えられるよ。


 

playbook を繰り返し実行する

 

icon_bob01次は、新しく覚えたモジュール yum を使ってみよう。
icon_alice01はい。
icon_bob01これは、その名の通り yum コマンドを ansible で実行するためのモジュールなんだ。
icon_alice01ansible-doc で使い方を調べると、具体的な使用例が出てきました。

icon_bob01だいぶ慣れてきたようだね。
今回はそうだな……Webサーバの Nginx2をインストールしてみようか。
icon_alice01あ、はい。Nginx は使ったことがありますっ!
icon_bob01標準リポジトリにはないので、まずは EPEL リポジトリをインストールして、
その後で Nginx をインストールする YAML ファイルを書くよ。
icon_alice01わかりました。
icon_bob01ping モジュールの時と同じように tasks の下のシーケンスに yum と書いて、値にこんなふうに書いてみよう。
04-02.yml

このように パラメータ=設定値 という形式で書くことで、Ansible の中でモジュールのオプションを指定することができるんだ。

icon_alice01なるほど。name に指定するのは URL でもパッケージ名でもいいんですね。
icon_bob01その通り。
icon_alice01state=present というのはどういう意味ですか?
icon_bob01パッケージがインストールされていなかったら最新版をインストールして、
既にインストールされていたら何もしないという意味だよ。

他のオプションとしては、常に最新版をインストールする state=latest、
パッケージを削除するための state=absent がある。

icon_alice01では実行してみますね。一応構文チェックもやってみます。

icon_alice01あら、エラーになってしまったみたいです。
icon_bob01あ、そうだ、yum コマンドの実行には root 権限が必要だったんだ。

こんなふうに sudo: True という項目をマッピングに追加すれば、サーバ上の全てのコマンドを sudo 付きで実行してくれるよ。

icon_alice01はい。
icon_bob01そうそう、ansible-playbook には –check というオプションもある。

実際の変更を一切行わずに、どのような挙動が起こるかをあらかじめチェックできるんだ。

icon_alice01やってみます!

icon_alice011個エラーになってしまいました。
icon_bob01メッセージをよく見てごらん。
‘nginx’ というパッケージが見つからなかったみたいだけど、まだ EPEL をインストールしていない状態なのでこれは仕方ないんだ。

他は大丈夫そうだね。では本番、実行してみよう。

icon_alice01はい。

icon_alice01うまくいったみたいです!
changed=2 というのが 2つのパッケージのインストールが成功したという意味でしょうか。
icon_bob01ためしにもう一度、同じコマンドを実行してごらん。

icon_alice01今度は changed=0 になりました。
TASK の下の行も changed から ok に変わりましたね。
icon_bob011回目はまだインストールされていない状態なので、インストール処理、つまり変更が行われた。
それが成功したので「changed」と表示されたんだ。
2回目は既にインストール済みで、それが正しい状態であるので変更は行われず、
「ok」とされた。

こんなふうに、何回やっても状態が変わらないから、playbook を繰り返し実行しても安心なんだ。

icon_alice01なるほど。
icon_bob01実際に Nginx がインストールされたか確かめてみる?

icon_alice01ちゃんと、EPEL 経由で Nginx がインストールされています。
icon_bob01よかった。これで一安心だ。
あと、細かいところだけど表示されるタスクの表示名は、YAMLファイルで
こんなふうに指定することもできる。
04-03.yml

icon_alice01動かしてみます。

icon_alice01表示がだいぶスッキリしました……
ほんと、同じタスクを何度も動かせるのはいいですね。
icon_bob01「今どこまでやったっけ」ということを気にする必要がないからね。
特に、前回の作業から一定の期間が空いていたりするサーバだと、ありがたみが倍増する。
icon_alice01Ansible の世界の心地よさがちょっとだけ分かった気がします。
これから、playbook の使い方やモジュールをもっと覚えていきたいです。
icon_bob01Ansible の構成はすごくシンプルだから、アリスならきっとすぐにマスターできるよ!
icon_alice01ありがとうございます!

満足感に包まれたアリスは眩しい光に包まれていく。
するとアリスはこの不思議な夢から覚めて、日常の世界へと戻っていた。

次回へつづく

 
最後までお読みいただき、どうもありがとうございました。


  1. 画像素材 http://kage-design.com/wp/ []
  2. http://nginx.org/ja/ []

不思議の国のAnsible – 第3話


 
logo


不思議の国のAnsible1

第3話 脚本のつくりかた

 

前回より続く

 

YAML Ain’t Markup Language

 

icon_alice01でもこうやってコマンドを実行できるのは確かに便利ですけど、
手で作業するのとあんまり変わらないような気もします……
icon_bob01うん、実はサーバの構築や運用にあたって ansible コマンドを直接実行
する場面はほとんどない。
Ansible では あるべき状態をファイルに記述して、それを実行するという
スタイルが普通なんだ。

icon_bob01ところでアリス、きみは普段の仕事でメモを取っているかい?
icon_alice01ええ。メモアプリ使ったり、手書きでノートに書いたり……とか色々ですけど、なるべく書くようにはしていますね。

『自分の行動を記録する(ログる)のがインフラエンジニアの基本』ですから。
(先輩の受け売りだけど……)

icon_bob01いい心がけだね。
もしそのメモが自動的に動き出したら、素敵じゃない?
icon_alice01えっ? そんなこと、あるわけないですよ……
icon_bob01その動かせるメモが playbook なんだ。
icon_alice01動かせる……なるほど! 勝手に働いてくれる手順書みたいなものですかね。
icon_bob01最初はメモだったものも、積み重ねるとやがて壮大な脚本になっていく。
とはいえ千里の道も一歩から。まずはフォーマットを覚えることからはじめよう。
icon_bob01playbook は、YAML2と呼ばれる形式で書く必要がある。
icon_alice01わいえーえむえる? XML の仲間でしょうか?
icon_bob01さすが鋭いね。XML や JSON のような構造化されたデータの記述方式の一つなんだけど、シンプルで人が読みやすいという特徴がある。
ちなみに「やむる」と読むのが一般的かな。
icon_alice01何の略なんですか?
icon_bob01YAML Ain’t Markup Language。
直訳すると「YAMLはマークアップ言語ではない」となる。
icon_alice01……って、あれ? 説明自体に略称が含まれていますね……結局 YAML の Y って何なのでしょう?
icon_bob01ははは、これはある種の言葉遊びだから 3、そんなに深く考えなくていいさ。
icon_bob01さて、本題に戻ると……
YAML の書き方を覚えて、playbook を書けるようになろう。
ポイントはそんなに多くないけどね。
icon_alice01はい、がんばります!
icon_bob01まずファイルの先頭の行にハイフン(-)を3つ書く。
これが、ここから YAML 文書の記述が始まる、という合図になる。

icon_alice01はい。
icon_bob01次に、シーケンスの書き方。
他のプログラミング言語で配列とかリストとか呼ばれる概念に近いけど、同じ階層の要素を順番に並べて書くときに使う。
行の先頭にハイフン(“-”)と半角スペース(” “)を書いて、その後に続けて内容を書くよ。
03-01.yml

icon_alice01はい。ファイルを作って書いてみました。何か確認する方法はあるのでしょうか?
icon_bob01やり方は色々あるけど……
そうさね、たとえば Python を使って YAML を読み込んでみよう。
さっきの内容を 03-01.yml として保存してこんなコマンドを打てば
Python のオブジェクトとして解釈された内容が表示される。
そうそう、ファイルの拡張子は “.yml” を使うといいよ。

icon_alice01やった! うまくいきました。
icon_bob01内容をシングルクォーテーション(‘)やダブルクオーテーション(“)で囲むと、
内部的に文字列として扱われるようになる。
今回はもともと文字列なので、同じ結果になるね。
03-02.yml

icon_bob01シーケンスの値として、中にシーケンスを入れることもできるよ。
03-03.yml

icon_bob01この場合、インデントの位置によって階層が決まっていくんだ。
インデントはスペース2個にすることが多いね。
icon_alice01あれっ? 何だかエラーが出てしまったみたいです。

icon_bob01アリス、作ったファイルを見せてくれるかい?
icon_alice01あ、はい。これなんですけど……
03-04.yml (フォーマットエラー)

icon_bob01フムフム。ファイルをよく見てごらん、一箇所インデントがずれているところがあるよ。
icon_alice01ほんとだ…… b2の部分ですね。ハイフンの前のスペースが1個足りませんでした。
icon_bob01このように、YAML ではインデントの位置が厳しくチェックされる。
インデントとしてタブ文字を使ってもエラーになるから注意してね。
icon_bob01次はマッピングを使ってみよう。
マッピングというのは、要は名前と値の組み合わせで、他のプログラミング言語におけるハッシュマップとかマップ、ディクショナリ、キーバリューペアと呼ばれる概念に対応するものだ。

まぁ例を見せたほうが早いか。こんな感じで、名前と値をコロンで区切って記述するよ。

03-05.yml

icon_alice01表示される順番が変わりましたね。
icon_bob01うん、マッピングの場合、値にアクセスする時にはその名前(キー)だけが手がかりになる。
書いた順番は評価されないんだ。

逆に、同じ名前(キー)を同じ階層で複数書くと正しく認識されない4 ので気をつけよう。

icon_alice01はい。
icon_bob01シーケンスとマッピングを組み合わせると、こんなふうに構造化されたデータが作れる。
03-06.yml

icon_alice01直感的で分かりやすいですね!
icon_bob01シーケンスとマッピングの書き方さえ覚えれば、もう YAML はほとんどマスターしたようなもんさ。

そうそう、さっきのファイルだけど、True や False というキーワードは
文字列でなくて真偽値(ブール値)として評価されている。このようなキーワードは他にもあるんだ。

プログラムでどのように評価されているか、注意深くみてほしい。

03-07.yml

icon_alice01なるほど。よくわかりました。
icon_bob01# で始まる行はコメントとして扱われ、実際のデータとしては見なされない。
行の途中でコメントを書くこともできる。これは Shell Script や Python と同じだね。
03-08.yml

icon_alice01ちなみに、複数行にまたがる文章をデータとして登録することはできるのですか?
icon_bob01もちろん可能さ。改行を含んだ文章を書くときは、その要素の先頭の行にこんな風に
縦棒(パイプ)を書けばいい。
03-09.yml

icon_bob01\n というのが改行を意味しているよ。
YAMLファイルの 3行目以降、インデントを揃えることに注意してね。
icon_alice01ありがとうございます。
だいたい YAML の書き方をイメージできるようになりました。
icon_bob01素晴らしい! どうやらまたレベルアップしたみたいだね。


アリスは レベルが上がった!

コマンド ansible-playbook を手に入れた!
モジュール yum をおぼえた!


icon_bob01よしっ、それでは早速 playbook を書いていこう!

次回へつづく

 
最後までお読みいただき、どうもありがとうございました。


  1. 画像素材 http://kage-design.com/wp/ []
  2. The Official YAML Web Site []
  3. 再帰的頭字語 – Wikipedia []
  4. あとに書いたもので上書きされる []

不思議の国のAnsible – 第2話


 
logo


不思議の国のAnsible1

第2話 忠実な兵士たち

 

前回より続く

 

はじめての Ansible コマンド


アリスは レベルが上がった!

コマンド ansible を手に入れた!
コマンド ansible-doc を手に入れた!
モジュール ping をおぼえた!

icon_bob01おめでとうアリス!
新しいコマンドとモジュールを手に入れたみたいだね。
icon_alice01コマンドは、OS から実行可能なコマンドという意味ですよね?
モジュールっていうのは、コマンドとは違うんですか?
icon_bob01モジュールっていうのは、Ansible の言葉なんだけど
管理対象サーバ上でどんな仕事をするのか、その命令の種類だと考えればいい。

Ansible では標準で 200以上のモジュールが用意されているし、
必要であれば2自由に拡張することもできる。

icon_alice01よく使う手順のパターンがまとまっている感じですかね。
icon_bob01その通り。ではまず手始めに ping というモジュールを使ってみよう。
icon_alice01ネットワークコマンドの ping とは別物なんですね。
icon_bob01うん、これはネットワークの疎通だけではなくて、Ansible のサービス階層で
対象サーバが利用可能な状態にあるかどうかをチェックできるんだ。
icon_alice01使い方を教えてください!
icon_bob01ansible というコマンドで、実際に管理対象サーバに命令を送ることができる。
書式は ansible 対象サーバのIPアドレス -m ping だよ。

アリスは、この不思議な世界でコマンドを頭に思い浮かべる。
するとどこからともなく奇妙な兵士が現れた。トランプの胴体にハート型の槍を携えている。

icon_alice01コマンド実行!

アリスがコマンドを唱えると、トランプ兵はそそくさとどこかへ帰ってしまった。

icon_alice01あれ? なんだかうまくいっていないみたいです。
icon_bob01あ、そうだった。Ansible では安全のため、あらかじめ指定したサーバ以外には
接続しないようになっている。
それを管理しているのが /etc/ansible/hosts というファイル3なんだけど、
このように、接続先の 192.168.100.12 という1行に書き換えてごらん。

元々書かれている内容は、全部削除して構わないよ。

icon_alice01できました。それでは気を取り直して……

またまた、どこかからトランプ兵が現れる。
今度は管理対象サーバへ繋がる扉の前4まで一目散へ駆け出していった。
ところが押しても引いてもドアが開かず、結局諦めて帰っていった。

icon_alice01あらら、まだダメみたいですね。
icon_bob01今度は SSH の認証に失敗したようだ。
君の秘密鍵は、実はココ (~/.ssh/alice.pem) に隠してある。
それを指定してみよう。
ansible コマンドに –private-key というオプションを付け加えるよ。

三たび現れたトランプ兵は、今度はアリスの目の前に駆けつける。
アリスがトランプ兵に扉の鍵を渡すと、うやうやしく敬礼して扉のもとへ。
今回は無事、扉を開けられたようだ。
程なく戻ってきたトランプ兵はアリスの元へ駆け寄り、「pong」と叫んで報告する。

icon_alice01うまくいきました!
icon_bob01Ansible の出力は、だいたいこんな感じになる。
FAILED の部分が success に変わって、付随する情報が出力されているね。

ちなみに、毎回秘密鍵を指定するのが面倒なら、こんな風に ssh-agent に登録しておくといいよ。

icon_alice01こっちのほうが後々楽になりそうです。
icon_bob01それと、IPアドレスの代わりに all と指定すれば
/etc/ansible/hosts ファイルに書かれた全てのサーバに対して
処理が実行される。
今はまだ管理対象サーバが1つしかないから、挙動は変わらないけどね。

icon_alice01all ですね。覚えておきます。

ドキュメントの参照

 

icon_alice01ところで、ansible-doc ってコマンドもありましたけど、使ってみていいですか?
icon_bob01もちろんだよ!
これはヘルプ用のコマンドで、ansible-doc モジュール名 と実行すれば説明や
使用例をすぐに参照できる。

icon_alice01英語ですけど、なんとなくわかるような、わからないような……
でも使用例が載っているのはありがたいですね。
モジュールの使い方を忘れてしまった時なんかに重宝しそうです。
icon_bob01もちろん、Ansible 公式ドキュメント も素晴らしく充実していて使いやすいよ。

さまざまな実行オプション

 

icon_bob01ansible コマンドの方にもまだまだ色んなオプションがあって……
そうだな、例えば-a オプションを使えば、管理されるサーバ側で
好きなコマンドを実行することができる。

icon_bob01--sudo オプションを使えば、管理対象サーバで root 権限が必要な作業もお手のものさ。

icon_alice01コマンド一つでいろんな事ができるんですね。すごい!
icon_bob01まだまだ、こんなのは序の口。でも雰囲気は掴めたんじゃないかな。
icon_alice01はい。おかげさまで。
私が指示したとおりに、忠実に働いてくれるんですね。
icon_bob01そこが Ansible を使う価値さ。
icon_alice01でもこうやってコマンドを実行できるのは確かに便利ですけど、
手で作業するのとあんまり変わらないような気もします……
icon_bob01うん、実はサーバの構築や運用にあたって ansible コマンドを直接実行
する場面はほとんどない。
Ansible では あるべき状態をファイルに記述して、それを実行するという
スタイルが普通なんだ。

それは、この世界では playbook と呼ばれている。
少し休憩したら、次はその話をしようか。

 

次回へつづく

 
最後までお読みいただき、どうもありがとうございました。


  1. 画像素材 http://kage-design.com/wp/ []
  2. ほとんどの場合は独自のモジュールを作らなくても事足りる []
  3. 正確に言えば、デフォルトの参照先の1つ []
  4. 第1章を参照 []

不思議の国のAnsible – 第1話


DSS技術ブログへようこそ!

突然ですが、みなさんは Ansible (アンシブル) という構成管理ツールをご存知でしょうか?
これから何回かに分けて1 Ansible の紹介記事を書いていきたいと思います。

 

新しいツールについて学ぶとき、実際に手を動かすことは理解の助けになります。

この連載では、主に構成管理ツールや Ansible をまだ使ったことのない方たちに向けて
ストーリーチュートリアル で追体験ができるような内容をお届けすることを
目指しています。

今回はその一回目。いわゆるイントロダクションです。

 

 

logo


不思議の国のAnsible2

第1話 インフラの落とし穴にはまって

 

なぜ Ansible を使うのか

 

都内某所のWeb系企業、オフィスの片隅で REALFORCE3 の静電容量無接点方式キーボードを
小気味よく奏でて複数のターミナルを縦横に操り Linux サーバ4を管理している彼女の名は
有渋 瑠子(ありしぶ るこ)。 小さい頃からあだ名はずっとアリスなんだとか。

社会人2年目の彼女は、インフラエンジニアとしてシステムの安定稼働や新技術習得のために
日夜奮闘している。今流行の『インフラ女子』だ。

そんな彼女も今日は休日。
昼下がり、陽気に誘われ眠りに落ちてしまった彼女は不思議な夢を見る。
物語は、その夢の中の奇妙な出会いで幕を開ける。

 

icon_alice_01
なんだか、すごい所に来てしまったのね……

彼女がそう呟くのも無理はない。
まるでどこか別の惑星にいるかのような錯覚にアリスは捕らわれていた。

地平線の彼方まで果てなく続く荒野。土の匂い。
疲れきって小さなオアシスで佇んでいると、草むらから時折ニシキヘビが顔を出す。

目に映る風景が自分の空虚な心を映し出しているようにも感じて、一抹の寂しさが不意に彼女を包む。

icon_alice_01
ここにいるのは私だけなのかしら。

そう思った矢先、背後から人の声が聞こえた。

icon_bob_00
ようこそ、アリス!
Infrastructure as Code (インフラストラクチャー・アズ・コード) の世界へ!

アリスはびっくりして振り返る。
するとそこにはチェック柄のベストを着飾った一匹のウサギの姿があった。

icon_alice_01
ひょっとして、今しゃべったのは、あなた?

アリスはウサギに向かって話しかけた。

icon_bob_02
……ここは、君がつくる世界。

ウサギは構わず語り続ける。
アリスの予想が確信に変わる。

icon_bob_02
この世界は、君の言葉でできている。
君が望むものは、全て君自身で手に入れることができる。
icon_alice_01
……ねぇねぇ、ウサギさん? ここはどこなのかしら?
icon_bob_02
コマンドを……コマンドを強く念じればいい。

『コマンド』。そう言われたアリスは、無意識のうちに使い慣れている Linuxコマンドをいくつか
思い浮かべた。

icon_alice_01
w……uname -a……ps aux……pwd……

すると、アリスの脳裏に矢継ぎ早に情報が流れ込んでくる。
アリスは今自分が置かれている状況を悟った。

icon_alice_01
ひょっとして、ここはサーバの中?
icon_bob_02
ご名答。僕の名前はわかる?
icon_alice_01えっと、こういう時はwhoコマンドを使って……あ、出てきた。

bob     pts/0     2014-05-15 01:23 (1.1.1.1)……
もしかすると……ボブ……さん?

icon_bob_01素晴らしい!
まあ本名はベキトーセイ・オジサン・ボブっていうんだけど
略してボブ(BOB)で構わない。
icon_alice_01
ベキトセイ? 変わったお名前ね……
私は有渋です。よろしくお願いします。
icon_bob_01
こちらこそ。よろしく。

そう言ってボブはペコリと頭を下げた。

icon_bob_01
ところで、さっきまでなんだか浮かない顔をしてたよね?
icon_alice_01
えっ!? そ、そうですか?
icon_bob_01
何かあったの?
icon_alice_01
何ってほどじゃないんですけど、昨日仕事でミスをしてしまって……
icon_bob_01
そうなんだ、その話、もしよかったら聞かせてくれないかな?

アリスにとって、なぜかボブが会って間もない他人とは思えなかった。
この人(ウサギ?)になら全部話してもいいような気がしていたから。

icon_alice_01私はただ、会社のアプリ部門からの依頼を受けて
本番環境の/etc/hostsファイルを書き換えただけなんです。
そしたら突然サービスが動かなくなっちゃって。
icon_bob_01
本番サービスダウンか。穏やかじゃないね。
icon_alice_01私は指示通り、前回作業した時のファイルに新しいホストを追加して、
そのファイルをコピーしただけなんですよ。
icon_bob_01
うんうん、それで原因は何だったの?
icon_alice_01後になって分かったんですが、
数日前に先輩が/etc/hostsファイルを書き換えていたんです。
データベースの参照先が変わっていたらしいんですけど
私は全っ然、聞いていませんでした。

icon_bob_01
それで、その部分が先祖返り5してしまった、と。
icon_alice_01はい、幸いすぐ気づいた先輩が直してくれましたけど。
でも、私のスキルが足りないせいで……はぁ。
icon_bob_01はは……
たしかにもう少し確認手順を増やせばトラブルは回避できたかもしれない。
でも作業ミスやコミュニケーション・ミスは誰にでも起こりうる。
誰かが悪いってことは絶対にないよ。
icon_alice_01
……ありがとうございます。ちょっと気持ち、楽になりました。
icon_bob_01
ところで、構成管理ツールは使っていないのかな?
icon_alice_01構成管理? たとえば、どういうものですか?
OSやミドルウェアのバージョンなんかは、Excelで台帳作って管理してます。
icon_bob_01構成管理ツール……Configuration Manager とか Orchestrator とか言ったりもするけど、これらは、サーバのOSやミドルウェアに対して、あるべき姿を定義したり定例的な作業を登録しておくことで作業を効率化・短時間化したり、人的ミスが起きるリスクを減らしたりすることを目的としたツールの総称なんだ。

現時点で主要な構成管理ツールを比較するとこんな感じになる。6

主要な構成管理ツールの比較

 
開発元Puppet LabsOpscodeSaltStackAnsibleWorks
登場2005年2009年2011年2012年
プログラミング言語RubyRuby (クライアント)
Erlang (サーバ)
PythonPython
導入実績
情報量
スケーラビリティ
共有リポジトリ
Puppet Forge

Opscode Community

Ansible Galaxy
2014年5月時点ではまだベータ版
Web UI
Ansible Tower
定義ファイル独自DSL独自DSL (Rubyベース)YAML
独自DSL (Pythonベース)
YAML
エージェントのインストール不要
シンプルさ
(学習・運用コストの低さ)
icon_alice_01色々あるんですね。
でも新しいツールを導入するとなると、メンバーみんなが使いこなせるか
心配です。

icon_bob_01そこでオススメしたいのが Ansible なんだ。
Ansible はエージェントのインストールが要らないし、何よりそのシンプルさの
おかげで、使いはじめるまでのコストがほとんどかからない。
icon_alice_01
エージェントというのは?
icon_bob_01このような構成管理ツールは、大抵『管理する側』と『管理される側』の 2種類のコンポーネントから成り立っている。
エージェントというのは、『管理される側』のサーバ上で動く常駐プロセス、と
考えればいいよ。
icon_alice_01なるほどー。
ちなみに、実績や情報量では Chef のほうが優れているんですか?
icon_bob_01Puppet や Chef は何年も前から使われているし、膨大なノウハウが溜まっているのは確かだね。
それでも近年、Ansible のシンプルさに共鳴した人たちが世界中で急速に増えている7のも事実。

あの Demand Side Science も標準の構成管理ツールとして採用しているんだよ。

icon_alice_01
へぇ、DSSも Ansible 使ってるんだ……
icon_bob_01後発の強みもあるし、動作は非常に安定している。信頼できるツールだと思うよ。
特に、管理するサーバ台数がそこそこ多くて、それに携わるエンジニアが少ない場合に適しているかな。
100〜200台程度のサーバ環境を、1人か2人で管理してるって話もよく聞くなぁ。
icon_alice_01
なんだか面白そう! どこかに試せる環境があるといいんだけど……
icon_bob_01その言葉を待っていたよ、アリス!
実は、もう環境を用意しておいたんだ!

 

Ansible のインストール

 

アリスと一緒に、実際に手を動かしてAnsibleの世界を体験しましょう!

こちらのドキュメントに VirtualBox を使って検証用の仮想マシン
(CentOS 6.5) を立ち上げる手順を記載しました。
ぜひセットアップを行い、アリスと同じ目線に立ってみてください。
次回以降の連載でも、この環境を引き続き使っていく予定です。

icon_bob_01
あの向こう、ヤシの木の間に、大きなドアがあるのが見えるかい?
icon_alice_01
あ……はい。扉に 192.168.100.12 って書いてありますね。
icon_bob_01あそこが僕らの目指す場所さ。
あの扉の先の世界を、僕らは Ansible で作りたい。

便宜的に、僕らが今いるサーバを an11
Ansible の管理対象とするサーバを an12 と呼ぶと
僕らを取り巻く環境はこんな感じになっているはずだ。

ネットワーク構成図

icon_alice_01
この世界 (an11) の中から Ansible を使って、扉の向こう (an12) を管理するんですね。
icon_bob_01その通り。でもその前に、まずは an12 にログインできるか確認してみよう。
扉の前で、sshコマンドを念じるんだ。IPアドレスを直接指定してね。
ちなみにあらかじめ、鍵は開けておいてある。
icon_alice_01
はい。わかりました。

icon_alice_01
known_hosts に追加して……と、an12 に入れました。
icon_bob_01
アリスには sudo 権限も付けている。試してみて。

icon_alice_01
OKです!
icon_bob_01
君はこの世界を作り替える力を持っているってこと、わかったかな?
よし、それでは一旦 an11 に帰ろう。

icon_bob_01
Ansible のインストールの方法はいくつかある8けど、今回はEPELリポジトリのRPMを yum コマンドでインストールすることにするよ。
icon_alice_01
はいっ! EPELの追加はやったことがあります。

icon_bob_01
パーフェクト! その調子で ansible をインストールしてみよう。

icon_alice_01
終わりました。
icon_bob_01
よし! これで Ansible の実行に必要な準備は整った。
icon_alice_01
えっ? an12 側での作業はもう必要ないんですか?
icon_bob_01最初に話したとおり、Ansible はエージェントインストールの必要がない。
SSH でログインできる環境であれば、ただそれだけで構成管理の対象にすることができる9んだ。
icon_alice_01
あ、そうでした! たしかにこれは楽ですね。

パンパカパ〜ン!
突如、辺りにファンファーレが鳴り響く。

アリスは レベルが上がった!

コマンド ansible を手に入れた!
コマンド ansible-doc を手に入れた!
モジュール ping をおぼえた!

icon_alice_01
えっ? えっ!? これは…
icon_bob_01おめでとうアリス!
この世界ではこうやって Ansible の経験を積むごとにレベルが上がっていくんだ。
そのたびに、新しいコマンドやスキルを手に入れることができるよ。
icon_alice_01
そうなんですか……はぁ、びっくりしました。
icon_bob_01
それじゃ、手に入れたコマンドをさっそく使ってみよう!

 

次回へつづく

 

最後までお読みいただき、どうもありがとうございました。


  1. 完全な見切り発車です……この先どうなるかは筆者自身もわかりません []
  2. 画像素材 http://kage-design.com/wp/ []
  3. 筆者愛用のキーボード http://www.topre.co.jp/products/elec/keyboards/ []
  4. 職場ではRedHat系を扱うことが多いみたい []
  5. データ更新の際に、何らかの理由で古いデータに巻き戻ってしまうこと []
  6. 出典:
    http://www.infoworld.com/d/data-center/review-puppet-vs-chef-vs-ansible-vs-salt-231308
    http://www.slideshare.net/TakeshiKomiya/python-26185953/18 []
  7. Ansible のトップページには、錚々たるグローバル企業のロゴが勢揃い []
  8. 詳細は公式ドキュメント参照 []
  9. 正確には、SSHの他に Python の実行環境があることも条件。使用するモジュールによっては、追加ライブラリのインストールも必要となる []