2012年1月16日月曜日

2012年1月3日火曜日

Amazon Linuxで使われてるcloud-initをCentOS6で使ってみる

新年あけましておめでとうございます。
年明け最初の更新をこんなに早くするとは自分でも驚きですが、今年もブログをゆるく継続していきたいと思います。

さて、AWSを使用している方はAmazon Linuxに興味を持った事があると思います。
Redhat系のディストリビューションを使用していた方は操作感も近くてスイッチしやすいのではないでしょうか?
私も何度かAmazon Linuxを使用しましたが、その中でcloud-initってとても便利だなと思いました。
cloud-initはもともとUbuntuに搭載されたクラウド環境でのセットアップツールみたいですが、Amazon Linuxではこの機能が標準で移植されております。
個人的にはChefとかよりもチャラく使えるようなイメージでしょうか。。。
AWSで提供されているUbuntuやAmazon Linuxはcloud-initを使って、指定したSSH公開鍵の設置や、セキュリティアップデートなどが行われているようです。
自前でCentOSなどのAMIを作成した経験がある方はSSHの公開鍵を設置するスクリプトを使った事があると思いますが、Amazon Linuxではcloud-init経由でec2-userに公開鍵を設置しているのですね。

『なるほどー、これはCentOSでも使ってみたいですよねー』というネタです。

■AmazonLinuxで使用されているcloud-initのsrpmを取得する

Amazon Linuxで以下のようにコマンドを実行すると/usr/src/srpm/debug/以下にsrpmが保存されるので、これをCentOSでビルドします。
  1. # get_reference_source -p cloud-init  
  2.   
  3. Requested package: cloud-init  
  4. Found package from local RPM database: cloud-init-0.5.15-20.amzn1  
  5. Corresponding source RPM to found package : cloud-init-0.5.15-20.amzn1.src.rpm  
  6.   
  7. Are these parameters correct? Please type 'yes' to continue: yes  
  8. Source RPM downloaded to: /usr/src/srpm/debug/cloud-init-0.5.15-20.amzn1.src.rpm  
■CentOSでcloud-initのrpmを作成する

ビルドに必要なライブラリをインストールします。
epelをyumのリポジトリに追加している方はPyYAMLとlibyamlもyumでインストールが出来ると思います。
  1. # yum -y groupinstall "Development Tools" "Development Libraries" && yum -y update  
  2. # yum install python-devel python-configobj python-cheetah  
  3. # cd /usr/local/src/  
  4. # wget ftp://ftp.iij.ad.jp/pub/linux/fedora/epel/6/i386/PyYAML-3.09-5.el6.i686.rpm  
  5. # wget ftp://ftp.iij.ad.jp/pub/linux/fedora/epel/6/i386/libyaml-0.1.3-1.el6.i686.rpm  
  6. # rpm -ivh libyaml-0.1.3-1.el6.i686.rpm PyYAML-3.09-5.el6.i686.rpm   
次に事前に転送しておいたcloud-initのsrpmをビルドします。
一部specファイルを以下のように編集しています。
  1. # rpm -ivh --nomd5 cloud-init-0.5.15-20.amzn1.src.rpm   
  2. # cd /root/rpmbuild/  
  3. # grep ^BuildRequire ./SPECS/cloud-init.spec   
  4. BuildRequires: python-devel-abi  
  5. # grep ^Require ./SPECS/cloud-init.spec   
  6. Requires: sudo  
  7. Requires: rpm  
  8. Requires: yum  
  9. Requires:      python-configobj  
  10. Requires:      python-cheetah  
  11. Requires:      python-yaml  
  12. # vi ./cloud-init.spec   
  13.      21 #BuildRequires: python-devel-abi  
  14.      22 BuildRequires: python-devel  
  15.      25 #Requires:      python-yaml  
  16.      26 Requires:      PyYAML  
  17. # grep ^Source ./SPECS/cloud-init.spec   
  18. Source0:   cloud-init-%{version}.tar.gz  
  19. # cd ./SPECS/  
  20. # time rpmbuild -bb --clean ./cloud-init.spec   
  21.   
  22. real 0m0.061s  
  23. user 0m0.043s  
  24. sys 0m0.017s  
■インストール

作成されたcloud-initのrpmをインストールします。
specファイルを見ると分かりますが、インストールするとec2-userやsudoの設定が追加されます。
  1. # rpm -ivh /root/rpmbuild/RPMS/noarch/cloud-init-0.5.15-20.el6.noarch.rpm   
  2. 準備中...                ########################################### [100%]  
  3.    1:cloud-init             ########################################### [100%]  
■動作確認

インストールしたインスタンスからAMIを作成し、以下のようなUserDataを指定して起動してみました。
無事にec2-userへの公開鍵登録と 指定したパッケージがインストールされていましたよ:)
  1. #cloud-config  
  2. packages:  
  3. - httpd  
  4. - postfix  
こんな事するならAmazon Linux使った方が(ryという突っ込みはご勘弁下さい:D