AmazonLinuxでChefSoloを試す(4) リモートサーバへのRecipeの適用
第4回目です。
今回は、knife soloを使用したリモートサーバへのRecipeの適用を実施します。
作業対象ホスト
第3回に引き続き、2台のEC2インスタンスを使用します。
(1)knife(AmazonLinux) ※第1回/第2回にて使用のインスタンス。以下、knifeと表記します
(2)soloclient(AmazonLinux) ※今回より新しく構築のサーバ。以下、soloclientと表記します
リモートサーバ用cookbookの作成
knife cookbook create dstat -o /tmp/chef/cookbooks
vi /tmp/chef/cookbooks/dstat/recipes/default.rb
#
# Cookbook Name:: dstat
# Recipe:: default
#
# Copyright 2015, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
package "dstat" do
action :install
end
nodeオブジェクトの作成
第3回の最後で生成された事を確認したjsonファイルを編集します。
vi /tmp/chef/nodes/***.***.***.***.json
※jsonファイルの名称には、リモートサーバのIPアドレスが使用されます
ファイルの内容は以下とします。
{
"run_list": [
"recipe[dstat]"
],
"automatic": {
"ipaddress": "***.***.***.***"
}
}
最後に、リモートサーバ、soloclientにrecipeを適用します。
knife solo cook ***.***.***.***
recipe適用後、soloclientにて
dstatがインストールされたことを確認して下さい。
AmazonLinuxでChefSoloを試す(3) リモートサーバへのChefのインストール
3回目になります。
今回は、Chef-Soloを便利にするツール knife-soloを使って
リモートーサーバに対しRecipeを実行してみたいと思います。
作業対象ホスト
今回は2台のEC2インスタンスを使用します。
ホスト名は以下とします。
(1)knife(AmazonLinux) ※第1回/第2回にて使用のインスタンス。以下、knifeと表記します
(2)soloclient(AmazonLinux) ※今回より新しく構築のサーバ。以下、soloclientと表記します
事前の環境設定
事前にknifeからsoloclientに
ssh接続できるように設定しておいて下さい。
手順の概要は以下となります。
1.EC2インスタンス[knife]の/home/ec2-user/.ssh/配下に
[soloclient]用の鍵を配置する。(Permissionは600とする)
2./etc/ssh/ssh_config の末尾に以下レコードを追記
IdentityFile [手順1で配置した鍵の絶対パス]
3.knifeよりsoliclientにssh接続できることを確認
knife-soloのインストール
まずは、knifeにknife-soloをインストールします。
sudo /opt/chef/embedded/bin/gem install knife-solo --no-ri --no-rdoc
インストール完了後、knife soloコマンドが実行可能である事を確認します。
$ knife solo
FATAL: Cannot find sub command for: "solo"
Available solo subcommands: (for details, knife SUB-COMMAND --help)
** SOLO COMMANDS **
knife solo bootstrap [USER@]HOSTNAME [JSON] (options)
knife solo clean [USER@]HOSTNAME
knife online casino nederland solo cook [USER@]HOSTNAME [JSON] (options)
knife solo init DIRECTORY
knife solo prepare [USER@]HOSTNAME [JSON] (options)
今までは、/var/chef配下に必要なcookbookを 作成してきましたが、これらについては一度全て削除し /tmp配下に必要なファイルを再度作成していきます。
$ sudo rm -fr /var/chef
$ mkdir /tmp/chef
$ cd /tmp/chef
その後、knife solo initコマンドで /var/chef配下に必要なファイル群を再度生成します。
$ knife solo init .
WARNING: No knife configuration file found
Creating kitchen...
Creating knife.rb in kitchen...
Creating cupboards...
soro.rbについても再度作成します。
vi /tmp/chef/soro.rb
# solo.rb
file_cache_path "/tmp/chef"
cookbook_path ["/tmp/chef/cookbooks"]
リモートサーバへのChefのインストール
次に、knife solo bootstrapコマンドにて soloclientにChefSoloをインストールします。
$ knife solo bootstrap <soloclientのIPアドレス>
インストールが完了したら、 /tmp/chef/nodes配下にjsonファイルが作成されたことを確認して下さい。 このファイルは次回使用します。
$ ls -l /tmp/chef/nodes
total 4
-rw-rw-r-- 1 ec2-user ec2-user 79 Jul 4 08:42 ***.***.***.***.json
最後に、soloclientにて、chef-solo -vコマンドを実行し
chefのバージョンが表示されることを確認して下さい。
AmazonLinuxでChefSoloを試す(2) httpdのインストール
前回から引き続きやっていきます。
今回は、httpdをインストールするcookbookを作ってみましょう。
まずは前回と同様にknifeコマンドにてCookbookを作りましょう。
$ sudo knife cookbook create install_httpd -o /var/chef/cookbooks
次にhttpdインストール用のrecipeを作成します。
$ sudo vi /var/chef/cookbooks/install_httpd/recipes/default.rb
recipeの内容は以下とします。
# # Cookbook Name:: install_httpd # Recipe:: default # # Copyright 2015, YOUR_COMPANY_NAME # # All rights reserved - Do Not Redistribute # # httpdの状態はinstalledとすること package "httpd" do action :install end # service httpd の状態は running とする事 service "httpd" do action [ :enable, :start ] end
最後に、Cookbookを実行します。
$ sudo chef-solo -o install_httpd
実行に成功すると以下のように実行ログが出力されます。
[2015-07-04T07:05:53+00:00] WARN: Overridden Run List: [recipe[install_httpd]] Compiling Cookbooks... Converging 2 resources Recipe: install_httpd::default * yum_package[httpd] action install - install version 2.2.29-1.5.amzn1 of package httpd * service[httpd] action enable - enable service service[httpd] * service[httpd] action start - start service service[httpd] Running handlers: Running handlers complete Chef Client finished, 3/3 resources updated in 3.480730062 seconds
最後にhttpdがインスールされて起動中である事を確認しましょう。
$ rpm -qa | grep httpd httpd-2.2.29-1.5.amzn1.x86_64 httpd-tools-2.2.29-1.5.amzn1.x86_64 $ sudo service httpd status httpd (pid 3489) is running...
AmazonLinuxでChefSoloを試す(1)
今回は、AmazonLinuxにChefSoloを導入する手順を紹介します。
入門編なのでまずはHello World!するところまでになります。
インストールと初期設定
ChefSoloのインストールに際しては、 chef開発元のopscode社のホームページに導入用スクリプトが公開されてるので それを利用していくのが簡単です。
sudo curl -L https://www.opscode.com/chef/install.sh | sudo bash
インストール完了後、以下のコマンドにてChefSoloのバージョンが
出力されることを確認して下さい。
chef-solo -v
CookbookとRecipeの作成
さっそくcookbookを作ってみましょう!
sudo knife cookbook create hello -o /var/chef/cookbooks
knifeコマンドの実行が完了すると、/var/chef/cookbooks配下に
helloディレクトリが生成されます。
生成されたChefの基本設定ファイルsoro.rbに
cookbookのパスを追記します。
sudo vi /var/chef/soro.rb
追記内容:
# solo.rb file_cache_path "/tmp/chef-solo" cookbook_path ["/var/chef/cookbooks"]
次に、レシピの編集に入ります。
以下のファイルの文末に、「 log "Hello World!" 」と追記して下さい。
sudo vi /var/chef/cookbooks/hello/recipes/default.rb
# # Cookbook Name:: hello # Recipe:: default # # Copyright 2015, YOUR_COMPANY_NAME # # All rights reserved - Do Not Redistribute # log "Hello World!"
Cookbookの実行
最後に、chef-soloコマンドにてクックブックHelloを実行します。
sudo chef-solo -o hello
以下のように出力されれば実行成功です。
[2015-06-24T13:55:21+00:00] WARN: Overridden Run List: [recipe[hello]] Compiling Cookbooks... Converging 1 resources Recipe: hello::default * log[Hello World!] action write Running handlers: Running handlers complete Chef Client finished, 1/1 resources updated in 0.799540117 seconds
chef-soloのレシピ例
ファイルのダウンロード(command)
execute "down" do command <<-EOC wget "https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.2_x86_64.rpm" EOC end
ファイルのダウンロード(remote_file)
remote_file "/root/chef-repo/cookbooks/download/files/vagrant_1.7.2_x86_64.rpm" do source "https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.2_x86_64.rpm" end$ mkdir /etc/chef
rpmパッケージのインストール
rpm_package "vagrant_install" do source "/root/chef-repo/cookbooks/rpm_test/files/default/vagrant_1.7.2_x86_64.rpm" action :install end
ファイル編集
ファイルにworkの文字列が存在しない場合のみ追記
bash "add text" do not_if 'grep "work" /root/testfile' code <<-EOC echo "work" >> /root/testfile EOC end
ファイルにokの文字列が存在した場合に置換①
execute 'replace_sed' do command "sed -i -e 's/ok/NG/g' /root/testfile" action :run end
ファイルにokの文字列が存在した場合に置換②
file "/root/testfile" do f = Chef::Util::FileEdit.new(path) f.search_file_replace('ok','NG') f.write_file end
ディレクトリを作成
directory "/root/test_dir" do owner "root" group "root" mode 0755 action :create end
ファイルを作成(作成時に"Chef file test"を記載)
file "/root/testfile" do content "Chef file test" owner "root" group "root" mode 00755 action :create end
サービス起動
service "ntpd" do action :start end
ntpdをchkconfigコマンドを使用して設定がoffの場合のみonに設定
bash "start ntpd" do only_if "chkconfig --list ntpd | grep 3:off" code <<-EOC chkconfig ntpd on EOC end
cookbookのtemplate/test/testfile.erbを/root/testfileに配布
template "/root/testfile" do source 'test/testfile.erb' mode '0700' owner 'root' end
chef-soloにてyum実行
開発環境
OS:CentOS6.6(64bit) ruby:2.2.2p95 rubygems:2.4.5
knife-soloをインストール
$ gem install knife-solo
リポジトリ(キッチン)をカレントディレクトリにchef-repoの名前で作成
$ knife solo init chef-repo Creating kitchen... Creating knife.rb in kitchen... Creating cupboards... $ ls ./chef-repo total 24 drwxr-xr-x. 2 root root 4096 Jul 3 16:00 cookbooks drwxr-xr-x. 2 root root 4096 Jul 3 16:00 data_bags drwxr-xr-x. 2 root root 4096 Jul 3 16:00 environments drwxr-xr-x. 2 root root 4096 Jul 3 16:00 nodes drwxr-xr-x. 2 root root 4096 Jul 3 16:00 roles drwxr-xr-x. 2 root root 4096 Jul 3 16:00 site-cookbooks
chef-soloコマンドの設定ファイルを設定※デフォルト
$ mkdir /etc/chef $ vi /etc/chef/solo.rb
solo.rbの中身
cookbook_path ["/root/chef-repo/cookbooks"]
cookbookをyum_tesetの名前で作成
$ cd ./chef-repo $ knife cookbook create yum_test -o ./cookbooks ** Creating cookbook yum_test in /root/chef-repo/cookbooks ** Creating README for cookbook: yum_test ** Creating CHANGELOG for cookbook: yum_test ** Creating metadata for cookbook: yum_test $ ls -l ./cookbooks/yum_test/ total 44 drwxr-xr-x. 2 root root 4096 Jul 3 16:05 attributes -rw-r--r--. 1 root root 459 Jul 3 16:05 CHANGELOG.md drwxr-xr-x. 2 root root 4096 Jul 3 16:05 definitions drwxr-xr-x. 3 root root 4096 Jul 3 16:05 files drwxr-xr-x. 2 root root 4096 Jul 3 16:05 libraries -rw-r--r--. 1 root root 280 Jul 3 16:05 metadata.rb drwxr-xr-x. 2 root root 4096 Jul 3 16:05 providers -rw-r--r--. 1 root root 1464 Jul 3 16:05 README.md drwxr-xr-x. 2 root root 4096 Jul 3 16:05 recipes drwxr-xr-x. 2 root root 4096 Jul 3 16:05 resources drwxr-xr-x. 3 root root 4096 Jul 3 16:05 templates
epelをyumにてインストールするrecipeを作成
$ vi ./cookbooks/yum_test/recipe/default.rb
default.rbの中身
# # Cookbook Name:: yum_test # Recipe:: default # # Copyright 2015, YOUR_COMPANY_NAME # # All rights reserved - Do Not Redistribute # yum_package "epel-release" do action :install end
chefの実行(レシピ指定)
※cookbookがyum_testで実行するレシピがdefault.rbの場合
$ chef-solo -o yum_test::default Starting Chef Client, version 12.4.0 [2015-07-03T16:15:31+00:00] WARN: Run List override has been provided. [2015-07-03T16:15:31+00:00] WARN: Original Run List: [] [2015-07-03T16:15:31+00:00] WARN: Overridden Run List: [recipe[yum_test::default]] Compiling Cookbooks... Converging 1 resources Recipe: yum_test::default * yum_package[epel-release] action install - install version 6-8 of package epel-release Running handlers: Running handlers complete Chef Client finished, 1/1 resources updated in 6.271077625 seconds
再度実行すると既にインストールされているので下記となる
$ chef-solo -o yum_test::default Starting Chef Client, version 12.4.0 [2015-07-03T16:17:55+00:00] WARN: Run List override has been provided. [2015-07-03T16:17:55+00:00] WARN: Original Run List: [] [2015-07-03T16:17:55+00:00] WARN: Overridden Run List: [recipe[yum_test::default]] Compiling Cookbooks... Converging 1 resources Recipe: yum_test::default * yum_package[epel-release] action install (up to date) Running handlers: Running handlers complete Chef Client finished, 0/1 resources updated in 6.735517023 seconds
chefの実行(jsonから)
test.jsonの中身
{ "run_list": [ "recipe[yum_test::default]" ] }
chefの実行
$ chef-solo -j test.json Starting Chef Client, version 12.4.0 Compiling Cookbooks... Converging 1 resources Recipe: yum_test::default * yum_package[epel-release] action install - install version 6-8 of package epel-release Running handlers: Running handlers complete Chef Client finished, 1/1 resources updated in 6.347717699 seconds
CentOSにchef-soloをインストール
開発環境
OS:CentOS6.6(64bit) ruby:2.2.2p95 rubygems:2.4.5
rubyのソースをコンパイルしてインストールするためgccをインストール
$ yum -y install gcc
※バージョンはgemが動作する1.9以上であれば問題なしDownload Ruby
$ wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.2.tar.gz
展開してインストール※ドキュメントは不要のため除外
$ tar xf ./ruby-2.2.2.tar.gz $ cd ruby-2.2.2 $ ./configure --disable-doc $ make $ make install
シンボリックリンクを作成
$ ln -s /usr/local/bin/ruby /usr/bin/ruby $ ln -s /usr/local/bin/gem /usr/bin/gem
chefパッケージのインストール
$ gem install chef ERROR: Loading command: install (LoadError) cannot load such file -- zlib ERROR: While executing gem ... (NoMethodError) undefined method `invoke_with_build_args' for nil:NilClass
zlibについて無いとのエラーが出たので個別に対応
$ yum -y install zlib-devel $ find / -type f -name invoke_with_build_args /root/ruby-2.2.2/ext/zlib $ cd /root/ruby-2.1.6/ext/zlib $ ruby extconf.rb $ make $ make install
再度rubyをインストール
$ cd ruby-2.2.2 $ ./configure --disable-doc $ make $ make install
再度chefパッケージをインストール
$ gem install chef ERROR: While executing gem ... (Gem::Exception) Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources
今度はopensslが必要とされているようなので個別に対応
$ yum -y install openssl-devel $ cd /root/ruby-2.2.2/ext/openssl $ ruby extconf.rb $ make make: *** `ossl.o' に必要なターゲット `/thread_native.h' を make するルールがあ りません. 中止.
Makefileにtopdirの次くらいにtop_scrdirのパスを追加
$ find / -type f -name thread_native.h /root/ruby-2.2.2/thread_native.h $ vi Makefile top_srcdir = /root/ruby-2.2.2
再度makeとinstall
$ make $ make install
再々度chefパッケージをインストール
$ gem install chef
chefのインストール確認
$ chef-solo -version Chef: 12.4.0