Itamae on AWS - Itamae の EC2 へのインストールとレシピ適用 -


普段は Chef でレシピを書いているのですが、Itamae Meetup #1 に向けて Itamae を触ってみました。
エージェントレスで実行できるのは魅力ですね。

AWS EC2 上で Itamae を使ってみようとしたのですが、Amazon Linux のバージョンが上がったからか、いくつかつまずきポイントがありました。
「これだけやれば EC2 上で使える！」というまとめがなかったので書いてみます。

## 前提

* Amazon Linux AMI release 2015.09
* リモート実行するために、同じVPC、同じサブネット内に EC2 を2つ立てています。
	* Itamae をインストール／レシピを保持するサーバ
	* Itamae レシピを適用されるサーバ

## Install

片方のサーバに Itamae をインストールしてみます。
io-console をインストールしないと、
`/usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in require: cannot load such file -- io/console (LoadError)`
と怒られます。

```
[ec2-user@ip-172-31-31-189 ~]$ sudo gem install itamae
Fetching: thor-0.19.1.gem (100%)
Successfully installed thor-0.19.1
Fetching: net-ssh-2.9.2.gem (100%)
...
Installing ri documentation for itamae-1.8.0
Done installing documentation for thor, net-ssh, net-scp, net-telnet, sfl, specinfra, hashie, ansi, schash, itamae after 8 seconds
10 gems installed
```

```
[ec2-user@ip-172-31-31-189 ~]$ sudo yum install ruby-devel gcc-c++
読み込んだプラグイン:priorities, update-motd, upgrade-helper
amzn-main/latest                    

rch 0:4.8.3-3.20.amzn1                ruby-devel.noarch 1:2.0-0.3.amzn1               
...
依存性関連をインストールしました:
  cpp48.x86_64 0:4.8.3-9.109.amzn1                gcc.noarch 0:4.8.3-3.20.amzn1                    
  gcc48.x86_64 0:4.8.3-9.109.amzn1                gcc48-c++.x86_64 0:4.8.3-9.109.amzn1             
  glibc-devel.x86_64 0:2.17-78.161.amzn1          glibc-headers.x86_64 0:2.17-78.161.amzn1         
  kernel-headers.x86_64 0:4.1.13-18.26.amzn1      libgomp.x86_64 0:4.8.3-9.109.amzn1               
  libmpc.x86_64 0:1.0.1-3.3.amzn1                 libstdc++48-devel.x86_64 0:4.8.3-9.109.amzn1     
  mpfr.x86_64 0:3.1.1-4.14.amzn1                  ruby20-devel.x86_64 0:2.0.0.647-1.28.amzn1       

完了しました!
```

```
[ec2-user@ip-172-31-31-189 ~]$ sudo gem install io-console
Building native extensions.  This could take a while...
Successfully installed io-console-0.4.2
Parsing documentation for io-console-0.4.2
Installing ri documentation for io-console-0.4.2
Done installing documentation for io-console after 0 seconds
1 gem installed
```


## レシピの作成
今回は Git をインストールするためのレシピを書きます。

```Ruby:git.rb
package "git" do
        action :install
end
```

## ローカル実行する

Gitがインストールされていないことを確認します。

```
[ec2-user@ip-172-31-31-189 ~]$ git --version
-bash: git: コマンドが見つかりません
```

ローカルにレシピ適用してみます。

```
[ec2-user@ip-172-31-31-189 ~]$ sudo /usr/local/bin/itamae local git.rb
 INFO : Starting Itamae...
 INFO : Recipe: /home/ec2-user/git.rb
 INFO :   package[git] installed will change from 'false' to 'true'
```

インストールされているようです。↓

```
[ec2-user@ip-172-31-31-189 ~]$ git --version
git version 2.4.3
```

## リモートサーバにレシピ適用する
リモートサーバにSSHし、Gitがインストールされていないことを確認します。

```
[ec2-user@ip-172-31-31-189 ~]$ ssh -i hoge.key ec2-user@52.193.5.33
Last login: Tue Dec  8 17:06:28 2015 from 52.192.181.173

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2015.09-release-notes/
3 package(s) needed for security, out of 8 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-172-31-31-190 ~]$ git --version
-bash: git: コマンドが見つかりません
```

このサーバに対してレシピを実行します。

```
[ec2-user@ip-172-31-31-189 ~]$ sudo /usr/local/bin/itamae ssh -h 52.193.5.33 -i hoge.key -u ec2-user git.rb 
 INFO : Starting Itamae...
 INFO : Recipe: /home/ec2-user/git.rb
 INFO :   package[git] installed will change from 'false' to 'true'
```

うまくレシピ適用できているようです。↓

```
[ec2-user@ip-172-31-31-189 ~]$ ssh -i hoge.key ec2-user@52.193.5.33
Last login: Tue Dec  8 17:06:28 2015 from 52.192.181.173

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2015.09-release-notes/
3 package(s) needed for security, out of 8 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-172-31-31-190 ~]$ git --version
git version 2.4.3
```

## まとめ
Itamae の EC2 へのインストール、EC2 へのレシピ適用ができました。
パスを通したりなど細かい話はいったん置いておいて、最低限使えるところまで。
Chef のレシピはそのまま移行できるのかなど細かいことは分かっていないので色々試していきたいです。