ライン

ポイント:*

ライン

 はじめに

CentOS 6.7

 今回は、もう古いぜ…といわれているchef-soloのメモを書きます。
Ansibleで生活し始めているのに今更…という感じではあるのですけど、ちょっと忘れないようにメモだけ残すことにしました。

 VMware 以下にゲストを2台準備します。両方ともにCentOS 6.7を利用することにしました。
minimalに必要なものを適当に加えただけのベースより準備しています。

 chef-soloを準備するマシン側

 Macでも良かったのですが、今回はCentOS 6.7のマシンにしています。
これまで使っていた環境を思い出しつつ用意してみるつもりです。

 CentOS 6.7のyumで導入されるRUBYは期待するバージョンよりも低いので、うまくいきませんでした。
以下、gemでchefを入れる際に表示されたエラーメッセージです。CentOS 6.7のyumでrubyをインストールすると入るバージョンが、1.8.7なのです。

ERROR:  Error installing chef:
         mixlib-shellout requires Ruby version >= 1.9.3.

 ということで、chef-soloでsshする元マシンには、手でmakeしたRUBYをインストールする必要があるのですが、wget gcc openssl-devel zlib-devel rcyncが必要になると分かってるので、事前導入をしておきます。コマンドは省略してもいいですよね…。

# cd /root
# wget https://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.7.tar.gz
# tar pzxvf ruby-2.1.7.tar.gz
# cd ruby-2.1.7/
# ./configure --prefix=/usr
# make
# make install
# ruby -v
ruby 2.1.7p400 (2015-08-18 revision 51632) [x86_64-linux]

 続いて、rubygems。

cd /root
# wget http://production.cf.rubygems.org/rubygems/rubygems-2.4.8.tgz
# tar pzxvf rubygems-2.4.8.tgz
# cd rubygems-2.4.8
# ruby setup.rb
# gem -v
2.4.8

次は、chef。

