Knife Pluginをつくる
Chef Casual Talks Vol.2 (2013.5.20)HiganWorks LLC @sawanoboly
Monday, May 20, 13
紹介• HiganWorks 合同会社
プラットホームエンジニア / 代表社員
• インフラ関係自動化
• クラウド的なもの(彼岸)で色々やる
• Avatarはこんな感じ
2
•sawanoboly@github•sawanoboly@twitter
•yukihiko.sawanobori@facebook
Monday, May 20, 13
Chef的にはこんなの書いたりしました
3Monday, May 20, 13
当たり障りの無いCookbookを公開していたりします
4Monday, May 20, 13
Chef事例:Giraffi(ClosedService)
• メッセージハブ(Post&Trigger)
• マルチデバイスNotification
• MapReduce
• kvmとjoyent
• 役割別にレイヤ(Role)
• 構築更新はChef/Capistrano
• 提供先例
• 某クラウドの内部/外部監視5
HTTP(S)
Rails APPs
RDBMS(Cluster)
MongoDB/Redis
SMTP/Nagios/APNS etc..
Monday, May 20, 13
Knifeプラグインをつくる
Monday, May 20, 13
Knifeの役割• 基本的な役割
• ChefServerに対してCRUD
• Nodeに対するゴリ押しタスク実行
• 要は外部APIに対するCRUD
• Rubygemsで簡単拡張
7Monday, May 20, 13
自作例:Knife-ZCloudjp• JoyentのSmartMachineをAPI越しに作成
• 同時にBootstrap & Role適用(戻りでIPアドレスをもらうのでBootまでつつき続ける!)
8Monday, May 20, 13
Knife Pluginのコツ1/3• サブコマンド
• クラス名=分解されてサブコマンドに
• class NodeEdit #=> `knife node edit`
• Knifeを継承して好きなクラスを作ればOK
• banner #=> helpの表示内容
9Monday, May 20, 13
Knife Pluginのコツ2/3• オプション
• コマンドラインオプション
• knife.rb に書く`knife[:optionname] = ‘hogehoge’`
• Knifeを継承したクラスに#optionでOK
10
option :twitter_consumer_key, :short => "-‐K CONSUMER_KEY", :long => "-‐-‐twitter_consumer_key", :description => "Your Twitter Consumer Key", :proc => Proc.new { |key| Chef::Config[:knife][:twitter_consumer_key] = key }
Monday, May 20, 13
Knife Pluginのコツ3/3• UI
• 標準でHighLine(gem)が使われている
• ANSIカラーシーケンス
• HignLine#listで簡単リスト表示
全体的に結構レガシーな感じ...
11Monday, May 20, 13
knife-twitterhttps://github.com/higanworks/knife-twitter
Monday, May 20, 13
knifeでtweet• カジュアルなAPIを探した
#=> Twitterでええわ
• `knife twitter post`-m ‘TEXT’ で内容指定
• `knife twitter tl` (timeline)オプション無しでタイムライン-m でメンション表示
13Monday, May 20, 13
Post(1)
14
class Chef class Knife class TwitterPost < Knife include TwitterBase
banner "knife twitter post (options)"def run t_configure begin Twitter.update(locate_config_value(:twitter_message)) ui.info("Tweet Success! #=> #{locate_config_value(:twitter_message)}")
knife twitter postの素
#run に実行内容
#ui でコンソールに表示
Monday, May 20, 13
Post(2)
15
option :twitter_message, :short => "-‐m TWEET_MEAASAGE", :long => "-‐-‐twitter_message", :description => "Your Tweet",
:proc => Proc.new { |message| Chef::Config[:knife][:twitter_message] = message },
:default => "Tweet with knife-‐twitter " + ::Knife::Twitter::VERSION + " " + Time.now.to_s
CLオプションの引数指定
省略時のdefault
Monday, May 20, 13
TimeLine(1)
16
banner "knife twitter tl (options)"def run t_configure begin if locate_config_value(:twitter_mentions) timeline = Twitter.mentions_timeline else timeline = Twitter.home_timeline end
timelineを取得
Monday, May 20, 13
TimeLine(2)
17
tl_list = []timeline.map do |tl| tl_list << ui.color(tl[:user][:screen_name], :cyan) tl_list << ui.color(tl[:created_at].to_s, :magenta) tl_list << ui.color(tl[:text])end
puts ui.list(tl_list, :uneven_columns_across, 3)
HighLineで色つけ、tl_listへ
tl_listの中身を3カラムで適当に表示
Monday, May 20, 13
デモ
Monday, May 20, 13
お知らせ2+1点
Monday, May 20, 13
Chef Meetup kansai20
Monday, May 20, 13
TDI with Chef(Ja)
21
• 著者Stephen Nelson-Smith氏に翻訳版の配布許可を打診
• 快く承諾(!?)
※画像は加工によるものです
Monday, May 20, 13
22
• EYが何やら募集されています
• 要件:大規模ChefServer運用経験=>無茶を言うなと…
Monday, May 20, 13
• そこでとちょっと働いてみるという選択
• Chef含め自動化やってます
• そのうちもっと大規模もやるかも(現状 数十のVMくらいを持ち回り)#=> EYの大規模ChefServer運用経験が 満たせるかもしれない (^^)
• 普通の募集はあまりしないが人は足りない興味があったら相談して
23Monday, May 20, 13
Meetup Knasaiにつづく
Monday, May 20, 13