おっさんエンジニアの忘備録

Linux系の各種作業を自分用の忘備録として残しています

【chef】knife-soloでchef-soloをリモート実行(Apache+MySQL)

【chef】knife-soloでchef-soloをリモート実行saosao-0706.hatenablog.com

先日こちらの記事を書かせていただきましたが、こちらの環境で今度はApacheMysqlをセットアップしてみたいと思います。

環境

上記の記事をご参照ください。

apacheMySQL用のcookbookを作成

# cd /root/vagrant/centos67
# knife cookbook create apache -o site-cookbooks
** Creating cookbook apache in /root/vagrant/centos67/site-cookbooks
** Creating README for cookbook: apache
** Creating CHANGELOG for cookbook: apache
** Creating metadata for cookbook: apache
# knife cookbook create mysql -o site-cookbooks
** Creating cookbook mysql in /root/vagrant/centos67/site-cookbooks
** Creating README for cookbook: mysql
** Creating CHANGELOG for cookbook: mysql
** Creating metadata for cookbook: mysql
# cd /root/vagrant/centos67/site-cookbooks/
# ls -l
合計 12
drwxr-xr-x 10 root root 4096  4月 26 16:50 2016 apache
drwxr-xr-x 10 root root 4096  4月 26 09:48 2016 dovecot
drwxr-xr-x 10 root root 4096  4月 26 16:50 2016 mysql

「site-cookbooks」ディレクトリ内にcookbookが生成されます。
「/root/vagrant/centos67」はsite-cookbooksがあるディレクトリです。

Nodeオブジェクト(ランリスト)の編集

# vi /root/vagrant/centos67/nodes/192.168.33.10.json
{
  "run_list": [
    "recipe[dovecot]",
    "recipe[apache]",
    "recipe[mysql]"
  ],
  "automatic": {
    "ipaddress": "192.168.33.10"
  }
}

こちらを追加することで、knife-solo実行時にApacheMySQL用のレシピが実行されます。

apacheのレシピを書く

# vi /root/vagrant/centos67/site-cookbooks/apache/recipes/default.rb
#
# Cookbook Name:: apache
# Recipe:: default
#
# Copyright 2016, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
package "httpd" do
    action :install
end

service "httpd" do
    action [ :enable, :start]
end

赤字の行を追加します。
上記のレシピの意味は以下の通りです。
◆action :install
apacheのインストール
◆action [ :enable, :start]
enableはOS起動時のサービス有効化(chkconfig httpd on)、startはサービスの起動(service httpd start)

mysqlのレシピを書く

# vi /root/vagrant/centos67/site-cookbooks/mysql/recipes/default.rb
#
# Cookbook Name:: mysql
# Recipe:: default
#
# Copyright 2016, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
package "mysql-server" do
    action :install
end

service "mysqld" do
    action [ :enable, :start]
end

赤字の行を追加します。
上記のレシピの意味は以下の通りです。

knife-solo実行

# cd /root/vagrant/centos67
# knife solo cook 192.168.33.10
Running Chef on 192.168.33.10...
Checking Chef version...
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:67:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:84:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:67:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:84:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
Installing Berkshelf cookbooks to 'cookbooks'...
Resolving cookbook dependencies...
Uploading the kitchen...
WARNING: Local cookbook_path '/root/vagrant/centos67/cookbooks' does not exist
Generating solo config...
Running Chef: sudo chef-solo -c ~/chef-solo/solo.rb -j ~/chef-solo/dna.json
Starting Chef Client, version 12.9.38
Installing Cookbook Gems:
Compiling Cookbooks...
Converging 5 resources
Recipe: dovecot::default
  * yum_package[dovecot] action install (up to date)
Recipe: apache::default
  * yum_package[httpd] action install
    - install version 2.2.15-47.el6.centos.4 of package httpd
  * service[httpd] action enable
    - enable service service[httpd]
  * service[httpd] action start
    - start service service[httpd]
Recipe: mysql::default
  * yum_package[mysql-server] action install
    - install version 5.1.73-5.el6_7.1 of package mysql-server
  * service[mysqld] action enable
    - enable service service[mysqld]
  * service[mysqld] action start
    - start service service[mysqld]

Running handlers:
Running handlers complete
Chef Client finished, 6/7 resources updated in 24 seconds

