Chef Serverを構築する

2017年2月10日

Chef Serverを構築した時の手順をまとめました。
Chef Serverの導入について、日本語の資料で書かれてるものがほとんどなかったので、導入手順をまとめておきます。

もし、「Chef Server構築したい!!」って方がいましたら、参考までにどうぞ。

Chef Server構築

実行環境

  • Mac OSX:Chef Workstationを導入する
  • CentOS(仮想環境):Chef Serverを導入する
  • CentOS(仮想環境):Chef Clientを導入する

VirtualBoxインストール

今回はCentOSの仮想環境を作るためにVagrantを利用するのですが、その前準備としてVirtualBoxをインストールします。

  1. VirtualBoxのダウンロードサイトからVirtualBox ** OS X hosts 「x86/amd64」をクリックして、dmgファイルをダウンロード
  2. ダウンロードしたdmgファイルを開き、VirtualBoxをインストール

私の環境はMacなのでdmgファイルをダウンロードしてますが、利用してる環境(WindowsとかLinux)によってダウンロードするファイルを選んでください。

Vagrantインストール

  1. VagrantのダウンロードサイトからMac OS X用のインストーラをダウンロード
  2. ダウンロードしたdmgファイルを開きVagrantをインストール

Vagrantバージョン確認

Vagrantインストールできてるかどうかは、下記コマンドで確認できます。

$ vagrant -v
Vagrant 1.7.4

こんな感じでバージョンが確認できればインストール成功です。

Vagrantfileを作成する

VagrantChef ServerChef Clientの仮想環境を構築するための設定ファイルを作成します。

まず、Vagrantで仮想環境を構築するフォルダを作成します。

$ mkdir /path/to/vagrant

次に、Chef-ServerChef Clientを構築するためのフォルダを作成します。

$ cd /path/to/vagrant
$ mkdir /path/to/vagrant/chef

Vagrantを使うために初期化処理を実行します。

$ vagrant init

Vagrantを初期化すると、先ほど作成したchefフォルダに「Vagrantfile」が作成されるので、そのファイルを編集するんですが、その前にVagrantのプラグインをあらかじめインストールしておきます。

$ vagrant plugin install vagrant-vbguest
$ vagrant plugin install vagrant-omnibus

Vagrantfileを編集します。

$ vim Vagrantfile

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

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

