読者です 読者をやめる 読者になる 読者になる

Chef Soloローカル開発環境の自動構築  ~Samba環境構築編~

chefでSamba環境を自動構築する方法を記載。
VagrantのProvisioner(プロビジョナー)を活用して環境構築を行う。

※本編は、以下のLAMP環境構築が済んでいることが前提となる。


1. Sambaユーザー用のパスワードを生成
* パスワードはshadow passwordの形式で設定する必要がある。
[openssl passwd -1 パスワード] の形式で入力する。
 openssl passwd -1 smb_user

  

2. Sambaのクックブックを作成
* knife-soloを使ってSambaのクックブックを作成する。
bundle exec knife cookbook create samba -o ./site-cookbooks

 

3. Sambaのレシピを作成
* site-cookbooks/samba/recipes/default.rbに以下内容を記述。
ーーーーーーーーーーーーーーーーーーーーーーーーー

package "samba" do
  action :install
end

service "smb" do
  action [ :enable, :start ]
  supports :status => true, :restart => true, :reload => true
end

# Sambaユーザーの作成
user "smb_user" do
  comment "smb_user"
  home "/home/smb_user"
  shell "/bin/bash"
  password "シャドウパスワード"
  supports :manage_home => true
  action [:create, :manage]
end

# Sambaサーバーアクセス用ユーザに設定
# pdbedit は -t を指定すると標準入力からパスワードを読み込む
# パスワードは改行区切りで2回出力する
execute 'pdbedit_script' do
  command 'echo -e "smb_user\nsmb_user" | pdbedit -a -t -u smb_user'
end

# ApacheのDocumentRootのユーザー権限をSambaユーザーでアクセスできるように、
# nobodyユーザーに変更しておく(※DocumentRootはセキュリティのため、適宜変更のこと!)
execute 'change_authority' do
  command 'chown -R nobody:nobody /var/www/html'
end

template "smb.conf" do
  path "/etc/samba/smb.conf"
  owner "root"
  group "root"
  mode 0644
  notifies :restart, 'service[smb]'
end

ーーーーーーーーーーーーーーーーーーーーーーーーー

 

4. Sambaのテンプレートを作成
* site-cookbooks/samba/templates/default/smb.conf.erb に以下内容を記述。
ーーーーーーーーーーーーーーーーーーーーーーーーー

[global]
        # Linux側日本語文字コード
        unix charset = UTF-8

        # Windows側日本語文字コード
        dos charset = CP932

        # Linux側日本語文字コード
        display charset = UTF-8

        workgroup = WORKGROUP

        # ログイン時 ユーザー名 & パスワード の認証が必要
        security = user

        # 内部からのアクセスのみ許可
        hosts allow = 192.168. 127.

        # (プリンタ共有無効化)※Sambaでプリンタを共有しない場合
        load printers = no

        # (プリンタ共有無効化)※Sambaでプリンタを共有しない場合
        disable spoolss = yes

[public]
        comment = Public Stuff
        path = /var/www/html
        public = no
        writable = yes
        only guest = yes
ーーーーーーーーーーーーーーーーーーーーーーーーー

  

5. Berksfileにsambaを追記
* Berksfileに以下一文を追加しておく。
cookbook "samba", path: "./site-cookbooks/samba"

 

6. プロビジョニングを再実行
bundle exec berks install --path ./cookbooks

* うまくいかない場合は、以下コマンドを実行
berks vendor ./cookbooks

 

7. Vagrantfileにsambaを追記
* sambaクックブックを実行するようにVagrantfileを編集する。

ーーーーーーーーーーーーーーーーーーーーーーーーー

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    config.vm.box = "opscode-centos-7.2"
    config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-7.2_chef-provisionerless.box"

    # IPアドレスの設定
    config.vm.network :private_network, ip: "192.168.33.12"

    # vagrant-omnibusの有効化
    config.omnibus.chef_version = :latest

    config.vm.provision :chef_solo do |chef|
        chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"]
        chef.json = {
            nginx: {
                env: ["php"]
            },
            php70: {
                timezone: "Asia/Tokyo"
            }
        }
        chef.run_list = %w[

            recipe[yum-epel]
            recipe[apache]

            recipe[php-env::php70]
            recipe[mysql]
            recipe[package]
            recipe[samba]
        ]

    end
end
ーーーーーーーーーーーーーーーーーーーーーーーーー

 

8. 仮想サーバの起動とプロビジョニングを実行
vagrant up --provision

Chef Soloローカル開発環境の自動構築  ~LAMP環境構築編~