ApacheMySQLの作業を行った旨のログが出力されます。

ゲストOSにログインして確認

 
# ssh 192.168.33.10
Last login: Thu Apr 28 05:36:54 2016 from 10.0.2.2
$ ps -ef | grep httpd
root      4747     1  0 05:37 ?        00:00:00 /usr/sbin/httpd
apache    4749  4747  0 05:37 ?        00:00:00 /usr/sbin/httpd
apache    4750  4747  0 05:37 ?        00:00:00 /usr/sbin/httpd
apache    4751  4747  0 05:37 ?        00:00:00 /usr/sbin/httpd
apache    4752  4747  0 05:37 ?        00:00:00 /usr/sbin/httpd
apache    4753  4747  0 05:37 ?        00:00:00 /usr/sbin/httpd
apache    4754  4747  0 05:37 ?        00:00:00 /usr/sbin/httpd
apache    4755  4747  0 05:37 ?        00:00:00 /usr/sbin/httpd
apache    4756  4747  0 05:37 ?        00:00:00 /usr/sbin/httpd
vagrant   5093  5077  0 05:38 pts/0    00:00:00 grep httpd
$ ps -ef | grep mysql
root      4955     1  0 05:37 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql     5057  4955  0 05:37 ?        00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
vagrant   5095  5077  0 05:38 pts/0    00:00:00 grep mysql
$ chkconfig --list | grep httpd
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
$ chkconfig --list | grep mysql
mysqld          0:off   1:off   2:on    3:on    4:on    5:on    6:off

ApacheMySQLがインストールされ、サービスが起動しています。
また、OS起動時にサービスが起動する設定となっています。

ちなみに、knife-solo実行時に文法エラーがあった場合は以下のようなエラーメッセージが出力されます。

# knife solo cook 192.168.33.10
Running Chef on 192.168.33.10...
Checking Chef version...
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:67:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:84:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:67:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:84:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
ERROR: JSON::ParserError: 419: unexpected token at '"recipe[apache]"
        "recipe[mysql]"
  ],
  "automatic": {
    "ipaddress": "192.168.33.10"
  }
}

【chef】knife-soloでchef-soloをリモート実行

今回はVagrantで構築したゲストOSに対してknife-soloを使ってchef-soloをリモート実行してみます

環境

◆ホストOS(RHEL6.7)
◆ゲストOS(CentOS6.7)
※1、Vagrantで仮想環境を構築
※2、内部IPアドレスは192.168.33.10
※3、ホストOS(ユーザ:root)からゲストOS(ユーザ:vagrant)へのSSHはパスワードなしでログインできる

必要なモジュールのインストール(ホストOS)

# gem install knife-solo
# gem install berkshelf

「knife-solo」は作業用マシン上に用意したCookbookなどの設定ファイルを設定対象のマシンにコピーし、 設定対象のマシン上でchef-soloコマンドを実行する、という一連の作業を自動実行するツールです。
設定ファイルのコピーにはrsyncが、chef-soloコマンドの実行にはsshを使います。
「berkshelf」は定義ファイルに使うcookbookを定義しておけば、リポジトリから勝手に依存関係を解消 した上で落としてきてくれるツールのようです。

リポジトリ作成(ホストOS)

Vagrantfileがあるディレクトリ上にリポジトリを作成します

# cd /root/vagrant/centos67
# knife solo init .
WARNING: No knife configuration file found
Creating kitchen...
Creating knife.rb in kitchen...
Creating cupboards...
Setting up Berkshelf...
# ls -l
合計 32
-rw-r--r-- 1 root root   35  4月 26 09:37 2016 Berksfile
-rw-r--r-- 1 root root 3080  4月 25 16:04 2016 Vagrantfile
drwxr-xr-x 2 root root 4096  4月 26 09:37 2016 cookbooks
drwxr-xr-x 2 root root 4096  4月 26 09:37 2016 data_bags
drwxr-xr-x 2 root root 4096  4月 26 09:37 2016 environments
drwxr-xr-x 2 root root 4096  4月 26 09:37 2016 nodes
drwxr-xr-x 2 root root 4096  4月 26 09:37 2016 roles
drwxr-xr-x 2 root root 4096  4月 26 09:37 2016 site-cookbooks

リポジトリ関連のファイルが生成されます

