はやさがたりない。

へっぽこぷろぐらまのメモログ

Agile Japan 2014 いってきました(レポートというか個人めも)

Agile Japan 2014 レポートというか個人めも


とりあえず今あがってそうな資料まとめ

アジャイル入門
エンタープライズでもできるアジャイル開発
効果的に試行錯誤を行うための仕組みづくり〜失敗はおはやめに、プロダクトの成長は着実に〜


若干道に迷いながらも静岡から初参戦させていただきました。
一応、うちのプロジェクトではアジャイルな開発をしている。
アジャイルな開発」っていう言葉
これはどうかなーって思うところはあるけどニュアンスとしてとらえていただければ。

自分が思う今プロジェクトのよくないところ

もちろんいいところだってたくさんある。
でも、あんまりうまく回っていると思っていないのが本音。
うちは複数のプロジェクトがアジャイルな開発をしていて、
自分のチーム・他のチームを見ていてなんかおかしいだろーって思うこと。

本当にエンドユーザに喜ばれるものが作れているのか?

なんでかっていうとフィードバックを全く得られていないから。
あっても要望に答えられていない (本来、ここが一番大事なはずなんだが・・・)
フィードバックを得るための方法もできていない。

プロジェクト内のどれだけの人が本質を理解している・しようとしているか?

わりとトップダウン的にアジャイルに取り組んでいる。
なので本質を理解せずに、ただただ終わりがない苦しい開発って思ったりしている人もいるのかなと思う。
チームが楽しそうに開発してない、悲壮感が漂っている時を見るのはとてもやるせない。 エンドユーザに喜ばれるのも大事だけど、プロジェクトが楽しく仕事できるっていうのも同じくらい大事なはずなんだけどなぁ。
まぁまるで成長しない、しようとしない自分たち自身がよくないが。。

開発・開発・開発・・・

日々の開発に追われてチームの技術向上の取り組みができていない。提案ができていない。
月に数回リリースするのがやっとな状態であったり、環境構築に何日もかかったり。
こんなことを続けていたらあっという間に世の中の技術についていけなくなってしまう。
技術ってアジャイルと密接だと思っていて、いかにコンピューターに任せられるところを任せるかが大事。
確かに初期構築までは時間がかかるけど、それに見合った効果はある。
リリースするのにチャットで「デプロイしてちょ。」っていうだけになれば
プロジェクトはユーザーが心待ちにしている体験を提供することに注力することができる。
最近まであんまり気にしてなかったんだけど、
「チーム開発実践本」やら「github kaigi」やらを見ていて、世間の動向ヤバス。と感じた。

今回期待していったところ

そんなこんなで今回 agile japan 2014 では以下の事柄について勉強させていただきたく参加した訳です

  • チームビルディングのコツ、みんなで楽しく開発するために他社ではどんなことしているのか?
  • 他社のアジャイルな開発、って実際にはどんなことしているのだろう?
  • ・・・うち、技術的に遅れてる?

各セッションのまとめ

チュートリアル アジャイル入門〜オープニング

道に迷ったため、途中からの参加になりました。
内容は入門ーっって感じなので省略して、メモだけ。

  • チュートリアル
  • まず最初にとりくんでみるなら振り返りがおすすめ
    → その通りだとおも。振り返りの結果をどう積み上げていくかが難しい。。
  • 実践して行動でしめす
  • 「Social change statrs with you」
  • 質問タイム
  • 質問タイムの前に手を挙げる練習wこれは取り入れたいw
  • (質)アジャイルでやりたいけどどうやって上司に説明したらいいの?
    アジャイルという言葉を使わすに説明してみたらどうでしょう。
  • (質)まわりのひとを取り込んでいくにはどうしたらいいの?←質問させてもらいました
    Agile Japanにつれてきたらどうでしょう。
    → 回答をもらった直後は「うーん」って思ったけど、水野さんの基調講演を聞いたら確かにいいかもと思った。
    あれはYoutubeで動画を見るんじゃなくて、あの場で聞くことでより一層ココロオドルな。

  • オープニング

  • きっとスライドがあがるだろうと思って、数値系の話はメモしていない
  • 2013年の禅の話はちょっと面白かった 自分がその場にたったとき、自分が感じるものを大切にする

基調講演:ソフトウェア開発者に問う ~日本人のモノづくりの本質とは~

水野 和敏 氏(元日産GT-R開発の総責任者)の講演。
すみません、車に興味がないので知らなかったです。。。
写真だけみて「ちょっと怖そうな人か?」と思ったけど、すごいめちゃくちゃ優しい物腰のお方でした。

