上記サイトでは「ホステッドサービス版Enterprise Chef」なるものに登録した手順でしたが、自分はマシンにChefをインストールする所からの手順となります。
knife-azure設定手順
apt-getで更新
とりあえず、最初に
sudo apt-get update
sudo apt-get upgrade
しておきました。
Chefのインストール
Chef触るのは初めてなのですが、「ドットインストール Chef入門」の動画で基本的な構成などを理解しつつ、ネットの情報を調べながら手探りで理解を進めて言った感じです(^^;
Rubyのバージョン確認
ruby -v
でバージョンを確認すると、Ubuntuではそもそもインストールされておらず、以下画面となりました。
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」とのことで、そうしました(^^;
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で依存が定義されてます。
そこで
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"
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
しました。
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で作った仮想サーバの一覧が表示されました。
このように手順が確定してしまえばサクサクできるのですが、試行錯誤してやったので長かった(>_<)
正攻法ではない気がしますが、ちゃんと動いたのでとりあえずは良しとします。