開発時にアプリケーションを実行する環境を自動構築する方法を記載。
開発環境の構築を自動化しておけば、いつでも開発環境を作ったり壊したりでき、
例えばチームに新しい開発メンバーが加わったときにも簡単に開発環境を用意し、
開発を始めることが可能となる。
ここでは、CentOS7.2・ApachePHPRubyMySQLを軸にLAMP環境を構築。
合わせて、ログ管理ツールのFluentdもインストール&構築しておく。

0. Bundlerを導入&実行
* クックブックの管理のためBerksfileを利用する。
  Berksfileとは、第三者が公開しているクックブック(コミュニティクックブック)を
  Rubyの依存性管理ツールであるBundlerのように管理するための設定ファイルのこと。
  Berksfileはgemという形式で配布されており、Rubyにはgem管理のために
  Bundlerというツールがあり、Gemfileに書かれたgemの依存関係を解決してくれる。

* Bundlerのインストール
gem install bundler

 

1. knife-soloでリポジトリを作成
* 新たに作業用ディレクトリを作成し、そちらに移動する。

  この作業用ディレクトリの中にあるファイルのみで環境の構築は完結する。
  また、既存のディレクトリで作業する場合には、BerksfileによってVagrantfileをはじめ
  いくつかのファイルが上書かれてしまうので、事前にバックアップを取っておく。
  作業ディレクトリ内に独立した環境を構築するために、Bundler用のGemfileを作成する。

mkdir /var/chef_knife_solo
cm /var/chef_knife_solo
knife solo init .