まずメモまとめ

  • 基調講演
  • GTRという車は「日本のモノづくり」、「日産のモノづくり」ではない
  • 権利はいらない、すべての責任をもらった
    部門ごと分けるから責任をなすりつけあってしまう
  • 女子サッカー日本代表の話 個の強さではな到底勝てないが、チームの強さが勝っている
    一人一人に役割を与えて、それぞれが海外などでその強さを成長させる
  • Raceを勝つために考えるとき「How to race」ではなく「What is race」で本質を考える
  • BigDataから傾向を見いだして、それぞれのチームに目標を設定する
    例えば、前回の大会優勝が6h32mで、これまでの傾向から0h02mタイムを減らせれば勝てると判断
    そして車チームには1m10sec,ドライバチームには30sec,ピットチームには40sec
    それぞれタイムを短くすることを目標にさせる
  • BigDataの分析結果、可視化したものは裁量や目標をみいだすためのマネジメントツール
  • Try and ErrorErrorはいらない、バカか!
    このErrorってのは行き当たりばったりの失敗のことかな?
    成功に着実に向かうための失敗を否定している訳ではないと感じた
  • 技術の進化が価格を下げる
  • 会社という枠にはいると「会社が〜」「部長が〜」「他部門が〜」という言い訳を始めてしまうが、バカか! 本来、社会的使命(What is)から職業を選んでいる。会社は手段(How to)でしかない
  • 工程の最上流にあるもの、それは「現場」
    現場が作れないものを設計してすごいだろっていっても全く意味がない。
    現場の技術力があがらないと設計レベルはあがらない
  • 未来というものは言葉じゃなくて画像
    言葉は過去を共有するためのコミュニケーションツール
    いきなり討論するな、一人で考えた結果を画像で共有する
  • 目標を言葉ではなく、シーンで共有することが大事 例えば、「最高時速300km」というものではなく、「海外の老夫婦が時速300kmで3時間走りながら会話を楽しむ」みたいな
  • 質問タイム
  • 趣味で仕事をするから価値観が変になる 仕事は人のため、人の喜びを共有する
    自分のために何かをしようと思うとアイデアはでてこないけど、人のためになにかしようと思うとアイデアは無限に出てくる 例えば、休日何しようかなーって思っても「疲れたから寝るかー」とかしか浮かばないけど
    恋人のために何しようかって考えると「レストランにつれていうか」「ショッピングにいこうか」などなど、どんどんでてくる
  • ペルソナの設定論議には時間をかけるべき
  • 最後に会場にむけて 会社の組織に埋もれるな、使命を果たせているのかが大事
    でも、ダメでもともとと思って気楽に。失敗しても雇用した会社が悪いんだから(笑

もーーーね、これを聞けただけでも今日は agile japan 2014 きてよかったと思えた。
アジャイルの様々なプラクティスに当てはまるモノがある。
ペルソナの設定、個人で様々な案を図にして発表する、個々に役割を与える、ユーザーストーリーとかとか。
プラクティスはこういうモノづくりの本質から生まれているんだな。
だから、ただそれを実践しているだけになっちゃだめだと深く反省させられた。

youtubeの動画で見てるよねっていくつかスキップしてしまった部分があるからそこは動画を見ておこうと思う。

マイクロソフトにおけるアジャイル開発の実践

他社を見るということでセッションを聴講させてもらいました。

メモ

  • 講演
  • CEOがかわったらしい。 Mobile / Cloud / Usage / Engineer にフォーカス
    Usage : いかに多くの人に使ってもらうか
  • VisualStudioOnlineのデモ
  • 2005 → 2008?のとき、過去の負債(5000件のバグ)を返済するために
    4ヶ月間のMQ(マイルストーンクオリティ)を実施した

正直もっとアジャイルのお話をしてほしかった。
ほとんどの時間がVisualStudioOnlineのデモに費やされていて、聞きたいこととはずれていた。

ただうちもこういうリポジトリ、ビルド、テスト、デプロイのフレームというか
テンプレート的なモノをOSS組み合わせておいて、あらかじめ用意しておきたいなと思った。
新規でプロジェクトが発足するたびにやってたらちょっと無駄感。

あと最後の方でモバイルアプリのリリースの質問?みたいなのがあった。
ネイティブなアプリだと修正はいるたびにリリースはあり得ないんだろうな。
1日に何回も細かいバグがなおるたびにアプリアップデートとか使う方からしたら邪魔っちぃきがする。

効果的に試行錯誤を行うための仕組みづくり 〜失敗はおはやめに、プロダクトの成長は着実に〜

つづいてヌーラボさんの公募セッション。
水野さんの基調講演でTry and Errorはだめ!と言われてて、ドキドキしていたらしいw
講演見ていて思い出したけどBacklog作っていることろか。

資料あがってますね

メモ * 講演 * パワポが黄色に白文字になっててなんにも見えないとこがちらほらw * 2011年に3、4つの機能を盛り込んだビッグリリースに失敗。
2時間かけて前のバージョンに切り戻したらしい。
* UI設計にはコストをかけるべき。
UIドリブンな開発、開発者がなるべくそこに関わること。
そうすることで後々にいきてくる。 * UI設計ではモックを利用。
HTMLだけーのから、JavaScriptで動きがあるもの、ChromeExtensionをつかったものなど必要に応じて使い分けている
* 失敗できる環境づくり β環境
STGとは別に本番環境の横にいて本番のデータを使っている。開発者はそこを利用しているらしい。
切り替え方はバーチャルホスト・クッキーディスパッチ・リソーススイッチ・アプリフラグなどなど * インフラはPacker/Vagrant/Ansible/serverspecを使っていてAWSを利用しているみたい * アプリで使っているのはGradle
* nubotによる自動デプロイ * 失敗するためには失敗しても簡単にやり直せることが大事
デプロイ失敗時のロールバックまで自動化 * だれが?どの環境が?デプロイ作業中なのかーっていうところは可視化してわかるようにしている * フィードバックのためのトピックがあって「ツッコミビリティ」を確保している
情報をオープンに、別プロジェクトのメンバーもはいっていてそこからのツッコミも。 * フィードバックするときの注意 * ポジティブフィードバックを心がける * 指摘ではなく提案をする * 人ではなく課題にたいしてツッコム * フィードバックしてほしいときの注意 * 見てほしいところを明確に、これみといてーはだめよ * 手軽な場を作ること * 質問 * データベースの構造変更はどうしている? → create table とかalter tableとかSTGで検証して問題ないことを確認したらやっちゃう * どこまでのフィードバックに対応しているか? → 必要があれば利用者と直接会話して内容をきくことも。
自分たちで使い心地を判断しかねるときはβ環境を顧客にも提供する

β環境的なものは私たちも用意できている(キリッ
(最近アプリ適用できてないからいまいち感はんぱないけど)

でもすごいなー、やっぱり進んでるところは進んでるなー。
hubotで自動デプロイやりたいなー。
自動化するってことは試行錯誤を容易にするってことに通じるんだなー。

講演が終わってから、自動化をどうやって進めたかについて聞いてみたところ
一年間にわたって時間かけて徐々にやっていったので、
あんまり焦らず長期的な目で進めていけたらいいんじゃないかとアドバイスをいただけた。
あと誰が進めたかについても聞いてみた。こういうのは誰かがガンガン進めるべし、みたいなのもみたので。
そしたら割とチーム全体で進めていったご様子。素敵。
hubot使ってみたいんですよーと聞いてみたら、楽しいしおすすめですよと。
hubot自身でもいろいろできるけど、あらかじめあったJenkinsのジョブを実行するだけになっているらしい。
既存のリソースを無駄にしないでいけたところがよかったとのこと。
染田さん、貴重なアドバイスありがとうございました。

素敵なチームなんだろうな。
今更ながらどうやってチームビルディングしたか聞いてみたい。
twitterフォローさせてもらったので聞いてみようかしら。

アジャイル経験0から3年で3億以上を稼いだ道のり~とある中小ソフトベンダーの請負アジャイル開発実績~

請負というキーワードで聴講。
どうやってお客さんと調整しているのかしら。

メモ

  • 講演
  • リスクは承知で準委任ではなく請負
  • 見積もりにはJUASの1画面1人月に0.7掛け(なぜかそう思ったらしい、ってのとお得感をだすために)
  • どういう業務を実現したいのか→要件
  • 要件定義はあくまで最初の指標としての立ち位置
  • アジャイル初体験にしてはちょっと多めの10人で立ち上げ
  • メンバが楽しいっていってくれた → 大事
  • 顧客も最初は少しずつのリリースに違和感を感じたみたいだけど、慣れてくるとどこまでできているのかが見えてよかったとのこと
  • チームビルドは大変
  • リリースの次MSを顧客の試用期間にすることでお客様の負担を減らす試み
  • MS最終日はリリース、デモ、フィードバックの実施
  • タスクは個人がこれやるーっていって選ぶ
  • Geekがいてくれたことが大きい
  • Geekレビューが必須で、負荷があがってしまっている、平準化が急務
  • 1つのアジャイルチームを2つに分けて、そこに未経験メンバを投入
  • それぞれが気にして朝会やらチケットを見ていたみたいで、佳境時に別チームメンバにすんなり入ってもらえた
  • 質問
  • 調整系のおはなし 要求を一定に保てるようにしていた。
    この機能があればこっちはいらないよね、とか。
    顧客との協調が大事で、信頼関係が築けていれば請負でもあとあとで問題にはならない。

チームビルドやらメンバを楽しくさせる工夫とか聞きにいきたかったけど、既に捕まっていて聞けず。
UI/SSは全くやっていなくてコードから保守用のドキュメントを起こしているって聞いて「ほえー」ってなった。 やっぱりお客さんとの信頼関係大事だなぁ。お客さんも含めて1つのチームなんだよなぁ。

Embrace Change for Unchangeability. ~エンタープライズのためのアジャイル

最後はここ。理由はなんかtwitterで見たことある人だったから。

メモ

  • 講演
  • 変化の中の不変の価値
  • かわらないために動き続ける
  • 開拓
    • 3ヶ月かけてモノを作ったが、すべて捨てて2ヶ月で作り直したことも
    • 一番最初に誰の何のためのITサービスかを書く
    • プロダクトビジョンの検証
      プレスリリースを書いてみる、壇上で発表もする
      amazon?がやっているらしい。ヘビーユーザに見てもらってどう感じるか?など
    • ユーザエクスペリエンスデザイン
      • ユーザにとって効率のいいタスクやナビゲーションフロー
      • ユーザーインターフェースの見た目と雰囲気
      • イデアを反映したプロトでテスト
      • ユーザがやりたいことが用意に達成できるか判定
  • 持続(だっけ?)
    • 基幹システムのマイグレーション
    • 計画は決めすぎない、投げ出さない 決めすぎるとすぐに現実と乖離してしまうし、投げ出せばすぐに崩壊する
    • YAGNIとはいえ、ちゃんと先を見据えて手広く選択肢を残す
    • アーキテクチャ 固定するとこと柔軟にしておくところのバランス
    • 最初はウォーターフォールでどーんと作って、タイムボックスのショートリリースでチューニング

この辺りでこれまでの情報量に頭いたくなってきているのでメモが少ないw
でもこの講演をしている人は徹夜あけで発表しているらし。
割とリアルなバーンダウンを見させてもらった。うちと似た感じのw
PullReq開発しているっぽくて、この人のレビューがOKになったらマージされるみたいだけどめちゃくちゃ大変っていってた。
そりゃそうだよな。。。
リリース自動化にも取り組みたいらしいけど顧客を説得させるための資料とかとかで取り組めていないらし。

まとめ

チームビルディングのコツ、みんなで楽しく開発するために他社ではどんなことしているのか?

こういう話はあまりきけなかったな。
でも情報の透明性は大事と結構多くの人が言っていた。その通りだと思う。
実際に別チームの人で「何も聞いてない」って言って怒ってる人もいるし
自分自身も定例会フィードバックでいきなり???な話を聞かされると「どうなってんの?」って思う。
tweetとか見てると、やはりコミュニケーションで困ってる人は多そうだ。
なにかできないか、もっと画策してみよう。

他社のアジャイルな開発、って実際にはどんなことしているのだろう?

うちの取り組みもなかなか悪くないではないか、と感じました。
ただマネジメント的な部分がイマイチなんだろう。
ほんとに、こういうセミナーにいってこいっていうのは「あじゃいるっ?」
って人に結構効果的なんじゃないかな。

・・・うち、技術的に遅れてる?

技術的に先をいっている所は先をいっている。
おそらく自社開発だからそういったところに融通がききやすいのかな?
うちもお客さんのメリットをちゃんと伝えたうえで
技術力アップのための検証とかさせてもらいたいから
そのために提案をしなければいけないな。

最後に

次回 agile japan 2015 も参加したい。
agile japanだけじゃなくて、もっといろんな所に参加してみたい。 水野さんの基調講演の動画がアップされたら(されるかな?)、部長に
みんなで見る時間をとれるか、みんなで見て意義があるだろうか
を相談してみよう。

Docker簡単にさわる

Docker

会社で環境を壊すという失態をしてしまったため、
Ansibleさんの自動化もすすめたいところだけど、ちょっとだけDockerさわってみることにした。

Macでのインストールはboot2dockerを利用する。
Mac直だとDockerさんは動かないみたい。
そのためboot2dockerさんで軽いVMをうごかしてその上でDockerさんを動かすイメージと認識。(あってるかな?)
インストール自体は超簡単

$brew install docker boot2docker

インストールしてみたもののどうなら勉強したいVagrant環境でやってみようとおもってそっちで進める

おまじないのようになってきたこいつ

$ vagrant init centos6.5
$ vagrant up
$ vagrant ssh

公式サイトに従いながらインストール

sudo yum -y update
sudo yum install docker-io

そして起動してみる。
pullはDockerイメージをダウンロードするためのコマンド。
ここではcentosの最新を指定している。
imagesはpullしたDockerイメージの一覧を表示するためのコマンド。
runはDockerコンテナーを実行するコマンド。とりあえずbashを実行する。

sudo service docker start
sudo docker pull centos:latest
sudo docker images 
sudo docker run -i -t centos /bin/bash

試しにテンポラリにファイルを作ってみて

bash-4.1# ls -l /tmp/
total 0
bash-4.1# touch /tmp/hoge
bash-4.1# ls -l /tmp/
total 0
-rw-r--r-- 1 root root 0 Jun 22 08:10 hoge

ぬけて、もう一回見てみると、ふぁいるがない!

bash-4.1# exit
exit
[vagrant@vagrant-centos65 ~]$ sudo docker run -i -t centos /bin/bash
bash-4.1# ls -l /tmp/
total 0
bash-4.1# 

docker ps -aで確認してみると、2つのコンテナが作成されていたことがわかる。
気軽にらんらんしちゃあかんのかな。

[vagrant@vagrant-centos65 ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                          PORTS               NAMES
eaefaadad338        centos:latest       /bin/bash           About a minute ago   Exited (0) 6 seconds ago                            furious_thompson    
c2fe5ff7b502        centos:latest       /bin/bash           About a minute ago   Exited (0) About a minute ago                       goofy_thompson   

コンテナの削除はdocker rm PIDで、PIDは先頭数文字で消せるみたい。

[vagrant@vagrant-centos65 ~]$ sudo docker rm c2
c2
[vagrant@vagrant-centos65 ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
eaefaadad338        centos:latest       /bin/bash           2 minutes ago       Exited (0) About a minute ago                       furious_thompson    
[vagrant@vagrant-centos65 ~]$ 

とりあえずnginxでも入れてみる。
EPEL Repogitoryの追加が必要。

$ sudo docker run -i -t centos /bin/bash
# rpm -i http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
# yum -y update
# yum -y install nginx

ちょっとさわった感想

Vagrantさんとの使い分けがあまりわかってないな。
CIとかでがんがん作って消してをするならこっちの方が良さそうというのはわかる。
何となくさわってみてイメージつかみやすいのはVagrantさん。おおもとはVMだから当然っちゃ当然かも。 AWSはどっちも使えるみたいだしなぁ。

Elasticsearch boolean型にfieldsが指定できない

メモ程度。

ElasticsearchのMappingでfieldsというのがある。
Multi fieldsがなくなりこちらの形式になったとのことだが

{
  "tweet" : {
    "properties" : {
      "name" : {
        "type" : "string",
        "index" : "analyzed",
        "fields" : {
          "untouched" : {"type" : "string", "index" : "not_analyzed"}
        }
      }
    }
  }
}

こんな形で1つのフィールドに複数のindexが指定できる。
sortするときとかはnot_analyzedにたいしてやったりする。

これをbooleanでやろうとしたときのお話。

古いバージョンでmulti_fieldsを使用していて、アップデートしたときは

{
  "tweet" : {
    "properties" : {
      "flag" : {
        "type" : "boolean",
        "index" : "no",
        "fields" : {
          "untouched" : {"type" : "boolean"}
        }
      }
    }
  }
}

こんな形で変換される。
"index":"no"は無駄にデータ量食いたくないので。
でもソートクエリ書くときの処理を型によって変えたくなかったり、完全一致の検索とかなんやかんやでこの形を試した。

ただこのmappingを1.2.1のバージョンで登録すると

{
  "tweet" : {
    "properties" : {
      "flag" : {
        "type" : "boolean",
        "index" : "no"
      }
    }
  }
}

こうなって、untouchedフィールドの師弟が消えてしまった。

アップデートではやってくれるのになーと思いつつ、下記の方法で対処。

{
  "tweet" : {
    "properties" : {
      "flag" : {
        "type" : "string",
        "index" : "no",
        "fields" : {
          "untouched" : {"type" : "boolean"}
        }
      }
    }
  }
}

どうせデフォルトフィールドは"index":"no"なので型は気にせず文字列にしてしまって、untouchedにはboolean型。

ansibleの続きお勉強は土日に。
今日の勉強会のこれ

やってられっか

この気持ちは大事だ。。。
やりたい人ががんがん推し進める、その為に頑張る。

ansibleでVagrantをプロビジョニング

前回のsample.ymlhostをVagrantfileと同じ場所におく

Vagrantfileにansibleのプロビジョニング設定を追加。

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos6.5"
  config.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box" 

  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "sample.yml"
    ansible.inventory_path = "hosts"
    ansible.limit = 'sample'
  end
end

これで完了っと。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centos6.5'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: vagrant_default_1402233334423_6039
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /Users/akira/vagrant/ansible/vagrant
==> default: Running provisioner: ansible...
 _______________ 
< PLAY [sample] >
 --------------- 
 \     /\  ___  /\
  \   // \/   \/ \\
     ((    O O    ))
      \\ /     \ //
       \/  | |  \/ 
        |  | |  |  
        |  | |  |  
        |   o   |  
        | |   | |  
        |m|   |m|  


 _________________ 
< GATHERING FACTS >
 ----------------- 
 \     /\  ___  /\
  \   // \/   \/ \\
     ((    O O    ))
      \\ /     \ //
       \/  | |  \/ 
        |  | |  |  
        |  | |  |  
        |   o   |  
        | |   | |  
        |m|   |m|  


ok: [192.168.33.10]
 __________________________________ 
< TASK: be sure httpd is installed >
 ---------------------------------- 
 \     /\  ___  /\
  \   // \/   \/ \\
     ((    O O    ))
      \\ /     \ //
       \/  | |  \/ 
        |  | |  |  
        |  | |  |  
        |   o   |  
        | |   | |  
        |m|   |m|  


changed: [192.168.33.10]
 ____________________________________________ 
< TASK: be sure httpd is running and enabled >
 -------------------------------------------- 
 \     /\  ___  /\
  \   // \/   \/ \\
     ((    O O    ))
      \\ /     \ //
       \/  | |  \/ 
        |  | |  |  
        |  | |  |  
        |   o   |  
        | |   | |  
        |m|   |m|  


changed: [192.168.33.10]
 ____________ 
< PLAY RECAP >
 ------------ 
 \     /\  ___  /\
  \   // \/   \/ \\
     ((    O O    ))
      \\ /     \ //
       \/  | |  \/ 
        |  | |  |  
        |  | |  |  
        |   o   |  
        | |   | |  
        |m|   |m|  


192.168.33.10              : ok=3    changed=2    unreachable=0    failed=0   

完了後のものはここ

Ansible使ってみる

chefさんとかpuppetさんとかと同じ感じのもの。

chefさんは登場人物が多すぎて、ドキュメントも多すぎてちょっと大変そうなイメージを受けた。
実際に前回軽くさわってみたもののBerkshelfさんも理解しないといけなかったり。。。

ansibleさんはドキュメントが少なくて(15ページないくらい)らしい。
ほんとか?と思いながらも、とっつきやすそうなのでこっちを掘り下げていきたいと考えています。

環境

いってみよう、やってみよう

いつものようにvagrantさんでcentos6.5を立ち上げて接続。
vagrantさんマジ便利。。。

$ vagrant init centos6.5
$ vagrant up
$ vagrant ssh

公式サイトに書いてある感じでインストールする。一応yum updateもしておく。

$ sudo yum -y update
$ sudo yum -y install ansible

間違えた。Chef Soloの感覚で入れたけど、こういうものじゃないのか。
ホストからゲストにこれやってちょーってお願いするイメージ。

なのでやり直し。ホストにansibleをインストールする

$ brew install ansible
$ ansible --version
ansible 1.6.2

続いてinventory fileの作成、対象となるマシンを設定するファイル。
[sample]のように名前を付けてグルーピングすることができる。
ここでポートの指定も可能らしい。

cat > hosts
[sample]
192.168.33.10
$ ssh-agent bash
$ ssh-add ~/.ssh/id_rsa

さて、試してみる

$ ansible -i hosts all -m ping 
192.168.33.10 | FAILED => SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue

ここを参考に秘密鍵のパスとユーザを指定する

$ ansible -i hosts all -m ping  --user=vagrant --private-key=~/.vagrant.d/insecure_private_key -vvvv
192.168.33.10 | success >> {
    "changed": false, 
    "ping": "pong"
}

毎回指定するのはめんどくさいのでinventory fileに指定しておくとよい。っぽい。

cat > hosts
[sample]
192.168.33.10 ansible_ssh_user=vagrant ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key

コマンド実行とパッケージインストールを試す

コマンド実行を試してみる。

$ ansible all -a "/bin/echo hello" -i hosts 
192.168.33.10 | success | rc=0 >>
hello

・・・ドキュメントわかりやすい!! そして$ ansible-doc yumとするとドキュメントみれる。便利ぃ〜。

とりあえずでapacheさんを入れてみる。するとrootじゃなきゃだめよとおこられてしまった。

$ ansible sample -i hosts -m yum -a "name=httpd state=installed"
192.168.33.10 | FAILED >> {
    "changed": true, 
    "msg": "You need to be root to perform this command.\n", 
    "rc": 1, 
    "results": [
        "Loaded plugins: fastestmirror, versionlock\n"
    ]
}

-sを指定するとsudoしてくれるみたい。お試してみてらできましたー!!

 ansible sample -i hosts -s -m yum -a "name=httpd state=installed"
192.168.33.10 | success >> {
    "changed": true, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "Loaded plugins: fastestmirror, versionlock\nLoading mirror speeds from cached hostfile\n * base: ftp.nara.wide.ad.jp\n * epel: kartolo.sby.datautama.net.id\n * extras: ftp.nara.wide.ad.jp\n * updates: ftp.nara.wide.ad.jp\nSetting up Install Process\nResolving Dependencies\n--> Running transaction check\n---> Package httpd.x86_64 0:2.2.15-30.el6.centos will be installed\n--> Processing Dependency: httpd-tools = 2.2.15-30.el6.centos for package: httpd-2.2.15-30.el6.centos.x86_64\n--> Processing Dependency: apr-util-ldap for package: httpd-2.2.15-30.el6.centos.x86_64\n--> Processing Dependency: /etc/mime.types for package: httpd-2.2.15-30.el6.centos.x86_64\n--> Running transaction check\n---> Package apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1 will be installed\n---> Package httpd-tools.x86_64 0:2.2.15-30.el6.centos will be installed\n---> Package mailcap.noarch 0:2.1.31-2.el6 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package            Arch        Version                      Repository    Size\n================================================================================\nInstalling:\n httpd              x86_64      2.2.15-30.el6.centos         updates      821 k\nInstalling for dependencies:\n apr-util-ldap      x86_64      1.3.9-3.el6_0.1              base          15 k\n httpd-tools        x86_64      2.2.15-30.el6.centos         updates       73 k\n mailcap            noarch      2.1.31-2.el6                 base          27 k\n\nTransaction Summary\n================================================================================\nInstall       4 Package(s)\n\nTotal download size: 936 k\nInstalled size: 3.1 M\nDownloading Packages:\n--------------------------------------------------------------------------------\nTotal                                           163 kB/s | 936 kB     00:05     \nRunning rpm_check_debug\nRunning Transaction Test\nTransaction Test Succeeded\nRunning Transaction\n\r  Installing : httpd-tools-2.2.15-30.el6.centos.x86_64                      1/4 \n\r  Installing : apr-util-ldap-1.3.9-3.el6_0.1.x86_64                         2/4 \n\r  Installing : mailcap-2.1.31-2.el6.noarch                                  3/4 \n\r  Installing : httpd-2.2.15-30.el6.centos.x86_64                            4/4 \n\r  Verifying  : mailcap-2.1.31-2.el6.noarch                                  1/4 \n\r  Verifying  : httpd-2.2.15-30.el6.centos.x86_64                            2/4 \n\r  Verifying  : apr-util-ldap-1.3.9-3.el6_0.1.x86_64                         3/4 \n\r  Verifying  : httpd-tools-2.2.15-30.el6.centos.x86_64                      4/4 \n\nInstalled:\n  httpd.x86_64 0:2.2.15-30.el6.centos                                           \n\nDependency Installed:\n  apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1                                        \n  httpd-tools.x86_64 0:2.2.15-30.el6.centos                                     \n  mailcap.noarch 0:2.1.31-2.el6                                                 \n\nComplete!\n"
    ]
}

もう一回うってみる。既にインストール済みなので"changed": false。これがベキトウセイというやつなのか???!!!

$ ansible sample -i hosts -s -m yum -a "name=httpd state=installed"
192.168.33.10 | success >> {
    "changed": false, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "httpd-2.2.15-30.el6.centos.x86_64 providing httpd is already installed"
    ]
}

Playbookを作ってみる

まずはapacheをインストールして起動するというPlaybookを作ってみる

$ cat > sample.yml 
- hosts: sample
  sudo: yes
  tasks:
    - name: be sure httpd is installed
      yum: name=httpd state=installed

    - name: be sure httpd is running and enabled
      service: name=httpd state=running enabled=yes

作った後は$ ansible-playbook -i hosts sample.yml --syntax-checkで構文チェック

タスクの一覧を確認するには--list-tasksで確認できる

$ ansible-playbook -i hosts sample.yml --list-tasks

playbook: sample.yml

  play #1 (sample):
    be sure httpd is installed
    be sure httpd is running and enabled

実行する前に。。。dry run!!!

$ ansible-playbook -i hosts sample.yml --check 

PLAY [sample] ***************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [192.168.33.10]

TASK: [be sure httpd is installed] ******************************************** 
ok: [192.168.33.10]

TASK: [be sure httpd is running and enabled] ********************************** 
changed: [192.168.33.10]

PLAY RECAP ******************************************************************** 
192.168.33.10              : ok=3    changed=1    unreachable=0    failed=0   

実行!!!できた!!!

$ ansible-playbook -i hosts sample.yml

PLAY [sample] ***************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [192.168.33.10]

TASK: [be sure httpd is installed] ******************************************** 
ok: [192.168.33.10]

TASK: [be sure httpd is running and enabled] ********************************** 
changed: [192.168.33.10]

PLAY RECAP ******************************************************************** 
192.168.33.10              : ok=3    changed=1    unreachable=0    failed=0   

おまけ

cowsayっていうのに対応しているらしい。brew install cowsayした後にコマンドをたたいてみると面白いです。
export ANSIBLE_COW_SELECTION=dragonってしてみると。。。
cowsay -lで指定可能な一覧が出ます。

  _______________ 
< ENJOY COWSAY   >
 --------------- 
      \                    / \  //\
       \    |\___/|      /   \//  \\
            /0  0  \__  /    //  | \ \    
           /     /  \/_/    //   |  \  \  
           @_^_@'/   \/_   //    |   \   \ 
           //_^_/     \/_ //     |    \    \
        ( //) |        \///      |     \     \
      ( / /) _|_ /   )  //       |      \     _\
    ( // /) '/,_ _ _/  ( ; -.    |    _ _\.-~        .-~~~^-.
  (( / / )) ,-{        _      `-.|.-~-.           .~         `.
 (( // / ))  '/\      /                 ~-. _ .-~      .-~^-.  \
 (( /// ))      `.   {            }                   /      \  \
  (( / ))     .----~-.\        \-'                 .~         \  `. \^-.
             ///.----..>        \             _ -~             `.  ^-`  ^-_
               ///-._ _ _ _ _ _ _}^ - - - - ~                     ~-- ,.-~

参考にさせていただいたサイト

VagrantのプロビジョニングでChef Soloを使ってみる その2

ちょっと整理してリベンジ

環境

$ vagrant version
Installed Version: 1.6.3
Latest Version: 1.6.3
 
You're running an up-to-date version of Vagrant!

$ vagrant plugin list
sahara (0.0.16)
vagrant-berkshelf (2.0.1)
  - Version Constraint: >= 2.0.1
vagrant-login (1.0.1, system)
vagrant-omnibus (1.4.1)
vagrant-share (1.1.0, system)

今回はBerkshelfのVagrantfileを使います。
まずは初期化、これは前回と同様です。

$ berks cookbook sample

まずはBerksfilemysql と nginxのcookbookを追加

source "https://api.berkshelf.com"

metadata

cookbook "mysql"
cookbook "nginx", "~> 2.6"

Vagrantfileのrun_listにcookbookを追加

-  config.vm.box = "opscode_ubuntu-12.04_provisionerless"
+  config.vm.box = "centos6.5"

-  config.vm.box_url = "https://opscode-vm-bento.s3.amazonaws.com/vagrant/opscode_ubuntu-12.04_provisionerless.box"
+  config.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box" 


       mysql: {
         server_root_password: 'rootpass',
-         server_debian_password: 'debpass',
-        server_repl_password: 'replpass'
+        server_repl_password: 'replpass',
+        bind_address: "127.0.0.1"
       }
     }
 
     chef.run_list = [
+        "nginx",
+        "mysql::client",
+        "mysql::server",
         "recipe[sample::default]"
     ]

sample/recipes/default.rbもちょっと試してみる

log "Hello World!!!!!!!!!!!!!"

あとはvagrant upすればmysql,nginx,hello worldそれぞれが実行されて起動してくれる。

ただ、Barkshelfの使い方ってこれであってるの?って感じ。
chefはそこそこにansible試してみたいのでそっちは時間があったらもうちょっと勉強する

ゴミ箱