【chef】knife-soloでchef-soloをリモート実行(Apache+MySQL)
【chef】knife-soloでchef-soloをリモート実行saosao-0706.hatenablog.com
先日こちらの記事を書かせていただきましたが、こちらの環境で今度はApacheとMysqlをセットアップしてみたいと思います。
環境
上記の記事をご参照ください。
apache、MySQL用の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実行時にApache、MySQL用のレシピが実行されます。
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
Apache、MySQLの作業を行った旨のログが出力されます。
ゲスト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
Apache、MySQLがインストールされ、サービスが起動しています。
また、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」コマンドはvagrantのSSHコンフィグを出力させるコマンドです
「--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」へアクセスするとトップページが表示されます
詳細を見たいライブラリの「rdoc」のリンクをクリックするとRDocのドキュメントを見ることができます
全部英語なのでなかなか厳しいですが、見れないよりは。。。
参照元
【Ruby】ruby-mysqlを使用してMySQLに接続
事前にやっておくこと
# gem install 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コマンド
(2)freeコマンド
(3)psコマンド
(4)iotop
(5)逆引き
自分がハマったのは以下の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コマンド
(7)sarコマンド