* 以下の内容を記述したGemfileを作成。(vim /var/chef_knife_solo/Gemfile
ーーーーーーーーーーーーーーーーーーーーーーーーー
source 'https://rubygems.org'

gem 'chef'
gem 'knife-solo'
gem 'berkshelf', "2.0.16"
ーーーーーーーーーーーーーーーーーーーーーーーーー

* bundleコマンドを実行
yum install libxml2-devel libxslt-devel
bundle install

※これで必要なライブラリのインストールが完了する。

 

2. Apacheのクックブックを作成
* knife-soloを使ってApacheのクックブックを作成する。
bundle exec knife cookbook create apache -o ./site-cookbooks

 

3. Apacheのレシピを作成
* site-cookbooks/apache/recipes/default.rbに以下内容を記述。
ーーーーーーーーーーーーーーーーーーーーーーーーー

include_recipe "yum-epel"

package "httpd" do
  action :install
end

service "httpd" do
  action [ :enable, :start ]
  supports :status => true, :restart => true, :reload => true
end

directory "/var/www/html/local.develop.co.jp/htdocs" do
  owner "apache"
  group "apache"
  recursive true
  mode 0755
  action :create
end

template "security.conf" do
  path "/etc/httpd/conf.d/security.conf"
  owner "root"
  group "root"
  mode 0644
end

template "local.develop.co.jp.conf" do
  path "/etc/httpd/conf.d/local.develop.co.jp.conf"
  owner "root"
  group "root"
  mode 0644
  notifies :restart, 'service[httpd]'
end
ーーーーーーーーーーーーーーーーーーーーーーーーー

 

4-1. Apacheのセキュリティ用テンプレートを作成
* site-cookbooks/apache/templates/default/security.conf.erb に以下内容を記述。
ーーーーーーーーーーーーーーーーーーーーーーーーー

# バージョン情報の隠蔽
ServerTokens Prod
Header unset X-Powered-By
ServerSignature off

# httpoxy 対策
RequestHeader unset Proxy

# クリックジャッキング対策
Header always append X-Frame-Options SAMEORIGIN

# XSS対策
Header set X-XSS-Protection "1; mode=block"
Header set X-Content-Type-Options nosniff

# XST対策
TraceEnable Off

# DoS 攻撃対策
LimitRequestBody 10485760
LimitRequestFields 20

# TCPタイムアウト時間
TimeOut 10

# slowloris 対策
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500

<Directory /var/www/html>
    # .htaccess の有効化
    AllowOverride All
    # ファイル一覧出力の禁止
    Options -Indexes
</Directory>

<Directory "/var/www/cgi-bin">
    <IfVersion > 2.4>
        Require all denied
    </IfVersion>
</Directory>

ーーーーーーーーーーーーーーーーーーーーーーーーー

 

4-2. Apacheの開発環境用テンプレートを作成
* site-cookbooks/apache/templates/default/local.develop.co.jp.conf.erb に以下内容を記述。
ーーーーーーーーーーーーーーーーーーーーーーーーー

<VirtualHost *:80>
    ServerName local.develop.co.jp
    DocumentRoot "/var/www/html/local.develop.co.jp/htdocs"
    DirectoryIndex index.php index.html
    ErrorLog "/var/log/httpd/local.develop.co.jp-error.log"
    CustomLog "/var/log/httpd/local.develop.co.jp-access.log" common

    <Directory "/var/www/html/local.develop.co.jp/htdocs">
        AllowOverride All
        Order Allow,Deny
        Allow from all
    </Directory>
</VirtualHost>
ーーーーーーーーーーーーーーーーーーーーーーーーー

 

5. Berksfileを編集
* クックブックの依存関係を定義する。Berksfileに以下内容を記述。
ーーーーーーーーーーーーーーーーーーーーーーーーー

site :opscode

cookbook "yum-epel"
cookbook "apache", path: "./site-cookbooks/apache"
ーーーーーーーーーーーーーーーーーーーーーーーーー

  

6. berks installコマンドを実行
* この時点でクックブックの依存関係定義が完了したので、
   berks install を実行しておく。
bundle exec berks install --path ./cookbooks

* うまくいかない場合は、以下コマンドを実行
berks vendor ./cookbooks

 

7. vagrant init コマンドを実行
vagrant init コマンドを実行し、Vagrantfileを作成する。
vagrant init

 

8. Vagrantfileを編集
* Vagrantfileにホスト名の設定、box設定、IPアドレスの設定から
   Apacheをインストールするプロビジョニングの設定を記述。
ーーーーーーーーーーーーーーーーーーーーーーーーー

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    config.vm.box = "opscode-centos-7.2"
    config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-7.2_chef-provisionerless.box"

    # IPアドレスの設定
    config.vm.network :private_network, ip: "192.168.33.12"

    # vagrant-omnibusの有効化
    config.omnibus.chef_version = :latest

    config.vm.provision :chef_solo do |chef|
        chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"]
        chef.run_list = %w[
            recipe[yum-epel]
            recipe[apache]

        ]
    end
end
ーーーーーーーーーーーーーーーーーーーーーーーーー

 

9. vagrant-omnibusプラグインをインストール
* BentoのboxにはChef SoloおよびChef Clientが含まれていないため、
  仮想サーバ起動時に自動インストールされるようにvagrant-omnibusという
  Vagrantのプラグンをインストールしておく。
vagrant plugin install vagrant-omnibus

 

10. 仮想サーバの起動とプロビジョニングを実行
vagrant up --provision

※ブラウザでhttp://192.168.33.12にアクセスし疎通確認をすること。

 

11. PHPをインストール
* PHPの導入に伴い、PHP-FPMのインストールを行う。
  Apacheと同様にknifeコマンドを使ってクックブックのひな形を作成する。
bundle exec knife cookbook create php-env -o ./site-cookbooks

  

12. PHPのレシピを作成
* site-cookbooks/php-env/recipes/default.rbに以下内容を記述。
  PHP5.5から標準バンドルされたPHPの動作を高速化するためのキャッシュモジュールである
  OPcacheが一緒にインストールされるように設定しておく。
ーーーーーーーーーーーーーーーーーーーーーーーーー

%w{php-fpm php-pecl-zendopcache}.each do |pkg|
  package pkg do
    action :install
    notifies :restart, "service[php-fpm]"
  end
end

service "php-fpm" do
  action [:enable, :start]
end
ーーーーーーーーーーーーーーーーーーーーーーーーー

  

13. PHP7.0をインストールするレシピを作成
* yumの標準リポジトリではPHP7.0は提供されていないため、
  外部リポジトリであるRemiからイントールするようにレシピを作成する。

* yumにremiリポジトリを追加して、PHP7.0をインストールするレシピを作成し、
  php-envクックブックのrecipesフォルダphp70.rbに追加する。

* site-cookbooks/php-env/recipes/php70.rbに以下内容を記述。
ーーーーーーーーーーーーーーーーーーーーーーーーー

yum_repository 'remi' do
  description 'Les RPM de Remi - Repository'
  baseurl 'http://rpms.famillecollet.com/enterprise/7/remi/x86_64/'
  gpgkey 'http://rpms.famillecollet.com/RPM-GPG-KEY-remi'
  fastestmirror_enabled true
  action :create
end

yum_repository 'remi-php70' do
  description 'Les RPM de remi de PHP 7.0 pour Enterprise Linux 7'
  baseurl 'http://rpms.famillecollet.com/enterprise/7/php70/$basearch/'
  gpgkey 'http://rpms.famillecollet.com/RPM-GPG-KEY-remi'
  fastestmirror_enabled true
  action :create
end

# 関連パッケージのインストール
%w{
  php
  php-fpm
  php-opcache
  php-devel
  php-mbstring
  php-mcrypt
  php-mysqlnd
  php-phpunit-PHPUnit
  php-pecl-xdebug
}.each do |pkg|
  package pkg do
    action :install
    options "--enablerepo=remi"
  end
end

# php.ini設定
template "php.ini" do

  path "/etc/php.ini"
  owner "root"
  group "root"
  mode 0644
end

# PHPサンプルページ
template "phpinfo.php" do
  path "/var/www/html/local.develop.co.jp/htdocs/phpinfo.php"
  owner "apache"
  group "apache"
  mode 0644
  notifies :restart, 'service[httpd]'

end

ーーーーーーーーーーーーーーーーーーーーーーーーー

 

14. PHP7.0のテンプレートを作成
* site-cookbooks/php-env/templates/default/phpinfo.php.erb に以下内容を記述。
ーーーーーーーーーーーーーーーーーーーーーーーーー
<?php phpinfo(); ?>
ーーーーーーーーーーーーーーーーーーーーーーーーー

   

15. Berksfileにphp-envを追記
* 最後に、Berksfileに以下一文を追記しておく。

cookbook "php-env", path: "./site-cookbooks/php-env"

  

16. プロビジョニングを再実行
bundle exec berks install --path ./cookbooks

* うまくいかない場合は、以下コマンドを実行
berks vendor ./cookbooks

 

17. Vagrantfileにphp-envを追記
* php-envクックブックを実行するようにVagrantfileを編集する。

ーーーーーーーーーーーーーーーーーーーーーーーーー

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    config.vm.box = "opscode-centos-7.2"
    config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-7.2_chef-provisionerless.box"

    # IPアドレスの設定
    config.vm.network :private_network, ip: "192.168.33.12"

    # vagrant-omnibusの有効化
    config.omnibus.chef_version = :latest

    config.vm.provision :chef_solo do |chef|
        chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"]
        chef.json = {
            nginx: {
                env: ["php"]
            },
            php70: {
                timezone: "Asia/Tokyo"
            }
        }
        chef.run_list = %w[

            recipe[yum-epel]
            recipe[apache]

            recipe[php-env::php70]
        ]

    end
end
ーーーーーーーーーーーーーーーーーーーーーーーーー

 

18. 仮想サーバの起動とプロビジョニングを実行
vagrant up --provision

 

19. hostsの設定
* ローカルPCの C:\Windows\System32\drivers\etc\hosts に以下を追記。
192.168.33.12   local.develop.co.jp
 

20. phpinfoを表示する
* ブラウザでhttp://local.develop.co.jp/phpinfo.phpにアクセス。

  PHP7.0の情報が表示されることを確認。

  

21. MySQLをインストール
オープンソースRDBMSMySQLを扱うクックブックを作成する。

bundle exec knife cookbook create mysql -o ./site-cookbooks

 

22. MySQLのレシピを作成
site-cookbooks/mysql/recipes/default.rbに以下を追記。 
ーーーーーーーーーーーーーーーーーーーーーーーーー

remote_file "#{Chef::Config[:file_cache_path]}/mysql-community-release-el7-5.noarch.rpm" do
  source 'http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm'
  action :create
end

rpm_package 'mysql-community-release' do
  source "#{Chef::Config[:file_cache_path]}/mysql-community-release-el7-5.noarch.rpm"
  action :install
end

package "mysql-server" do
  action :install
end

template "my.conf" do
  path "/etc/my.conf"
  owner "root"
  group "root"
  mode 0644
end

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

 

23. MySQLのテンプレートを作成
* site-cookbooks/mysql/templates/default/my.conf.erb に以下内容を記述。
ーーーーーーーーーーーーーーーーーーーーーーーーー

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

#log=/var/log/mysql.log

#default-character-set=utf8
character-set-server=utf8
skip-character-set-client-handshake

innodb_file_per_table
innodb_buffer_pool_size=64M
innodb_log_file_size=16M
innodb_log_files_in_group=2

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

ーーーーーーーーーーーーーーーーーーーーーーーーー

24. Berksfileにmysqlを追記
* Berksfileに以下一文を追加しておく。
cookbook "mysql", path: "./site-cookbooks/mysql"

 

25. プロビジョニングを再実行
bundle exec berks install --path ./cookbooks

* うまくいかない場合は、以下コマンドを実行
berks vendor ./cookbooks

 

26. VagrantfileにMySQLを追記
* mysqlクックブックを実行するようにVagrantfileを編集する。

ーーーーーーーーーーーーーーーーーーーーーーーーー

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    config.vm.box = "opscode-centos-7.2"
    config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-7.2_chef-provisionerless.box"

    # IPアドレスの設定
    config.vm.network :private_network, ip: "192.168.33.12"

    # vagrant-omnibusの有効化
    config.omnibus.chef_version = :latest

    config.vm.provision :chef_solo do |chef|
        chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"]
        chef.json = {
            nginx: {
                env: ["php"]
            },
            php70: {
                timezone: "Asia/Tokyo"
            }
        }
        chef.run_list = %w[

            recipe[yum-epel]
            recipe[apache]

            recipe[php-env::php70]
            recipe[mysql]
        ]

    end
end
ーーーーーーーーーーーーーーーーーーーーーーーーー

 

27. 仮想サーバの起動とプロビジョニングを実行
vagrant up --provision

 

28. その他のパッケージをインストール
* その他、必要なパッケージをインストールするクックブックを作成する。
bundle exec knife cookbook create package -o ./site-cookbooks

  

29. その他のパッケージのレシピを作成
site-cookbooks/package/recipes/default.rbに以下を追記。 
ーーーーーーーーーーーーーーーーーーーーーーーーー

%w{
  fping
  iksemel
  net-snmp-libs
  curl
  unixODBC
  OpenIPMI-libs
  libssh2
  vim
  mlocate
}.each do |pkg|
  package pkg do
    action :install
  end
end

file "/etc/localtime" do
  content IO.read("/usr/share/zoneinfo/Japan")
end

ーーーーーーーーーーーーーーーーーーーーーーーーー

 

30. Berksfileにpacを追記
* Berksfileに以下一文を追加しておく。
cookbook "package", path: "./site-cookbooks/package"

 

31. プロビジョニングを再実行
bundle exec berks install --path ./cookbooks

* うまくいかない場合は、以下コマンドを実行
berks vendor ./cookbooks

 

32. Vagrantfileにpackageを追記
* packageクックブックを実行するようにVagrantfileを編集する。

ーーーーーーーーーーーーーーーーーーーーーーーーー

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    config.vm.box = "opscode-centos-7.2"
    config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-7.2_chef-provisionerless.box"

    # IPアドレスの設定
    config.vm.network :private_network, ip: "192.168.33.12"

    # vagrant-omnibusの有効化
    config.omnibus.chef_version = :latest

    config.vm.provision :chef_solo do |chef|
        chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"]
        chef.json = {
            nginx: {
                env: ["php"]
            },
            php70: {
                timezone: "Asia/Tokyo"
            }
        }
        chef.run_list = %w[

            recipe[yum-epel]
            recipe[apache]

            recipe[php-env::php70]
            recipe[mysql]
            recipe[package]
        ]

    end
end
ーーーーーーーーーーーーーーーーーーーーーーーーー

 

33. 仮想サーバの起動とプロビジョニングを実行
vagrant up --provision

 

Chef Soloローカル開発環境の自動構築  ~Vagrantから直接クックブックを適用~

Vagrantには、起動時または任意のタイミングでクックブックを適用する機能が予め用意されており、この機能のことをVagrantではProvisioner(プロビジョナー)と呼ぶ。
Chef SoloまたはChef Client以外に、Puppetやシェルスクリプトなどにも対応。 

1. Vagrantfileへの記述
VagrantのプロビジョニングにChef Soloを使うには、
  Vagrantfileにconfig.vm.provisionの箇所のコードを追記する。
ーーーーーーーーーーーーーーーーーーーーーーーーー

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.box = "opscode-centos-7.2"
  config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-7.2_chef-provisionerless.box"
  # Chef Clientの最新版を利用可能にする
  config.omnibus.chef_version = :latest

  config.vm.provision :chef_solo do |chef|
  # ①クックブックの配置場所を指定
  chef.cookbooks_path = "./cookbooks"
  # ②Attributeの定義
  chef.json = {
      nginx: {
         env: "ruby"
      },
      fluentd: {
          installer: "rpm"
      },
      mysql: {
          server_root_password: 'rootpass'
      }
  }
  # ③適用するクックブックの定義
  chef.run_list = %w[
      recipe[yum-epel]
      recipe[httpd]
      recipe[mysql]
      recipe[fluentd]
   ]
   end
end
ーーーーーーーーーーーーーーーーーーーーーーーーー

※①…クックブックの配置場所をVagrantfileと同じディレクトリにあるcookbooksディレクトを指定
 ②クックブックの適用の際に利用するAttributeを定義
 ③…適用するクックブックを定義

 

2. Chef Clinet/Chef Soloを自動インストール
* Bentoのboxには、Chef ClinetやChef Soloが含まれていない。
  そのため、これらを自動インストールしてくれるvagrant-omnibusプラグインを利用。
  このプラグインを使うと、仮想サーバの起動時にChef Clinetがインストールされているかを確認したうえで、インストールされていない場合は、インターネット経由でインストーラーをダウンロードし自動で仮想サーバにインストールしてくれる。

vagrant plugin install vagrant-omnibus

※この機能を有効にするには、Vagrantfileに以下を指定しておく。
config.omnibus.chef_version = :latest

 

Chef Soloローカル開発環境の自動構築  ~knife-solo Apache,MySQL設定編~

実用的な例として、ApacheMySQLのインストールとサービスの立ち上げを
クックブックを作成しながら、Chef Soloで行う。 

1. ApacheMySQLのクックブックを作成
* Apacheのクックブックを作成
knife cookbook create apache -o site-cookbooks

* MySQLのクックブックを作成
knife cookbook create mysql -o site-cookbooks

  

2. Nodeオブジェクトを設定
nodes/192.168.33.11.jsonを編集してランリストに2つのレシピを追加し、
それぞれが適用されるようにする。 

ーーーーーーーーーーーーーーーーーーーーーーーーー
{
  "run_list":[
    "recipe[dstat]",
    "recipe[apache]",
    "recipe[mysql]"
  ]
}
ーーーーーーーーーーーーーーーーーーーーーーーーー

 

3. Apacheのレシピを作成
site-cookbooks/apache/recipes/default.rbに以下を追記。 
ーーーーーーーーーーーーーーーーーーーーーーーーー
package "httpd" do

  action :install
end

service "httpd" do
  action [ :enable, :start ]
end
ーーーーーーーーーーーーーーーーーーーーーーーーー
※ :enableはOS起動時のサービスの有効化(/sbin/chkconfig httpd onに相当)
  :start はサービス起動(/sbin/service httpd startに相当)
※ packageやserviceといったキーワードを「リソース」と呼ぶ。 

 

4. MySQLのレシピを作成
site-cookbooks/mysql/recipes/default.rbに以下を追記。 
ーーーーーーーーーーーーーーーーーーーーーーーーー

remote_file "#{Chef::Config[:file_cache_path]}/mysql-community-release-el7-5.noarch.rpm" do
  source 'http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm'
  action :create
end

rpm_package 'mysql-community-release' do
  source "#{Chef::Config[:file_cache_path]}/mysql-community-release-el7-5.noarch.rpm"
  action :install
end

package "mysql-server" do
  action :install
end

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

5. knife-soloでChef Soloを実行
knife-soloを使ってリモートのノード(192.168.33.11)にプロビジョニングを実施。
knife solo cook 192.168.33.11


6. ブラウザで動作確認
http://192.168.33.11/ にアクセスしApacheのデフォルト画面が表示されることを確認。

 

7. Apacheの設定ファイルをChefで管理
* Apacheの設定、httpd.confもChefで管理できるようにしていく。
* VagrantにはホストOS(作業用マシン側)とゲストOS(仮想サーバ側)の間でディレクトを共有する機能があり、初期状態で有効になっている。試しに、ゲストOS側の /vagrantディレクトでlsを実行すると、ホストOS側で作ったVagrantfileそのほかのファイルが見えるはず。Vagrantfileを置いたディレクトリがゲストOSの /vagrantディレクトリとしてマウントされているので、このディレクトを使ってホストOSとゲストOSでのファイルのやり取りが可能。この機能を使って、ゲストOS側の /etc/httpd/conf/httpd.confをホストOS側のクックブック内のtemplate/defaultディレクトにコピーする。

* httpd.confのコピーを実行
cp /etc/httpd/conf/httpd.conf /vagrant/site-cookbooks/apache/templates/default/httpd.conf.erb

※ .erbはRubyの標準ライブラリのテンプレートエンジンであるERBの拡張子。
  ERBを使うと任意のテキストファイルにRubyスクリプトを埋め込み実行できる。
 

8. httpd.confを編集
ゲストOS側にApacheの変更を適用するため、
試しにhttpd.conf.erbに以下一文を追記する。

ServerName knife-solo.local.co.jp:80

 

9. レシピにtemplateリソースを記述
site-cookbooks/apache/recipes/default.rbに以下を追記。 
内容としては、httpd.conf.erb編集内容を/etc/httpd/conf/httpd.confに配置させ、
その際、ownerとgroupをrootでパーミッションを0644に設定せよという意味。

ーーーーーーーーーーーーーーーーーーーーーーーーー

template "httpd.conf" do
  path "/etc/httpd/conf/httpd.conf"
  owner "root"
  group "root"
  mode 0644
  notifies :reload, 'service[httpd]'
end
ーーーーーーーーーーーーーーーーーーーーーーーーー

 

10. ゲストOS側に変更内容を適用させる
以下コマンドを実行し、templateリソースの適用とApacheの設定が反映されたことを確認する。
knife solo cook 192.168.33.11

Chef Soloローカル開発環境の自動構築  ~knife-solo 操作編~

knife-soloとは・・・・?
knife-soloとは、ChefをChef Solo環境で利用するためにユーリティリティツールで、
knife-soloを使うと、手元で作ったクックブックをリモートのサーバに転送して
chef-soloコマンドを実行するといった一連の作業を自動化できる。
knife-soloはRubyGemsとして公開されており、gemでインストール可能。
そのため、はじめにrubyとgemのインストールを行う。

1. Rubyのインストールに必要なライブラリをインストール
* コンパイルコマンドを含めzip解凍などに必要なライブラリをインストールする。
yum install gcc zip unzip zlib zlib-devel openssl openssl-devel


2. Rubyをインストール
gemがyumで入手できる ruby のバージョンに対応していないので、
  公式サイトから最新版を入手してソースからコンパイル&インストールを行う。

* ruby の公式ページに行って最新版をダウンロード。
https://www.ruby-lang.org/ja/downloads/

* この時点では、2.4.0が最新版(安定版)なのでこちらを使う。
mkdir works
cd works
wget https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.0.tar.gz --no-check-certificate
tar zxvf ruby-2.4.0.tar.gz
cd ruby-2.4.0

./configure
make; make install

* Rubyがインストールされたことを確認
ruby -v
ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-linux]

 