ゲストOSにChef Soloのインストール(ホストOS)

「knife solo bootstrap [ホスト名 or IPアドレス]」コマンドを実行します。
「knife solo bootstrap」コマンドは、knife solo prepareによるChefのインストールとknife solo cookによるカレントリポジトリのアップロード とchef-soloの実行を同時に実施してくれるコマンドとなります。

# knife solo bootstrap 192.168.33.10
Bootstrapping Chef...
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:67:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:84:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:67:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:84:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 19602  100 19602    0     0  18652      0  0:00:01  0:00:01 --:--:-- 67593
el 6 x86_64
Getting information for chef stable 12.9.38 for el...
downloading https://omnitruck-direct.chef.io/stable/chef/metadata?v=12.9.38&p=el&pv=6&m=x86_64
  to file /tmp/install.sh.2869/metadata.txt
trying wget...
sha1    2b859af3d6e99502b7a1d75671a4f629a224e9ad
sha256  0aca8e46ff8ada7af09b0d65b6f7738eb7b25d269482000be1dee7aaba154011
url     https://packages.chef.io/stable/el/6/chef-12.9.38-1.el6.x86_64.rpm
version 12.9.38
downloaded metadata file looks valid...
downloading https://packages.chef.io/stable/el/6/chef-12.9.38-1.el6.x86_64.rpm
  to file /tmp/install.sh.2869/chef-12.9.38-1.el6.x86_64.rpm
trying wget...
Comparing checksum with sha256sum...
Installing chef 12.9.38
installing with rpm...
警告: /tmp/install.sh.2869/chef-12.9.38-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/192.168.33.10.json'...
Running Chef on 192.168.33.10...
Installing Berkshelf cookbooks to 'cookbooks'...
Resolving cookbook dependencies...
Uploading the kitchen...
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:67:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:84:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:67:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:84:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
WARNING: Local cookbook_path '/root/vagrant/centos67/cookbooks' does not exist
Generating solo config...
Running Chef: sudo chef-solo -c ~/chef-solo/solo.rb -j ~/chef-solo/dna.json
Starting Chef Client, version 12.9.38
Installing Cookbook Gems:
Compiling Cookbooks...
Converging 0 resources

Running handlers:
Running handlers complete
Chef Client finished, 0/0 resources updated in 02 seconds

ゲストOSにログインして確認

# ssh 192.168.33.10
Last login: Tue Apr 26 01:43:34 2016 from 10.0.2.2
[vagrant@localhost ~]$ che           (tabキーを押して補完表示させてます)
checkmodule  checkpolicy  chef-apply   chef-client  chef-shell   chef-solo/

chef solo関連のプログラムが表示されています

クックブックの作成(ホストOS)

# cd /root/vagrant/centos67
# knife cookbook create dovecot -o site-cookbooks
** Creating cookbook dovecot in /root/vagrant/centos67/site-cookbooks
** Creating README for cookbook: dovecot
** Creating CHANGELOG for cookbook: dovecot
** Creating metadata for cookbook: dovecot

レシピの編集(ホストOS)

# vi /root/vagrant/centos67/site-cookbooks/dovecot/recipes/default.rb
#
# Cookbook Name:: dovecot
# Recipe:: default
#
# Copyright 2016, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
package "dovecot" do
        action :install
end

上記の3行を追加します。
上記はdovecotをインストールするレシピとなります。

ノードオブジェクト(ランリスト)の修正(ホストOS)

# vi /root/vagrant/centos67/nodes/192.168.33.10.json
{
  "run_list": [
    "recipe[dovecot]"
  ],
  "automatic": {
    "ipaddress": "192.168.33.10"
  }
}

上記の1行を追加します。
上記を記述することにより「knife-solo」コマンド実行時にクックブックを明示的に指定する必要が無くなります。

knife-solo実行(ホストOS)

