IT井戸端会議

IT井戸端会議

インフラ、ネットワーク、アプリケーション開発、IT界隈の話等々を東京都千代田区界隈から発信します。

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

rubyソースコードをダウンロード。

※バージョンは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