3. Rubyにzlibとopensslを組み込む
rubyをソースからインストールしてchefをインストールしようとすると
  zlibやopenssl まわりのエラーが出てしまうので、
  rubyのソースディレクトリから zlib のライブラリを作っておく。
cd ext/zlib
ruby extconf.rb
make; make install

* つぎに同じくソースディレクトリからopensslのライブラリをつくる。
  同様の流れでmakeを行うと以下のエラーが出てしまう。
「No rule to make target `/thread_native.h」
  元々のMakefileにtop_srcdirの記述が足りないことが原因のため、
  以下コマンドを実行することでopensslのライブラリをつくる。
cd ext/openssl
ruby extconf.rb
sed -i -e "1i top_srcdir = $(cd ../.. && pwd)" Makefile
make; make install

sed の 「$(cd ../.. && pwd)」という部分は、
 rubyのソースディレクトリを指定しておけばOK。

 

4. gemをインストール
* rubygem の公式サイトに行って最新版をダウンロード。
https://rubygems.org/pages/download/

* この時点では、2.6.8が最新版(安定版)なのでこちらを使う。
mkdir works
cd works
wget https://rubygems.org/rubygems/rubygems-2.6.8.zip --no-check-certificate
unzip rubygems-2.6.8.zip
cd rubygems-2.6.8 

ruby setup.rb
make; make install

 

5. knife-solo/Berkshelfをインストール
* knife-soloをインストール
gem install knife-solo

* knife-soloは、他のgemのインストール有無によってデフォルトのオプションが変化するため、クックブックの依存関係を管理するBerkshelfをインストールしておく。
gem install berkshelf

 

6. knife-soloでリポジトリを作成
knife-soloでChef Soloを利用するにあたって、
まずはChefリポジトリを新規にローカル側に作成する。

「knife solo init . 」コマンドを実行すると
Chefに必要な各種ファイルとディレクトが展開される。
knife solo init . 

※以下のエラーが起きる場合がある
Cannot find subcommand for: 'solo init .'

※原因はgemのknife-soloが二つ存在していること。
   以下コマンドを実行し再度「knife solo init . 」を実行すればよい。
/opt/chef/embedded/bin/gem install knife-solo
gem cleanup knife-solo
knife solo init .

 

7. rsyncをインストール
knifo-soloサーバー側にrsyncをインストールしておく
yum install rsync

8. knife solo bootstrapによるChef Soloのインストールテスト
knife solo bootstrap [ホスト名 or IPアドレス] コマンドを実行し、knife-soloサーバーから他のサーバに対してChef Soloのインストールを実行してみる。
knife solo bootstrap 192.168.33.11 (※192.168.33.11のサーバを別途用意しておく)

 

9. knifeでクックブックを作成
クックブックの作成はknife-soloではなく、先ほどと同じくknifeで作ります。
knifeはChefに付属のツールで、knife-soloはChef Solo用にknifeを拡張するプラグインという関係。
したがって、kunifeがもともともっている機能で事足りるものはknifeで、knife-soloで拡張しないと使えない機能は、knife soloのようにサブコマンとsoloを付けて実行する。
knife cookbook create を実行しクックブックを作成する。
このとき -o でクックブックの出力先をsite-cookbooksディレクトリに指定します。
Chefにおいては自作のクックブックはsite-cookbooksに置くのが慣習になっているのでそれに従うようにする。
* site-cookbooks配下にdstatクックブックを作成

knife cookbook create dstat -o site-cookbooks

 

10. Nodeオブジェクトを設定
nodes/192.168.33.11.jsonを編集してランリストにdstatのレシピを追記する。 
ーーーーーーーーーーーーーーーーーーーーーーーーー
{
  "run_list":[
    "recipe[dstat]"
  ]
}
ーーーーーーーーーーーーーーーーーーーーーーーーー

 

11. dstatをインストールするレシピを作成
site-cookbooks/dstat/recipes/default.rbに以下を追記。
ーーーーーーーーーーーーーーーーーーーーーーーーー

package "dstat" do
  action :install
end
ーーーーーーーーーーーーーーーーーーーーーーーーー

 

12. knife-soloでChef Soloを実行
knife-soloを使ってリモートのノード(192.168.33.11)にプロビジョニングを実施。
knife solo cook [ホスト名 or IPアドレス] コマンドで実行する。

また、knife solo cookコマンドの裏側では、rsyncでknife-soloサーバからリモートにクックブックが転送され、
SSH経由でsudo付きでchef-soloコマンドが実装されている。その際、先に作ったNodeオブジェクトからノードの状態が読み込まれている。
knife solo cook 192.168.33.11



 

Chef Soloローカル開発環境の自動構築  ~Chefの用語編~

1. Chef の用語
Chefでは「コードで書いたサーバ設定の手順」をレシピと呼ぶ。
また、ファイルに対するディレクトリ、あるいはクラスに対する名前空間のように、特定のレシピに必要なデータやファイルをまとめたものを「クックブック」と呼ぶ。
そして、クックブック群を含む、Chefの実行に必要な一連のファイルをまとめた入れ物のことを
リポジトリ」または「キッチン」と呼ぶ。
つまりChefでは、
リポジトリ > クックブック > レシピ
という階層でレシピ群が管理されている。

Chef Soloローカル開発環境の自動構築  ~Chef Solo 操作編~

1. Chef Solo インストール
* Chef社が提供しているオムニバスインスト―ラーを使ってChefをインストール
curl -L https://www.opscode.com/chef/install.sh | sudo bash

* インストールが完了したらchef-soloコマンドが実行できるか確認
(バージョンが表示されたらOK)
chef-solo -v 

 

2. knifeコマンドでクックブックを作成
デフォルトでは、Chefのリポジトリは/var/chefディレクトが使われるので、
サンプルではこのディレクトの中にというリポジトリを操作するための
ツールがインストールされ、クックブックはこのknifeコマンドを使って作成する。
knife cookbook create [クックブック名] -o [出力先ディレクトリ]
sudo knife cookbook create hello -o /var/chef/cookbooks

※/var/chef/cookbooksディレクトリ内にhelloというクックブックが作成される。

 

3. Chef Soloをテスト実行
*「Hello, World!」というログ出力を行うレシピを作成する。
クックブックを作成するとrecipesディレクトリの中にdefault.rbという名前で
ひな形ファイルが作成されており、今回はそのファイルに以下一文を追記する。
sudo vim /var/chef/cookbooks/hello/recipes/default.rb 
log "Hello, World!"

*クックブックを作りレシピを用意できたら、chef-soloコマンドをテスト実行する。
 -oオプションでhelloクックブックを使うことを明示的に指定し、実行する。
sudo chef-solo -o hello

 

 4. Chef Soloでパッケージをインストール
* サーバモニタリングツールのdstatをテストインスト―ルする。
sudo knife cookbook create dstat -o /var/chef/cookbooks

* dstatパッケージをインストールする設定を、
  recipesディレクトリの中のdefault.rbに記述。
sudo vim /var/chef/cookbooks/dstat/recipes/default.rb 
ーーーーーーーーーーーーーーーーーーーーーーーーー
package "dstat" do
    action :install
end
ーーーーーーーーーーーーーーーーーーーーーーーーー

chef-soloコマンドを実行し、dstatのインストールを行う。
sudo chef-solo -o hello,dstat

* rpmコマンドでdstatがインストールされたか確認。
rpm -qa dstat