Windows で knife solo を実行する方法


# Windows で knife solo を実行する方法

## まえがき

[サーバ／インフラエンジニア養成読本 DevOps編](http://gihyo.jp/book/2016/978-4-7741-7993-3)を買いました。
読み進めていくうちに「特集２ CircleCIによる継続的インテグレーション入門」でknife-soloコマンドを使うことになっているのですが正常に動かすことができず。
エラーの内容を掘っていってknife自体のソースを変更することでどうにか動かすことができたのでその時のメモを残します。

一通りの流れを記載しますが実際に動かしている環境では他にいろいろ触っていたので他に必要な操作、不要な操作があるかもしれません。

あくまでも今の自分のWindows環境やタイミングを含めて動いているものをメモしているだけなので助けにならない場合もあるのでご容赦ください。

## Cygwinをインストールからパスの設定まで

- CygwinのコマンドをWindowsのコマンドプロンプトから実行できるようにする
[Cygwin インストールからコマンドプロンプトへのパスの登録](http://domisan.sakura.ne.jp/article/cygwin/cygwin.html)
- CygwinにSSHをインストール
[Cygwinにscp,sshコマンドをインストールする](http://win.just4fun.biz/%E9%96%8B%E7%99%BA%E3%83%84%E3%83%BC%E3%83%AB/Cygwin%E3%81%ABssh,scp%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B.html)
- Cygwinにrsyncをインストール - Cygwinとrsyncをインストール
[Vagrant - rsyncでファイルを同期する(Windows)](http://qiita.com/daichi87gi/items/6b33349eedce28db430a#1-4)


## Rubyのインストール
- Rubyの最新版をインストール
今回はRuby 2.2.4 (x64)で試しました。
[Ruby Downloads](http://rubyinstaller.org/downloads/)
- Rubyのパスを通す
```C:\Ruby22-x64\bin```を環境変数のpathに追加しました。

## DEVELOPEMENT KITをインストール
- Rubyをダウンロードしたページにある```DEVELOPEMENT KIT```にあるRuby2.0以上用のファイルをダウンロード
今回は```For use with Ruby 2.0 and above (x64 - 64bits only)
DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe```をダウンロードしました。

- ダウンロードしたファイルを解凍して配置
 
```
C:\Ruby22-x64\devkit
```

に置きました。

- コマンドプロンプトにて以下を実行。
 
dk.rbファイルがない場合、解凍とかファイルの移動とか失敗していると思われます。

```
cd C:\Ruby22-x64\devkit
ruby dk.rb init
ruby dk.rb install
```

## Vagrantをインストール

普通にインストール
[Vagrant](https://www.vagrantup.com/)

## ユーザー用環境変数に home を設定

システムの環境変数には設定しないこと。
↓こんな感じのディレクトリをHOMEに設定する
C:\home\nakagawa

- 個人のhome用ディレクトリを掘る

コマンドプロンプトを起動

```
cd c:\
mkdir home
cd home
mkdir nakagawa
```

- 環境変数を追加、システムの詳細設定から
ユーザーの環境変数に

```HOME C:\home\nakagawa```

を追加

## gemを使ってknife-soloをインストール

```
gem install knife-solo -v 0.5.1
```

## 重要！net-ssh Version2.9.4のソースを変更する

元のソース

```ruby:変更前のpageant.rb
C:\Ruby22-x64\lib\ruby\gems\2.2.0\gems\net-ssh-2.9.4\lib\net\ssh\authentication\pageant.rb
 1:require 'dl/import'
 6:  require 'dl/types'
 7:  require 'fiddle'
40:        extend Dl::Importer
42:        include Dl::Win32Types
44:        SIZEOF_DWORD = Dl::SIZEOF_LONG
```

以下のように変更

```ruby:変更後のpageant.rb
 1:require 'fiddle/import'
 6:  require 'fiddle/types'
 7:  require 'fiddle'
40:        extend Fiddle::Importer
42:        include Fiddle::Win32Types
44:        SIZEOF_DWORD = Fiddle::SIZEOF_LONG
```

DLじゃなくてFiddleを使うようにします。
この時点で動くようになるはず・・・。

## 本の通りにknife-soloを使ってみよう！

- とりあえずCookBooksというディレクトリを作る

```
cd C:\
mkdir cookbooks
cd cookbooks
```

- Knife-soloを実行する

```
knife solo init infra-ci-cookbooks
```

- 作ったCookbookのディレクトリに移動

```
cd infra-ci-cookbooks
```

- Vagrant というファイルを作り以下の内容を記載する

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

Vagrant.configure(2) do |config|
  config.vm.box = "bento/centos-7.1"
  config.vm.define :webapp do |host|
    host.vm.hostname = "webapp"
  end
end
```
- Vagrantを起動

```
vagrant up webapp
```

- sshの接続情報を出力

```
vagrant ssh-config webapp >> vagrant_ssh_config
```

- Vagrant内の仮想環境にCookbookを注入！

```
knife solo prepare webapp -F vagrant_ssh_config
```

これが正常に通れば書籍の通りに試せるはず！