# chef-serverの設定情報
$script = <<EOF
  # yumアップデート
  sudo yum update -y
  # yumパッケージのインストール
  sudo yum install wget ntp openssl-devel
  # 日付と時刻をNTPサーバと同期
  sudo ntpdate ntp.nict.jp
  # Chef Serverのリポジトリダウンロード
  (cd /tmp && wget https://web-dl.packagecloud.io/chef/stable/packages/el/5/chef-server-core-12.0.1-1.x86_64.rpm)
  # Chef Serverパッケージインストール
  sudo rpm -Uvh /tmp/chef-server-core-12.0.1-1.x86_64.rpm
EOF

# chef-clientの設定情報
$client_script = <<EOF
  # yumアップデート
  sudo yum update -y
  # yumパッケージのインストール
  sudo yum install wget ntp openssl-devel
  # 日付と時刻をNTPサーバと同期
  sudo ntpdate ntp.nict.jp
  # Chef Clientインストール
  curl -L https://www.chef.io/chef/install.sh | sudo bash
  # hostsファイルにchef-serverのIPとドメインを追加
  sudo bash -c "echo '192.168.33.12 chef-server' >> /etc/hosts"
EOF

# 設定した情報で仮想環境を作成する
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vbguest.auto_update = false
  config.omnibus.chef_version = :latest

  # chef-server作成
  config.vm.define :chef_server do |host|
    host.vm.box = 'centos64'
    host.vm.box_url = 'https://github.com/2creatives/vagrant-centos/releases/download/v6.4.2/centos64-x86_64-20140116.box'
    host.vm.hostname = 'chef-server'
    host.vm.network :private_network, ip: '192.168.33.12'
    host.vm.provision :shell, :inline => $script
  end

  # chef-client作成
  config.vm.define :chef_client do |host|
    host.vm.box = 'centos65'
    host.vm.box_url = 'https://github.com/2creatives/vagrant-centos/releases/download/v6.4.2/centos64-x86_64-20140116.box'
    host.vm.hostname = 'chef-client'
    host.vm.network :private_network, ip: '192.168.33.13'
    host.vm.provision :shell, :inline => $client_script
  end
end

Chef Server作成

Vagrantを使ってChef Serverを作成します。

# chef_serverセットアップ
$ vagrant up chef_server

# chef_serverにログイン
$ vagrant ssh chef_server

# Chef Serverセットアップ
$ sudo chef-server-ctl reconfigure

# Web UIインストール
$ sudo chef-server-ctl install opscode-manage
$ sudo opscode-manage-ctl reconfigure
$ sudo chef-server-ctl reconfigure

# testを実行
$ sudo chef-server-ctl test

Chef Workstationhostsファイルを変更します。

# vim /etc/hosts

192.168.33.12 chef-server

Chef Serverの作成が完了したらhttps://chef-server/signupにアクセスできるようになります。

Chef Serverへアクセスするユーザを作成する

下記コマンドを実行してChef Serverへアクセス可能なユーザを作成します。

# chef_serverにアクセス
vagrant ssh chef_server

# ユーザ登録
$ sudo chef-server-ctl user-create admin firstname lastname your@mail.address password --filename admin.pem

# organization登録
# 鍵はORGANIZATION-validator.pemとなる
$ sudo chef-server-ctl org-create chef "Chef" --association admin --filename chef-validator.pem

# 鍵ができていることを確認
$ ls
admin.pem chef-validator.pem install.sh

Chef Workstationのknife.rb設定

knife.rbへの設定の前に下記コマンドを実行してGemfileを作成します。

$ vim /path/to/vagrant/chef/Gemfile

# Gemfile
source 'https://rubygems.org'

gem 'chef'
gem 'knife-solo'

knife.rbの設定を行います。

$ bundle exec knife configure
# 順番に設定していく
WARNING: No knife configuration file found
Where should I put the config file? [/Users/.chef/knife.rb] ~/.chef/knife.rb
Please enter the chef server URL: https://chef-server/organizations/chef/
Please enter an existing username or clientname for the API: [USER] admin
Please enter the validation clientname: [chef-validator] chef-validator
Please enter the location of the validation key: [/etc/chef-server/chef-validator.pem] ~/.chef/chef-validator.pem
Please enter the path to a chef repository (or leave blank):

上記の設定が完了するとknife.rbが下記のような設定になります。

# ~/.chef/knife.rb
log_level :info
log_location STDOUT
node_name 'admin'
client_key '/Users/koichi-ezato/.chef/admin.pem'
validation_client_name 'chef-validator'
validation_key '/Users/koichi-ezato/.chef/chef-validator.pem'
chef_server_url 'https://chef-server/organizations/chef/'
syntax_check_cache_path '/Users/koichi-ezato/.chef/syntax_check_cache'

Chef WorkstationにChef Serverの鍵を転送する

下記コマンドでChef Serverに配置されているpemファイルをChef Workstationへ転送します。

$ scp -o stricthostkeychecking=no vagrant@192.168.33.12:/home/vagrant/admin.pem ~/.chef/admin.pem
Warning: Permanently added '192.168.33.12' (RSA) to the list of known hosts.
vagrant@192.168.33.12's password: vagrant

$ scp -o stricthostkeychecking=no vagrant@192.168.33.12:/home/vagrant/chef-validator.pem ~/.chef/chef-validator.pem
vagrant@192.168.33.12's password: vagrant
chef-validator.pem

# 証明書も取得
$ bundle exec knife ssl fetch -s https://chef-server/organizations/chef/

鍵と証明書が取得できたらsslで通信ができるか確認します。

$ bundle exec knife ssl check

# 鍵と証明書が転送されていることを確認
ls ~/.chef
admin.pem       chef-validator.pem  knife.rb        trusted_certs

nodeとuserを確認する

client nodeclient userを確認します。

# client nodeの確認
$ bundle exec knife client list
chef-validator

# client userの確認
bundle exec knife user list
admin

Chef Clientを作成する

Vagrantを使ってChef Clientを作成します。

# chef_clientセットアップ
$ vagrant up chef_client

# chef_clientにログイン
$ vagrant ssh chef_client

# hostsの設定
$ vi /etc/hosts

# /etc/hosts
# hostsに下記の記載がなければ追加する
192.168.33.12 chef-server

exit

Chef WorkstationからChef Serverにnodeを登録

nodeを登録する前にChef Workstationchef-clientのIPアドレスとドメインを追加します。

# vim /etc/hosts

# /etc/hosts
192.168.33.13   chef-client

nodeを登録します。

bundle exec knife bootstrap chef-client -x vagrant -P vagrant --sudo

nodeを確認します。

$ bundle exec knife node list
chef-client

chef-clientというnodeが確認できました。

Chef Clientの情報を取得してみる

これまでの設定で一通りの設定が完了したので、実際に使えるかどうか試してみます。
Chef Workstation(Mac端末)からChef Clientの情報を取得してみます。

$ bundle exec knife client show chef-client
admin:      false
chef_type:  client
name:       chef-client
public_key: -----BEGIN PUBLIC KEY-----
...
...
-----END PUBLIC KEY-----
validator:  false

こんな感じで繋がってるのが確認できれば成功です。

あとはChefCookbookとかRecipeの設定を頑張ってChef Clientを作成していく必要があります。
Chef Clientの情報はブラウザ(https://chef-server/)からも確認できます。