# gem install chef --no-rdoc --no-ri
Fetching: mixlib-config-2.2.1.gem (100%)
Successfully installed mixlib-config-2.2.1
Fetching: mixlib-shellout-2.2.6.gem (100%)
Successfully installed mixlib-shellout-2.2.6
Fetching: chef-config-12.7.2.gem (100%)
Successfully installed chef-config-12.7.2
Fetching: libyajl2-1.2.0.gem (100%)
Building native extensions.  This could take a while...
Successfully installed libyajl2-1.2.0
Fetching: ffi-yajl-2.2.3.gem (100%)
Building native extensions.  This could take a while...
Successfully installed ffi-yajl-2.2.3
Fetching: hashie-3.4.3.gem (100%)
Successfully installed hashie-3.4.3
Fetching: mixlib-log-1.6.0.gem (100%)
Successfully installed mixlib-log-1.6.0
Fetching: rack-1.6.4.gem (100%)
Successfully installed rack-1.6.4
Fetching: uuidtools-2.1.5.gem (100%)
Successfully installed uuidtools-2.1.5
Fetching: chef-zero-4.5.0.gem (100%)
Successfully installed chef-zero-4.5.0
Fetching: diff-lcs-1.2.5.gem (100%)
Successfully installed diff-lcs-1.2.5
Fetching: erubis-2.7.0.gem (100%)
Successfully installed erubis-2.7.0
Fetching: highline-1.7.8.gem (100%)
Successfully installed highline-1.7.8
Fetching: rspec-support-3.4.1.gem (100%)
Successfully installed rspec-support-3.4.1
Fetching: rspec-core-3.4.2.gem (100%)
Successfully installed rspec-core-3.4.2
Fetching: rspec-expectations-3.4.0.gem (100%)
Successfully installed rspec-expectations-3.4.0
Fetching: rspec-mocks-3.4.1.gem (100%)
Successfully installed rspec-mocks-3.4.1
Fetching: mixlib-authentication-1.4.0.gem (100%)
Successfully installed mixlib-authentication-1.4.0
Fetching: mixlib-cli-1.5.0.gem (100%)
Successfully installed mixlib-cli-1.5.0
Fetching: net-ssh-3.0.2.gem (100%)
Successfully installed net-ssh-3.0.2
Fetching: net-ssh-gateway-1.2.0.gem (100%)
Successfully installed net-ssh-gateway-1.2.0
Fetching: net-ssh-multi-1.2.1.gem (100%)
Successfully installed net-ssh-multi-1.2.1
Fetching: ffi-1.9.10.gem (100%)
Building native extensions.  This could take a while...
Successfully installed ffi-1.9.10
Fetching: ipaddress-0.8.2.gem (100%)
Successfully installed ipaddress-0.8.2
Fetching: systemu-2.6.5.gem (100%)
Successfully installed systemu-2.6.5
Fetching: wmi-lite-1.0.0.gem (100%)
Successfully installed wmi-lite-1.0.0
Fetching: ohai-8.10.0.gem (100%)
Successfully installed ohai-8.10.0
Fetching: plist-3.1.0.gem (100%)
Successfully installed plist-3.1.0
Fetching: proxifier-1.0.3.gem (100%)
Successfully installed proxifier-1.0.3
Fetching: builder-3.2.2.gem (100%)
Successfully installed builder-3.2.2
Fetching: rspec_junit_formatter-0.2.3.gem (100%)
Successfully installed rspec_junit_formatter-0.2.3
Fetching: multi_json-1.11.2.gem (100%)
Successfully installed multi_json-1.11.2
Fetching: rspec-3.4.0.gem (100%)
Successfully installed rspec-3.4.0
Fetching: rspec-its-1.2.0.gem (100%)
Successfully installed rspec-its-1.2.0
Fetching: net-scp-1.2.1.gem (100%)
Successfully installed net-scp-1.2.1
Fetching: net-telnet-0.1.1.gem (100%)
Successfully installed net-telnet-0.1.1
Fetching: sfl-2.2.gem (100%)
Successfully installed sfl-2.2
Fetching: specinfra-2.51.0.gem (100%)
Successfully installed specinfra-2.51.0
Fetching: serverspec-2.29.2.gem (100%)
Successfully installed serverspec-2.29.2
Fetching: syslog-logger-1.6.8.gem (100%)
Successfully installed syslog-logger-1.6.8
Fetching: chef-12.7.2.gem (100%)
Successfully installed chef-12.7.2
41 gems installed

 いろいろなものと一緒にインストールされました。

# gem install knife-solo --no-rdoc --no-ri
Fetching: net-ssh-2.9.4.gem (100%)
Successfully installed net-ssh-2.9.4
Fetching: knife-solo-0.5.1.gem (100%)
Thanks for installing knife-solo!

If you run into any issues please let us know at:
  https://github.com/matschaffer/knife-solo/issues

If you are upgrading knife-solo please uninstall any old versions by
running `gem clean knife-solo` to avoid any errors.

See http://bit.ly/CHEF-3255 for more information on the knife bug
that causes this.
Successfully installed knife-solo-0.5.1
2 gems installed

 動かすための事前準備を始めます。利用するユーザ等からです。

# useradd -d /home/chefadmin -s /bin/bash -u 555 -m chefadmin -G wheel
# su chefadmin
$ cd
$ knife solo init chef-repo
WARNING: No knife configuration file found
Creating kitchen...
Creating knife.rb in kitchen...
Creating cupboards...

 動作することは確認。

$ cd /home/chefadmin/chef-repo/.chef
$ cp -p knife.rb knife.rb_orig
$ vi knife.rb

 中身は、chef soloなので、すべて削除して以下を追加。

environment_path        '/home/chefadmin/chef-repo/environments'
role_path               '/home/chefadmin/chef-repo/roles'
cookbook_path           '/home/chefadmin/chef-repo/site-cookbooks'
data_bag_path           '/home/chefadmin/chef-repo/data_bags'

 次は、リモート先に接続できるように、/etc/hostsに記述を追加。IP直でも、DNS登録でもいいのですが、ここは簡単に済ませました。

192.168.1.24 testtarget

 のように。

リモート先に接続するためのアカウント等の準備

 ここで、sshでパスワードなしでログインして、sudoでもパスワードなしでrootに上がる必要があります。