# cd /root/vagrant/centos67
# knife solo cook 192.168.33.10
Running Chef on 192.168.33.10...
Checking Chef version...
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:67:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:84:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:67:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
/root/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:84:in `initialize': Object#timeout is deprecated, use Timeout.timeout instead.
Installing Berkshelf cookbooks to 'cookbooks'...
Resolving cookbook dependencies...
Uploading the kitchen...
WARNING: Local cookbook_path '/root/vagrant/centos67/cookbooks' does not exist
Generating solo config...
Running Chef: sudo chef-solo -c ~/chef-solo/solo.rb -j ~/chef-solo/dna.json
Starting Chef Client, version 12.9.38
Installing Cookbook Gems:
Compiling Cookbooks...
Converging 1 resources
Recipe: dovecot::default
  * yum_package[dovecot] action install
    - install version 2.0.9-19.el6_7.2 of package dovecot

Running handlers:
Running handlers complete
Chef Client finished, 1/1 resources updated in 14 seconds

ゲストOSにdovecotがインストールされているか確認

# ssh 192.168.33.10
Last login: Tue Apr 26 02:02:51 2016 from 10.0.2.2
[vagrant@localhost ~]$ rpm -qa | grep dovecot
dovecot-2.0.9-19.el6_7.2.x86_64
[vagrant@localhost ~]$

dovecotがインストールされています

Vagrantで構築したゲストOS(CentOS)に簡単にSSHログインさせる(パスワードなし)

基本的なことなのですが、若干ハマってしまったのでメモしておきます
通常はゲストOSのVagrantfileがあるディレクトリで、

# vagrant ssh

と入れればパスワードなしでSSHログインできますが、chefの検証(knife-solo)などでダイレクトにSSHログインしたかったため、
パスワード無しでログインできるようにします

環境

RHEL6.7(ホストOS)
Vagrant 1.8.1
CentOS6.7(ゲストOS)

Vagrantfileの修正

対象のゲストOS用のVagrantfileを修正します

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  # config.vm.network "private_network", ip: "192.168.33.10"
   config.vm.network "private_network", ip: "192.168.33.10"

赤字の行を追加して、内部ネットワーク用のアドレスを保持するようにします
※今回はデフォルト値をそのまま利用しています

ゲストOSの再起動

対象のゲストOS用のVagrantfileのあるディレクトリで、以下のコマンドを実行します

# vagrant reload

念のためPING確認

ホストOS⇒ゲストOSへPINGが通ることを確認します

# ping 192.168.33.10
PING 192.168.33.10 (192.168.33.10) 56(84) bytes of data.
64 bytes from 192.168.33.10: icmp_seq=1 ttl=64 time=0.248 ms
64 bytes from 192.168.33.10: icmp_seq=2 ttl=64 time=0.232 ms
64 bytes from 192.168.33.10: icmp_seq=3 ttl=64 time=0.223 ms
64 bytes from 192.168.33.10: icmp_seq=4 ttl=64 time=0.222 ms
^C
--- 192.168.33.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3556ms
rtt min/avg/max/mdev = 0.222/0.231/0.248/0.015 ms

Vagrant用のSSH設定を~/.ssh/configに追加

対象のゲストOS用のVagrantfileのあるディレクトリで、以下のコマンドを実行します

# vagrant ssh-config --host 192.168.33.10 >> ~/.ssh/config

vagrant ssh-config」コマンドはvagrantSSHコンフィグを出力させるコマンドです
「--host」オプションを付けるとHostのコンフィグが変更されたコンフィグが出力されます

「~/.ssh/config」には以下の設定が追加されます

Host 192.168.33.10
  HostName 127.0.0.1
  User vagrant
  Port 2200
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile "/root/vagrant/centos67/.vagrant/machines/default/virtualbox/private_key"
  IdentitiesOnly yes
  LogLevel FATAL

「~/.ssh/config」に設定を入れておくと、sshコマンドでオプションをわざわざ指定せずに簡単にSSHログインすることができます

SSHでログインできることを確認

# ssh 192.168.33.10
Last login: Mon Apr 25 08:41:59 2016 from 10.0.2.2
[vagrant@localhost ~]$

パスワードなしでログインできます

今回の件で「~/.ssh/config」の働きやsshコマンドのオプションに関してあまり理解できていなかったなぁ~と反省しております。。。

VagrantのCentOSにchefをインストール

VagrantのゲストOS上にchefをインストールし、簡単な動作を試してみます

環境

RHEL6.7(ホストOS)
CentOS6.7(ゲストOS) ※Vagrantで仮想環境を構築
ruby2.3.0p0 ※gemでインストールしている環境
Chef: 12.9.38

chefインストール

# gem install chef

いろいろなやり方があるかと思いますが、今回はgemでインストールしています

hello,worldを出力してみる

お決まりかもしれませんが、とりあえずこちらをやってみます

(1)クックブック格納用のディレクトリ作成

# mkdir /var/chef/ /var/chef/cookbooks

こちらはどこでもよいかと思いますが、自分が見ていた書籍のパスに合わせています

(2)クックブックの作成

「hello」がクックブック名、「/var/chef/cookbooks」がクックブックの出力先(-oオプション)となります

# knife cookbook create hello -o /var/chef/cookbooks
WARNING: No knife configuration file found
** Creating cookbook hello in /var/chef/cookbooks
** Creating README for cookbook: hello
** Creating CHANGELOG for cookbook: hello
** Creating metadata for cookbook: hello
# cd /var/chef/cookbooks
# ls -l
total 4
drwxr-xr-x 10 root root 4096 Apr 25 03:08 hello
# cd hello/
# ls -l
total 44
drwxr-xr-x 2 root root 4096 Apr 25 03:08 attributes
-rw-r--r-- 1 root root  430 Apr 25 03:08 CHANGELOG.md
drwxr-xr-x 2 root root 4096 Apr 25 03:08 definitions
drwxr-xr-x 3 root root 4096 Apr 25 03:08 files
drwxr-xr-x 2 root root 4096 Apr 25 03:08 libraries
-rw-r--r-- 1 root root  274 Apr 25 03:08 metadata.rb
drwxr-xr-x 2 root root 4096 Apr 25 03:08 providers
-rw-r--r-- 1 root root 1448 Apr 25 03:08 README.md
drwxr-xr-x 2 root root 4096 Apr 25 03:08 recipes
drwxr-xr-x 2 root root 4096 Apr 25 03:08 resources
drwxr-xr-x 3 root root 4096 Apr 25 03:08 templates

クックブック用のファイルが生成されます

(3)レシピを編集

# cd /var/chef/cookbooks/hello/recipes
# vi default.rb
#
# Cookbook Name:: hello
# Recipe:: default
#
# Copyright 2016, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
log "Hello,World!"

「Hello,Word!」の行を追加します

(4)ChefSoloの実行

「hello」がクックブック名(-oオプション)となります

# chef-solo -o hello
[2016-04-25T03:13:04+01:00] WARN: *****************************************
[2016-04-25T03:13:04+01:00] WARN: Did not find config file: /etc/chef/solo.rb, using command line options.
[2016-04-25T03:13:04+01:00] WARN: *****************************************
Starting Chef Client, version 12.9.38
[2016-04-25T03:13:09+01:00] WARN: Run List override has been provided.
[2016-04-25T03:13:09+01:00] WARN: Original Run List: []
[2016-04-25T03:13:09+01:00] WARN: Overridden Run List: [recipe[hello]]
Installing Cookbook Gems:
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 04 seconds

Hello,Wordが出力されています

特定のパッケージをインストールする

クックブックを使ってdovecotをインストールしてみます
手順に関してはほぼ先ほどと同じですが、クックブックの内容が異なります
dovecotにしたのは特に理由はありません(笑)

(1)クックブックの作成

# knife cookbook create dovecot -o /var/chef/cookbooks
WARNING: No knife configuration file found
** Creating cookbook dovecot in /var/chef/cookbooks
** Creating README for cookbook: dovecot
** Creating CHANGELOG for cookbook: dovecot
** Creating metadata for cookbook: dovecot

(2)レシピを編集

# vi /var/chef/cookbooks/dovecot/recipes/default.rb
package "dovecot" do
        action :install
end

上記の3行を追加します

(3)ChefSoloの実行

# chef-solo -o dovecot
[2016-04-25T05:03:59+01:00] WARN: *****************************************
[2016-04-25T05:03:59+01:00] WARN: Did not find config file: /etc/chef/solo.rb, using command line options.
[2016-04-25T05:03:59+01:00] WARN: *****************************************
Starting Chef Client, version 12.9.38
[2016-04-25T05:04:04+01:00] WARN: Run List override has been provided.
[2016-04-25T05:04:04+01:00] WARN: Original Run List: []
[2016-04-25T05:04:04+01:00] WARN: Overridden Run List: [recipe[dovecot]]
Installing Cookbook Gems:
Compiling Cookbooks...
Converging 1 resources
Recipe: dovecot::default
  * yum_package[dovecot] action install
    - install version 2.0.9-19.el6_7.2 of package dovecot

Running handlers:
Running handlers complete
Chef Client finished, 1/1 resources updated in 18 seconds

dovecotがインストールされた旨の出力があります

(4)実際にインストールされているか確認

# rpm -qa | grep dovecot
dovecot-2.0.9-19.el6_7.2.x86_64

実際にインストールされていることが確認できます

【RubyGems】ライブラリのRDoc参照方法(ローカル環境)

いろいろRubyGemsのライブラリを入れたりしてプログラムを作ってみたりしているのですが、リファレンス的なものがググっても出て こない状況^^;
いろいろ調べてみたらローカルでRDoc参照できるみたいなので、参照方法をメモしておきます。

環境

RHEL6.7
ruby 2.3.0p0
gem2.5.1

gem serverコマンドを実行して、HTTPサーバを立ち上げる

# gem server
Server started at http://0.0.0.0:8808
Server started at http://[::]:8808

HTTPサーバが立ち上がります

ブラウザでHTTPサーバにアクセス

ブラウザで「http://[サーバのIPアドレス]:8808」へアクセスするとトップページが表示されます
f:id:saosao_0706:20160422153209p:plain

詳細を見たいライブラリの「rdoc」のリンクをクリックするとRDocのドキュメントを見ることができます
f:id:saosao_0706:20160422154018p:plain

全部英語なのでなかなか厳しいですが、見れないよりは。。。

参照元

www.task-notes.com

【Ruby】ruby-mysqlを使用してMySQLに接続

事前にやっておくこと

# gem install ruby-mysql

ruby-mysqlを入れておく必要があります。

環境

RHEL6.7
ruby2.3.0p0
MySQL5.7.12

使用するテーブル

以下のzaikoテーブルを使用します

mysql> SHOW COLUMNS FROM zaiko;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| maker | text | YES | | NULL | |
| type | text | YES | | NULL | |
| serial | varchar(100) | YES | | NULL | |
| purpose | varchar(20) | YES | | NULL | |
| input_date | date | YES | | NULL | |
| output_date | date | YES | | NULL | |

mysql> select * from zaiko;
+----+--------+-------+--------+----------+------------+-------------+
| id | maker  | type  | serial | purpose  | input_date | output_date |
+----+--------+-------+--------+----------+------------+-------------+
|  2 | maker1 | type1 | 001    | purpose1 | 2016-04-01 | 2016-04-02  |
|  3 | maker2 | type2 | 002    | purpose2 | 2016-04-03 | 2016-04-04  |
|  4 | maker3 | type3 | 003    | purpose3 | 2016-04-03 | 2016-04-04  |
|  5 | maker4 | type4 | 004    | purpose4 | 2016-04-05 | 2016-04-06  |
|  6 | maker5 | type5 | 005    | purpose5 | 2016-04-06 | 2016-04-07  |
+----+--------+-------+--------+----------+------------+-------------+
5 rows in set (0.01 sec)

簡単なSELECT

◆ソース(mysql_select.rb)

require 'mysql'

# DBに接続
my = Mysql::new("127.0.0.1", "[ユーザ名]", "[パスワード]", "[DB名]")

# 抽出結果でループ
result = my.query("select maker,type,serial,purpose,\
input_date,output_date from zaiko").each do \
|maker,type,serial,purpose,input_date,output_date|

    # レコードの内容を出力
    puts "#{maker},#{type},#{serial},#{purpose},#{input_date},#{output_date}"
end

# DBの切断
my.close

◆実行結果

# ruby mysql_select.rb
maker1,type1,001,purpose1,2016-04-01,2016-04-02
maker2,type2,002,purpose2,2016-04-03,2016-04-04
maker3,type3,003,purpose3,2016-04-03,2016-04-04
maker4,type4,004,purpose4,2016-04-05,2016-04-06
maker5,type5,005,purpose5,2016-04-06,2016-04-07

パラメータを持つSELECT

◆ソース(mysql_select2.rb)

require 'mysql'

# DBに接続
my = Mysql::new("127.0.0.1", "root", "Ph/*CyFUf0gt", "test_db")

# SQLの作成
stmt = my.prepare("select maker,type,serial,purpose,input_date,\
                   output_date from zaiko where serial = ?")

# SQLの実行&レコードの取り出し
tuple = stmt.execute('001').fetch       # 結果はtupleに配列で格納される

# レコードが存在した場合は結果を出力
if tuple then
    puts "#{tuple[0]},#{tuple[1]},#{tuple[2]},#{tuple[3]},#{tuple[4]},#{tuple[5]}"
end

# DBの切断
my.close

◆実行結果

# ruby mysql_select2.rb
maker1,type1,001,purpose1,2016-04-01,2016-04-02

INSERT

◆ソース(mysql_insert.rb)

require 'mysql'

# DBに接続
my = Mysql::new("127.0.0.1", "root", "Ph/*CyFUf0gt", "test_db")

# SQLの作成
stmt = my.prepare("insert into zaiko(maker,type,serial,purpose,input_date,output_date) \
                   values(?,?,?,?,?,?)")

# SQLの実行
stmt.execute('maker6','type1','006','purpose6','2016-04-08','2016-04-09')

# DBの切断
my.close

mysql_insert.rb実行後のselect実行結果

mysql> select * from zaiko;
+----+--------+-------+--------+----------+------------+-------------+
| id | maker  | type  | serial | purpose  | input_date | output_date |
+----+--------+-------+--------+----------+------------+-------------+
|  2 | maker1 | type1 | 001    | purpose1 | 2016-04-01 | 2016-04-02  |
|  3 | maker2 | type2 | 002    | purpose2 | 2016-04-03 | 2016-04-04  |
|  4 | maker3 | type3 | 003    | purpose3 | 2016-04-03 | 2016-04-04  |
|  5 | maker4 | type4 | 004    | purpose4 | 2016-04-05 | 2016-04-06  |
|  6 | maker5 | type5 | 005    | purpose5 | 2016-04-06 | 2016-04-07  |
|  7 | maker6 | type1 | 006    | purpose6 | 2016-04-08 | 2016-04-09  |
+----+--------+-------+--------+----------+------------+-------------+
6 rows in set (0.00 sec)
idが7の行が追加されています

UPDATE

◆ソース(mysql_update.rb)

require 'mysql'

# DBに接続
my = Mysql::new("127.0.0.1", "root", "Ph/*CyFUf0gt", "test_db")

# SQLの作成
stmt = my.prepare("update zaiko set maker=? where serial=?")

# SQLの実行
stmt.execute('changed1','001')

# DBの切断
my.close

mysql_update.rb実行前のselect実行結果

mysql> select * from zaiko;
+----+--------+-------+--------+----------+------------+-------------+
| id | maker  | type  | serial | purpose  | input_date | output_date |
+----+--------+-------+--------+----------+------------+-------------+
|  2 | maker1 | type1 | 001    | purpose1 | 2016-04-01 | 2016-04-02  |
|  3 | maker2 | type2 | 002    | purpose2 | 2016-04-03 | 2016-04-04  |
|  4 | maker3 | type3 | 003    | purpose3 | 2016-04-03 | 2016-04-04  |
|  5 | maker4 | type4 | 004    | purpose4 | 2016-04-05 | 2016-04-06  |
|  6 | maker5 | type5 | 005    | purpose5 | 2016-04-06 | 2016-04-07  |
|  7 | maker6 | type1 | 006    | purpose6 | 2016-04-08 | 2016-04-09  |
+----+--------+-------+--------+----------+------------+-------------+
6 rows in set (0.00 sec)
今回作成したプログラムではserialが「001」のレコードのmakerを「type1」から「changed1」に変更します

mysql_update.rb実行後のselect実行結果

mysql> select * from zaiko;
+----+----------+-------+--------+----------+------------+-------------+
| id | maker    | type  | serial | purpose  | input_date | output_date |
+----+----------+-------+--------+----------+------------+-------------+
|  2 | changed1 | type1 | 001    | purpose1 | 2016-04-01 | 2016-04-02  |
|  3 | maker2   | type2 | 002    | purpose2 | 2016-04-03 | 2016-04-04  |
|  4 | maker3   | type3 | 003    | purpose3 | 2016-04-03 | 2016-04-04  |
|  5 | maker4   | type4 | 004    | purpose4 | 2016-04-05 | 2016-04-06  |
|  6 | maker5   | type5 | 005    | purpose5 | 2016-04-06 | 2016-04-07  |
|  7 | maker6   | type1 | 006    | purpose6 | 2016-04-08 | 2016-04-09  |
+----+----------+-------+--------+----------+------------+-------------+
6 rows in set (0.00 sec)
serialが「001」のレコードのmakerが「type1」から「changed1」に変更されています

DELETE

◆ソース(mysql_delete.rb)

require 'mysql'

# DBに接続
my = Mysql::new("127.0.0.1", "root", "Ph/*CyFUf0gt", "test_db")

# SQLの作成
stmt = my.prepare("delete from zaiko where serial=?")

# SQLの実行
stmt.execute('006')

# DBの切断
my.close

mysql_delete.rb実行前のselect実行結果

mysql> select * from zaiko;
+----+----------+-------+--------+----------+------------+-------------+
| id | maker    | type  | serial | purpose  | input_date | output_date |
+----+----------+-------+--------+----------+------------+-------------+
|  2 | changed1 | type1 | 001    | purpose1 | 2016-04-01 | 2016-04-02  |
|  3 | maker2   | type2 | 002    | purpose2 | 2016-04-03 | 2016-04-04  |
|  4 | maker3   | type3 | 003    | purpose3 | 2016-04-03 | 2016-04-04  |
|  5 | maker4   | type4 | 004    | purpose4 | 2016-04-05 | 2016-04-06  |
|  6 | maker5   | type5 | 005    | purpose5 | 2016-04-06 | 2016-04-07  |
|  7 | maker6   | type1 | 006    | purpose6 | 2016-04-08 | 2016-04-09  |
+----+----------+-------+--------+----------+------------+-------------+
6 rows in set (0.00 sec)
今回作成したプログラムではserialが「006」のレコードを削除します

mysql_delete.rb実行後のselect実行結果

mysql> select * from zaiko;
+----+----------+-------+--------+----------+------------+-------------+
| id | maker    | type  | serial | purpose  | input_date | output_date |
+----+----------+-------+--------+----------+------------+-------------+
|  2 | changed1 | type1 | 001    | purpose1 | 2016-04-01 | 2016-04-02  |
|  3 | maker2   | type2 | 002    | purpose2 | 2016-04-03 | 2016-04-04  |
|  4 | maker3   | type3 | 003    | purpose3 | 2016-04-03 | 2016-04-04  |
|  5 | maker4   | type4 | 004    | purpose4 | 2016-04-05 | 2016-04-06  |
|  6 | maker5   | type5 | 005    | purpose5 | 2016-04-06 | 2016-04-07  |
+----+----------+-------+--------+----------+------------+-------------+
5 rows in set (0.01 sec)
serialが「006」のレコードが削除されています

【Linux】システム関連コマンドリンク集

自分でブログを書こうとしたんですが、既に素晴らしいブログを公開されている方がたくさんいらっしゃるので、リンク集にしようかと思いますw

 

(1)topコマンド

qiita.com

orebibou.com

topコマンドの使い方・見方 | WEBサービス創造記

 

 

(2)freeコマンド

www.softel.co.jp

free コマンド 実行結果の見かた

 

 

(3)psコマンド

www.uetyi.com

codezine.jp

 

(4)iotop

www.agilegroup.co.jp

 

(5)逆引き

qiita.com

 

自分がハマったのは以下の2つです。

◆psコマンドがLinux/BSD系とSolarisで異なる

◆メモリ使用量の見方

メモリ使用量に関しては、

【top】

Mem: 12157736k total, 11839208k used, 318528k free, 160352k buffers
Swap: 6143992k total, 348992k used, 5795000k free, 10419328k cached

 

【free】

total used free shared buffers cached
Mem: 12157736 11831180 326556 140348 160360 10411948
-/+ buffers/cache: 1258872 10898864
Swap: 6143992 348992 5795000

 

・topコマンドのSwapの行に「10419328k cached」の表示があるので惑わされる

・usedが少ないのでメモリが足りないと勘違いする(実際はfreeコマンドの「-/+ buffers/cache: 1258872 10898864)がほぼ実体の使用量)

ってな感じでした。

 

(6)dstatコマンド

qiita.com

 

(7)sarコマンド

naoberry.com