Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

はじめてのWindows Azure ~Chefのプラグインknife-azureの設定~

Chef面白そうだな、と思ってつぶやいた所「knife-azure」なるものがあることを教えてもらいました(^^)

日本語の情報を探したところ

knife-azureでWindows Azureを管理する CL LAB

があって、お!簡単そうだ!と思ってやってみたのですが、結構苦戦しました(^^;
自分の問題解決力が低いだけな気もしますが。。。

2014/3/11追記
後日Vagrantで作成したUbuntuでは簡単にknife-azureインストールできました。

knife-azureのインストール

本エントリでは結構複雑な手順になっちゃってますが、もしかすると上記レベルで普通にインストールできるのかも。タイミングあれば別途検証してみます。

上記サイトでは「ホステッドサービス版Enterprise Chef」なるものに登録した手順でしたが、自分はマシンにChefをインストールする所からの手順となります。

ちなみに英語の情報としては

辺りが中心かと思います。

注意:ChefもRubyも初めてで色々と知識がないまま、手探りでやったので、間違いあれば指摘頂けると嬉しいです。

環境

手元にLinuxマシンがないので、先日「はじめてのWindows Azure ~Ubuntuの仮想マシンを作ってみた~」で書いた時に作ったUbuntu Linuxを使いました。

Windows Azureで構築した仮想マシン
OS:Ubuntu Server 13.10 amd64

つまずいた所

自分が構築した手順を書く前に、つまずいた所をまとめておきます。

Ruby1.8を入れてnokogiri-1.6.1でエラー

構築したUbuntuにはRubyが入っていませんでした。
Chefのインストールは「ドットインストール Chef入門」を参考にして進めて、その中でRubyは1.8.7となっていたので、1.8を入れたら、nokogiriなるライブラリが1.9.2以上じゃないと駄目なようで、以下エラーとなりました。

f:id:kikutaro777:20140108230242j:plain

ということで、Rubyは1.9.1を入れました。

eventmachine-1.0.0.beta.3でビルドエラー

ここが一番つまずいて、海外サイトでも同じ悩みの人が多かったのですが、これといった明確な解決法がみつからず、私は結局諦めました。

以下のサイトでも諦めてた(^^;

veewee を試す前に相当ハマったのでメモ

ただ、上記サイトのように外すわけにはいかない(試しに外したら動かなかったです)ので、代わりにgit cloneで幾つかのライブラリをローカルに落として、それを参照する方向で進めました。

knife-azure設定手順

apt-getで更新

とりあえず、最初に

sudo apt-get update
sudo apt-get upgrade

しておきました。

Chefのインストール

Chef触るのは初めてなのですが、「ドットインストール Chef入門」の動画で基本的な構成などを理解しつつ、ネットの情報を調べながら手探りで理解を進めて言った感じです(^^;

Rubyのバージョン確認
ruby -v

でバージョンを確認すると、Ubuntuではそもそもインストールされておらず、以下画面となりました。

f:id:kikutaro777:20140108203530j:plain

sudo apt-get install ruby1.9.1

で1.9.1のほうをインストールします。完了後、再度ruby -vで確認すると

ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]

またgemのバージョンは

gem -v

1.8.23

となりました。

gemって知らなかったのですが、Rubyのサイトにあった「Ruby に特化した apt-get と同じようなパッケージングシステム」という説明がわかりやすい(^^;
https://www.ruby-lang.org/ja/libraries/

Javaでいうmavenみたいな感じですかね。

Chefのインストール
curl -L https://www.opscode.com/chef/install.sh | sudo bash

ダウンロードとインストールのメッセージがずらずらと出て最後に

Setting up chef (11.8.2-1.ubuntu.13.04) ...
Thank you for installing Chef!

と出てインストールできました。あっさり。

Knife-soloのインストール

このままKnife-soloをgemでinstallしたらエラーとなったのですが、以下2つ入れて解決しました。

sudo aptitude install ruby1.9.1-dev
sudo apt-get install make

その後

sudo gem install knife-solo

でインストールします。結構遅く感じたのですが

sudo gem install knife-solo --no-ri --no-rdoc

とするとドキュメント含めないとのことで、少し早い…のかな(^^;手順ではこちらでやりました。

インストールできたら

knife configure

色々聞かれますが、ドットインストールでは「とりあえずEnter」とのことで、そうしました(^^;
f:id:kikutaro777:20140108231608j:plain

ls .chef

などでknife.rbが出来ていればOKなようです。

あとはsudo gem install knife-azure --no-ri --no-rdocで完了!なんて期待したのですが、それをやるとまず

sudo gem install knife-azure --no-ri --no-rdoc
Fetching: rdoc-3.12.2.gem (100%)
Depending on your version of ruby, you may need to install ruby rdoc/ri data:<= 1.8.6 : unsupported
= 1.8.7 : gem install rdoc-data; rdoc-data --install
= 1.9.1 : gem install rdoc-data; rdoc-data --install
>= 1.9.2 : nothing to do! Yay!
Fetching: bundler-1.5.1.gem (100%)
Fetching: rubygems-bundler-1.0.7.gem (100%)
Fetching: mini_portile-0.5.2.gem (100%)
Fetching: nokogiri-1.6.1.gem (100%)
Building native extensions. This could take a while...
Fetching: equivalent-xml-0.2.9.gem (100%)
Fetching: eventmachine-1.0.0.beta.3.gem (100%)
Building native extensions. This could take a while...
ERROR: Error installing knife-azure:
ERROR: Failed to build gem native extension.


/usr/bin/ruby1.9.1 extconf.rb
checking for main() in -lssl... no
checking for rb_trap_immediate in ruby.h,rubysig.h... no
checking for rb_thread_blocking_region()... yes
checking for inotify_init() in sys/inotify.h... yes
checking for writev() in sys/uio.h... yes
checking for rb_thread_check_ints()... yes
checking for rb_time_new()... yes
checking for sys/event.h... no
checking for epoll_create() in sys/epoll.h... yes
creating Makefile


make
compiling pipe.cpp
make: g++: Command not found
make: *** [pipe.o] Error 127

Gem files will remain installed in /var/lib/gems/1.9.1/gems/eventmachine-1.0.0.beta.3 for inspection.
Results logged to /var/lib/gems/1.9.1/gems/eventmachine-1.0.0.beta.3/ext/gem_make.out

とエラーになり

sudo apt-get install g++

をして、再度sudo gem install knife-azure --no-ri --no-rdocすると

最初に「諦めた所」で書いたように以下のエラーで上手くいかなかったです。

<span style="font-size: 80%">Building native extensions.  This could take a while...
ERROR:  Error installing knife-azure:
        ERROR: Failed to build gem native extension.

        /usr/bin/ruby1.9.1 extconf.rb
checking for main() in -lssl... no
checking for rb_trap_immediate in ruby.h,rubysig.h... no
checking for rb_thread_blocking_region()... yes
checking for inotify_init() in sys/inotify.h... yes
checking for writev() in sys/uio.h... yes
checking for rb_thread_check_ints()... yes
checking for rb_time_new()... yes
checking for sys/event.h... no
checking for epoll_create() in sys/epoll.h... yes
creating Makefile

make
compiling pipe.cpp
compiling cmain.cpp
compiling rubymain.cpp
rubymain.cpp: In function ‘VALUE t_connect_server(VALUE, VALUE, VALUE)’:
rubymain.cpp:504:42: error: format not a string literal and no format arguments [-Werror=format-security]
   rb_raise (EM_eConnectionError, e.what());
                                          ^
rubymain.cpp: In function ‘VALUE t_bind_connect_server(VALUE, VALUE, VALUE, VALUE, VALUE)’:
rubymain.cpp:525:42: error: format not a string literal and no format arguments [-Werror=format-security]
   rb_raise (EM_eConnectionError, e.what());
                                          ^
rubymain.cpp: In function ‘VALUE t_watch_filename(VALUE, VALUE)’:
rubymain.cpp:798:38: error: format not a string literal and no format arguments [-Werror=format-security]
   rb_raise (EM_eUnsupported, e.what());
                                      ^
rubymain.cpp: In function ‘VALUE t_watch_pid(VALUE, VALUE)’:
rubymain.cpp:824:38: error: format not a string literal and no format arguments [-Werror=format-security]
   rb_raise (EM_eUnsupported, e.what());
                                      ^
rubymain.cpp: In function ‘VALUE t_start_proxy(VALUE, VALUE, VALUE, VALUE, VALUE)’:
rubymain.cpp:1024:42: error: format not a string literal and no format arguments [-Werror=format-security]
   rb_raise (EM_eConnectionError, e.what());
                                          ^
rubymain.cpp: In function ‘VALUE t_stop_proxy(VALUE, VALUE)’:
rubymain.cpp:1039:42: error: format not a string literal and no format arguments [-Werror=format-security]
   rb_raise (EM_eConnectionError, e.what());
                                          ^
cc1plus: some warnings being treated as errors
make: *** [rubymain.o] Error 1


Gem files will remain installed in /var/lib/gems/1.9.1/gems/eventmachine-1.0.0.beta.3 for inspection.
Results logged to /var/lib/gems/1.9.1/gems/eventmachine-1.0.0.beta.3/ext/gem_make.out</span>

eventmachineの最新ではこれ解決してるよ、的な情報もあって、何とか変えられないかなと探してみました。
で、以下サイトでknife-azureをソースコードからインストールする方法がのっていて

Chef Knife plugin for Windows Azure (IAAS)

knife-azureをこれで入れても結果は同じだったので、どれが依存してるのか?調べた所eventmachineはem-winrmというのが参照してました。
以下サイトも参考にさせて頂きました。

veewee を試す前に相当ハマったのでメモ

ということで、このem-winrmのソースを落として、eventmachineのバージョンを上げてビルドして…とやればできるのかな?と思って試した所、いけました。

gitのインストール

ソースを落としためにgitが必要なので

sudo apt-get install git

でgitをインストールします。

以下3つのリポジトリをcloneします。

git clone https://github.com/opscode/em-winrm
git clone https://github.com/opscode/knife-windows
git clone https://github.com/opscode/knife-azure

em-winrmのインストール

エラーになるeventmachine 1.0.0.beta.3は確かにem-winrmで依存が定義されてます。

f:id:kikutaro777:20140108232654j:plain

そこで

s.add_dependency "eventmachine", "= 1.0.0.beta.3"

の部分を

s.add_dependency "eventmachine", "= 1.0.3"

に書き換えました。

そして

gem build em-winrm.gemspec

でビルドします。

WARNING:  description and summary are identical
  Successfully built RubyGem
  Name: em-winrm
  Version: 0.5.4
  File: em-winrm-0.5.4.gem

gemファイルが生成されたので、

sudo gem install em-winrm-0.5.4.gem --no-ri --no-rdoc

でインストールします。

Fetching: eventmachine-1.0.3.gem (100%)
Building native extensions. This could take a while...
Fetching: ffi-1.9.3.gem (100%)
Building native extensions. This could take a while...
Fetching: gssapi-1.0.3.gem (100%)
Fetching: httpclient-2.3.4.1.gem (100%)
Fetching: rubyntlm-0.1.1.gem (100%)
Fetching: uuidtools-2.1.4.gem (100%)
Fetching: builder-3.2.2.gem (100%)
Fetching: nori-1.1.5.gem (100%)
Fetching: httpi-0.9.7.gem (100%)
Fetching: wasabi-1.0.0.gem (100%)
Fetching: gyoku-1.1.1.gem (100%)
Fetching: akami-1.2.0.gem (100%)
Fetching: savon-0.9.5.gem (100%)
Fetching: little-plugger-1.1.3.gem (100%)
Fetching: multi_json-1.8.2.gem (100%)
Fetching: logging-1.8.1.gem (100%)
Fetching: winrm-1.1.3.gem (100%)
Successfully installed eventmachine-1.0.3
Successfully installed ffi-1.9.3
Successfully installed gssapi-1.0.3
Successfully installed httpclient-2.3.4.1
Successfully installed rubyntlm-0.1.1
Successfully installed uuidtools-2.1.4
Successfully installed builder-3.2.2
Successfully installed nori-1.1.5
Successfully installed httpi-0.9.7
Successfully installed wasabi-1.0.0
Successfully installed gyoku-1.1.1
Successfully installed akami-1.2.0
Successfully installed savon-0.9.5
Successfully installed little-plugger-1.1.3
Successfully installed multi_json-1.8.2
Successfully installed logging-1.8.1
Successfully installed winrm-1.1.3
Successfully installed em-winrm-0.5.4
18 gems installed

gem listで確認するとちゃんと入っていました。

knife-windowsのインストール

で、次にknife-windowsを入れるのですが、普通にインストールするとgemが自動的にリポジトリのem-winrmを参照しにいってしまいました。

どうやったらgemでローカルを参照できるのか調べた所、Stackoverflowに解決法がありました。

How to add dependency of a local gem to a rails plugin/engine, in .gemspec file

cloneしたフォルダにあるGemfileを開くと

source "https://rubygems.org"

# Specify your gem's dependencies in knife-windows.gemspec
gemspec

group :test do
  gem "rspec"
  gem "ruby-wmi"
  gem "chef"
  gem 'rake'
end

となっていますが、ここに

gem "em-winrm" , :path => '/home/username/em-winrm'

と追加(gemspecとgroupの間に入れました)しました。

gem build knife-windows.gemspec

とビルドをして

bundle install

とした所、ずらずらとメッセージが出て

Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.

のようなメッセージが最後に出て完了しました。

でgem listでインストールを確認しました。

knife-azureのインストール

いよいよknife-azureです。これも先ほどと同様の手順でGemfileを開いて

source "http://www.rubygems.org"

gemspec

group :development do
  gem 'rspec', '>= 2.7.0'
  gem 'guard-rspec'
  gem 'rspec_junit_formatter'
  gem 'rake'
  gem 'mixlib-shellout'
  gem 'active_support'
end

gem "knife-windows", :path => '/home/username/knife-windows'

を追加しました。

同じように

gem build knife-azure.gemspec

でビルドして

bundle install

しました。

サブスクリプションファイル配置

azureのAPIへアクセスする際に必要となるサブスクリプションファイルなるものを
https://manage.windowsazure.com/publishsettings/index?client=xplat
から手にいれます。ダウンロードされたファイル名を変えて「credentials.publishsettings」としました。

今回はtera-termを使っていたので、以下の手順でscpにてファイルを転送しました。

f:id:kikutaro777:20140108233859j:plain

落としたサブスクリプションファイルを指定してsendすればOKです。
f:id:kikutaro777:20140108233927j:plain

knife.rbの編集

サブスクリプションファイルの参照設定をします。
.chefにあるknife.rbを開いて、一番下の行に以下を追加しました。

knife[:azure_publish_settings_file] = '/home/username/credentials.publishsettings'

knife-azureコマンド実行

これで設定完了!

knife azure image list

と入力すると

Name OS Location
0b11de9248dd4d87b18621318e037d37__RightImage-CentOS-6.2-x64-v5.8.8.1 Linux East Asia, Southeast Asia, North Europe, West Europe, Japan East, Japan West, Central US, East US, East US 2, West US
0b11de9248dd4d87b18621318e037d37__RightImage-CentOS-6.3-x64-v5.8.8 Linux East Asia, Southeast Asia, North Europe, West Europe, Japan East, Japan West, Central US, East US, East US 2, West US
0b11de9248dd4d87b18621318e037d37__RightImage-CentOS-6.3-x64-v5.8.8.5 Linux East Asia, Southeast Asia, North Europe, West Europe, Japan East, Japan West, Central US, East US, East US 2, West US
0b11de9248dd4d87b18621318e037d37__RightImage-CentOS-6.3-x64-v5.8.8.6 Linux

~長いので省略~

とイメージの一覧が取得できたり

knife azure server list

と入力すると、今までWindows Azureで作った仮想サーバの一覧が表示されました。

f:id:kikutaro777:20140108234647j:plain

このように手順が確定してしまえばサクサクできるのですが、試行錯誤してやったので長かった(>_<)

正攻法ではない気がしますが、ちゃんと動いたのでとりあえずは良しとします。

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村