これを実現するための準備をします。

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/chefadmin/.ssh/id_rsa):
Created directory '/home/chefadmin/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/chefadmin/.ssh/id_rsa.
Your public key has been saved in /home/chefadmin/.ssh/id_rsa.pub.
The key fingerprint is:
69:7f:bc:dc:2f:96:d8:03:e8:9e:ee:4f:eb:86:ad:bc chefadmin@chefbase
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|         .       |
|        S  .     |
|       . ....    |
|         ..o++ . |
|         .o=++*  |
|         +E**..+.|
+-----------------+

この後は、リモート側で必要な事前作業です。

 リモート側の事前作業

スクリプトにしておけば良さそう

 前の作業でできた公開鍵を設置するための作業。
まず、rsyncがないと接続できなので、これを先に入れておきます。

# yum install rsync

 次は、ユーザの準備とsudoの設定、および鍵の準備です。

# useradd -d /home/chefadmin -s /bin/bash -u 555 -m chefadmin -G wheel
# mkdir -p /home/chefadmin/.ssh
# chown chefadmin:chefadmin /home/chefadmin/.ssh
# echo "ssh-rsa ~ chefadmin@chefbase" >> /home/chefadmin/.ssh/authorized_keys
# chmod 600  /home/chefadmin/.ssh/authorized_keys
# chown chefadmin:chefadmin  /home/chefadmin/.ssh/authorized_keys
# echo '%wheel  ALL=(ALL)       NOPASSWD: ALL' >> /etc/sudoers

 こんな感じで完了。wheelグループのみが sudoでパスワードなしでrootになれるようにしていますが、chefadminに限定しても良いでしょう。
元サーバから、ssh testtargetでログインできることと、sudo -iでrootになれたことを確認しておきましょう。

# uname -n
testtarget
# id
uid=0(root) gid=0(root) 所属グループ=0(root)

これでリモートの準備は終わりです。

 リモートにchefをインストール、そして動作確認

リモートにchefを導入

 リモートの先にもRUBYが必要と思っていましたが、これは不要でした。初回のみ、chefの導入を元サーバより実施します。。

$ knife solo prepare testtarget
WARNING: No knife configuration file found
Bootstrapping Chef...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 20022  100 20022    0     0  17470      0  0:00:01  0:00:01 --:--:-- 61417
Getting information for chef stable 12.7.2 for el...
downloading https://omnitruck-direct.chef.io/stable/chef/metadata?v=12.7.2&p=el&pv=6&m=x86_64
  to file /tmp/install.sh.1937/metadata.txt
trying curl...
url     https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chef-12.7.2-1.el6.x86_64.rpm
md5     8c3ba2e797fc852fc557b0e7157556cc
sha256  6af0eb1c7706fc6a36f74ae9f590135e37e6206f2fe7d5a1760c1e2da1b36068
version 12.7.2downloaded metadata file looks valid...
downloading https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chef-12.7.2-1.el6.x86_64.rpm
  to file /tmp/install.sh.1937/chef-12.7.2-1.el6.x86_64.rpm
trying curl...
Comparing checksum with sha256sum...
Installing chef 12.7.2
installing with rpm...
警告: /tmp/install.sh.1937/chef-12.7.2-1.el6.x86_64.rpm: ヘッダ V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
準備中...                ########################################### [100%]
   1:chef                   ########################################### [100%]
Thank you for installing Chef!
Generating node config 'nodes/testtarget.json'...

こんな感じ。

$ cd chef-repo/
$ ll
合計 24
drwxrwxr-x 2 chefadmin chefadmin 4096  2月 12 21:29 2016 cookbooks
drwxrwxr-x 2 chefadmin chefadmin 4096  2月 12 21:29 2016 data_bags
drwxrwxr-x 2 chefadmin chefadmin 4096  2月 12 21:29 2016 environments
drwxrwxr-x 2 chefadmin chefadmin 4096  2月 12 21:29 2016 nodes
drwxrwxr-x 2 chefadmin chefadmin 4096  2月 12 21:29 2016 roles
drwxrwxr-x 2 chefadmin chefadmin 4096  2月 12 21:29 2016 site-cookbooks

 テストは、ありがちなapacheのインストールと起動を行うこととします。
