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 ErrorのErrorはいらない、バカか!
この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?がやっているらしい。ヘビーユーザに見てもらってどう感じるか?など - ユーザエクスペリエンスデザイン
- ユーザにとって効率のいいタスクやナビゲーションフロー
- ユーザーインターフェースの見た目と雰囲気
- アイデアを反映したプロトでテスト
- ユーザがやりたいことが用意に達成できるか判定
- 持続(だっけ?)
この辺りでこれまでの情報量に頭いたくなってきているのでメモが少ないw
でもこの講演をしている人は徹夜あけで発表しているらし。
割とリアルなバーンダウンを見させてもらった。うちと似た感じのw
PullReq開発しているっぽくて、この人のレビューがOKになったらマージされるみたいだけどめちゃくちゃ大変っていってた。
そりゃそうだよな。。。
リリース自動化にも取り組みたいらしいけど顧客を説得させるための資料とかとかで取り組めていないらし。
まとめ
チームビルディングのコツ、みんなで楽しく開発するために他社ではどんなことしているのか?
こういう話はあまりきけなかったな。
でも情報の透明性は大事と結構多くの人が言っていた。その通りだと思う。
実際に別チームの人で「何も聞いてない」って言って怒ってる人もいるし
自分自身も定例会フィードバックでいきなり???な話を聞かされると「どうなってんの?」って思う。
tweetとか見てると、やはりコミュニケーションで困ってる人は多そうだ。
なにかできないか、もっと画策してみよう。
他社のアジャイルな開発、って実際にはどんなことしているのだろう?
うちの取り組みもなかなか悪くないではないか、と感じました。
ただマネジメント的な部分がイマイチなんだろう。
ほんとに、こういうセミナーにいってこいっていうのは「あじゃいるっ?」
って人に結構効果的なんじゃないかな。
・・・うち、技術的に遅れてる?
技術的に先をいっている所は先をいっている。
おそらく自社開発だからそういったところに融通がききやすいのかな?
うちもお客さんのメリットをちゃんと伝えたうえで
技術力アップのための検証とかさせてもらいたいから
そのために提案をしなければいけないな。
最後に
次回 agile japan 2015 も参加したい。
agile japanだけじゃなくて、もっといろんな所に参加してみたい。
水野さんの基調講演の動画がアップされたら(されるかな?)、部長に
みんなで見る時間をとれるか、みんなで見て意義があるだろうか
を相談してみよう。
Docker 指摘めも
sudo docker build sudo docker pull centos:latest sudo docker images sudo docker run -i -t centos /bin/bash sudo docker ps -a sudo docker start CID sudo docker stop CID sudo docker attach CID sudo docker rm CID sudo docker rmi IID sudo docker ps -a -q sudo docker rm `sudo docker ps -a -q` sudo docker ps -a sudo docker commit CID akria/nginx
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.yml
とhost
を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ページないくらい)らしい。
ほんとか?と思いながらも、とっつきやすそうなのでこっちを掘り下げていきたいと考えています。
環境
- マシン: MacBook Pro 2.6 OS X 10.9.3(13D65)
- GHz Intel Core i5
- 8 GB 1600 MHz DDR3
- Vagrant: 1.6.3
- VBoxManage: 4.3.12r93733
- python: 2.7.5
- ゲストOS: CentOS 6.5
いってみよう、やってみよう
いつものように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
まずはBerksfile
にmysql と 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試してみたいのでそっちは時間があったらもうちょっと勉強する