nodes以下に接続先を書くこと、site-cookbooks以下にcookbookの追加を行います。

$ cd nodes/
$ vi testtarget.json

 中身はこんな感じにしました。

{
  "run_list": [
    "recipe[test]"
  ],
  "automatic": {
    "ipaddress": "testtarget"
  }
}

…ということで、testという cookbookを準備します。

$ knife cookbook create test -o site-cookbooks
** Creating cookbook test in /home/chefadmin/chef-repo/site-cookbooks
** Creating README for cookbook: test
** Creating CHANGELOG for cookbook: test
** Creating metadata for cookbook: test

 これでできました。

$ cd /home/chefadmin/chef-repo/site-cookbooks/test/recipes
$ vi default.rb 

 お試しは以下を書きました。

#
# Cookbook Name:: test
# Recipe:: default
#
# Copyright 2016, fkimura
#
# All rights reserved - Do Not Redistribute
#
package "httpd" do
  action :install
end

service "httpd" do
  action :start
end

では、準備が終わりましたので、実行しましょう。

$ cd /home/chefadmin/chef-repo
$ knife solo cook testtarget
Running Chef on testtarget...
Checking Chef version...
Uploading the kitchen...
Generating solo config...
Running Chef: sudo chef-solo -c ~/chef-solo/solo.rb -j ~/chef-solo/dna.json
Starting Chef Client, version 12.7.2
Compiling Cookbooks...
Converging 2 resources
Recipe: test::default
  * yum_package[httpd] action install
    - install version 2.2.15-47.el6.centos.3 of package httpd
  * service[httpd] action start
    - start service service[httpd]

Running handlers:
Running handlers complete
Chef Client finished, 2/2 resources updated in 06 seconds

無事リモートで操作が行えました。
リモート側を見てみましょう。

# ps axu|grep httpd|grep -v grep
root      3331  0.0  0.1 177344  3836 ?        Ss   22:19   0:00 /usr/sbin/httpd
apache    3333  0.0  0.1 177344  2472 ?        S    22:19   0:00 /usr/sbin/httpd
apache    3334  0.0  0.1 177344  2472 ?        S    22:19   0:00 /usr/sbin/httpd
apache    3335  0.0  0.1 177344  2472 ?        S    22:19   0:00 /usr/sbin/httpd
apache    3336  0.0  0.1 177344  2472 ?        S    22:19   0:00 /usr/sbin/httpd
apache    3337  0.0  0.1 177344  2472 ?        S    22:19   0:00 /usr/sbin/httpd
apache    3338  0.0  0.1 177344  2472 ?        S    22:19   0:00 /usr/sbin/httpd
apache    3339  0.0  0.1 177344  2488 ?        S    22:19   0:00 /usr/sbin/httpd
apache    3340  0.0  0.1 177344  2472 ?        S    22:19   0:00 /usr/sbin/httpd

 導入されて、起動もできていました。
最後に、元側よりお掃除コマンド。

$ knife solo clean testtarget
Cleaning up testtarget...

リモート側のディレクトリを見ると、

# ll /home/chefadmin/
合計 20
-rw-rw-r-- 1 chefadmin chefadmin 20022  2月 12 21:58 2016 install.sh

のようにお掃除されていました。
後は、クックブックとレシピをどんどん書いていけば、構築ができるようになりますので、便利に使えそうです。
個人的には慣れがあるので、Ansibleよりも細かく書けますが、今後はどうなのだろう。

この後は、chef-zeroで同様を試すことを予定しています。


【改訂履歴】作成:2016/02/12


【参照ページ】

knife-soloによるChefの実行 - Qiita
Chef Soloの正しい始め方 tsuchikazu blog
Chef Soloと Knife Soloでの ニコニコサーバー構築 (3)
5分でChef Cookbookを作成する アライドアーキテクツ エンジニアブログ
はじめてのChef Solo - kzy52's blog

 
Copyright © 1996,1997-2006,2007- by F.Kimura,