chef
knife
chef-server
chef-client

Chef Server 11 環境構築手順

More than 1 year has passed since last update.

Chefの検証と勉強用に、AWS上でChef ServerとChef ClientとなるNodeを構築。
Workstationは自分の作業用Macとして、knifeコマンドで色々やっちゃう。

前提

  • AWS関連の設定(IAM,VPC等)は済んでる、もしくは分かっているということで

環境

役割 ホスト名 OS
Chef Server test-chef-server Amazon Linux AMI 2014.09.1 (HVM)
Chef Client(Node) test-chef-client Amazon Linux AMI 2014.09.1 (HVM)
Workstation - Mac OS X 10.10.1

Workstationセットアップ

基本的に全ての作業をWorkstationのCLI上から実行する為、先に環境構築。

knifeインストール

ほぼ全ての操作をknifeコマンドで実行する。環境構築には不要だけど、とりあえずberkshelfも入れる。

Workstation
$ sudo gem install knife-solo
$ sudo gem install berkshelf

knife-ec2インストール

EC2もknifeから操作したいので knife-ec2 を入れる。が、Macの場合は先にXcodeを入れて、Command Line Toolsを入れる必要がある。
AppStoreからXcodeを入れた後、以下のコマンドを実行してCommand Line Toolsをインストールする。

Workstation
$ xcode-select --install

その後、knife-ec2をインストールする。

Workstation
$ sudo gem install knife-ec2

hosts設定

名前解決用にWorkstation上で設定しておく。

Workstation
$ sudo vi /etc/hosts
10.3.1.85    test-chef-server
10.3.1.86    test-chef-client

Chef環境構築

Chef Server及びChef Client用のEC2インスタンスを起動させる。

knife用設定

AWS用鍵設定

knife-ec2 コマンド用に作成。すでに ~/.aws/credentials とかあれば、そちらでも良い。

Workstation
$ mkdir ~/.chef
$ vi ~/.chef/credentials
[default]
aws_access_key_id = Your_Access_Key
aws_secret_access_key = Your_Secret_Key

knife用AWS関連設定

AWS関連の設定を追加する。ちなみに後で knife configure すると消えるので再度設定する必要がある。

Workstation
$ vi ~/.chef/knife.rb
knife[:aws_credential_file] = "/Users/NAME/.chef/credentials"
knife[:availability_zone] = "AZ"
knife[:region] = "Region"
knife[:aws_ssh_key_id] = "mypem_name"

試しに動作確認。以下のように表示されなければ、AWS関連の設定を見直す。

Workstation
$ knife ec2 server list
Instance ID  Name  Public IP  Private IP  Flavor    Image         SSH Key  Security Groups  IAM Profile  State
i-XXXXXXXX   XXXX             10.X.X.XX   m3.large  ami-XXXXXXXX  XXXXXXX  XXXXXXXXXXX      XXXXXX       running
i-XXXXXXXX   XXXX                         t1.micro  ami-XXXXXXXX  XXXXXXX  XXXXXXXXXXX                   stopped
    :
    :
    :

EC2インスタンス起動

Amazon Linux AMI 2014.09.1 (HVM) - ami-4985b048 を使用してt2.microで起動させる。

Workstation
knife ec2 server create \
--ebs-size 30 \
--flavor t2.micro \
--image ami-4985b048 \
--private-ip-address 10.3.1.85 \
--security-group-ids sg-XXXXXXXX \
--subnet subnet-XXXXXXXX \
-T Name=test-chef-server

上手くいくとこんなログ。最後のエラーはまだ設定してないchef関係のログなので一旦無視。

Instance ID: i-XXXXXXXX
Flavor: t2.micro
Image: ami-4985b048
Region: ap-northeast-1
Availability Zone: ap-northeast-1X
Security Group Ids: sg-XXXXXXXX
Tags: Name: test-chef-server
SSH Key: XXXX

Waiting for EC2 to create the instance................
Subnet ID: subnet-XXXXXXXX
Tenancy: default
Private IP Address: 10.3.1.85

Waiting for sshd access to become available.done
Connecting to 10.3.1.85
ERROR: Errno::ENOENT: No such file or directory - /etc/chef/validation.pem

Chef Server用のインスタンスが無事起動できたら、IPアドレスとタグ名だけ変えてChef Clientも。

Workstation
$ knife ec2 server create \
--ebs-size 30 \
--flavor t2.micro \
--image ami-4985b048 \
--private-ip-address 10.3.1.86 \
--security-group-ids sg-XXXXXXXX \
--subnet subnet-XXXXXXXX \
-T Name=test-chef-client

Chef Server構築

OS設定

Chef Serverインストール前に必要な設定を追加する。
特にホスト名関係を設定しておかないとハマる。

hostname設定

Chef-Server
$ sudo vi /etc/hosts
10.3.1.85   test-chef-server

$ sudo sed -i -e 's/HOSTNAME=\(.*\)/HOSTNAME=test-chef-server/' /etc/sysconfig/network
$ sudo hostname test-chef-server

Chef Serverインストール

Chef-Server
$ wget https://web-dl.packagecloud.io/chef/stable/packages/el/6/chef-server-11.1.6-1.el6.x86_64.rpm
$ sudo rpm -Uvh chef-server-11.1.6-1.el6.x86_64.rpm
$ sudo chef-server-ctl reconfigure

動作確認。

Chef-Server
$ sudo chef-server-ctl test

0 failures と表示されれば問題なし。
ブラウザで https://test-chef-server にアクセスすると、
SSL証明書のエラー云々についてブラウザから言われるが無視して進める。
右下にadminのパスワードが記載されているので、ログイン後に変更する。

Workstation側セットアップ

鍵ファイル配置

Chef-Serverとの通信用にChef Server上にある鍵ファイルをWorkstationに持ってくる。
事前にChef Server上で持ってこれるようにコピーして権限変更する。

Chef-Server
$ sudo cp /etc/chef-server/admin.pem /tmp
$ sudo cp /etc/chef-server/chef-validator.pem /tmp
$ sudo chown ec2-user /tmp/*.pem

Workstation上に配置した後は削除。

Workstation
$ scp -i ~/.ssh/MY.pem ec2-user@test-chef-server:/tmp/*.pem ~/.chef
$ ssh -i ~/.ssh/MY.pem ec2-user@test-chef-server "rm -f /tmp/*.pem"

Cookbook雛形取得

github上から取得する。

Workstation
$ git clone git://github.com/opscode/chef-repo.git
$ ls -1 chef-repo
LICENSE
README.md
chefignore
config
cookbooks
data_bags
environments
roles

SSL疎通設定

オレオレ証明書なのでエラーが出るため、事前に設定しておく。

Workstation
$ knife ssl fetch https://test-chef-server

knife設定

Workstation
$ knife configure --initial
Overwrite /Users/NAME/.chef/knife.rb? (Y/N) y
Please enter the chef server URL: [https://localhost.local:443] https://test-chef-server
Please enter a name for the new user: [NAME] dev
Please enter the existing admin name: [admin]
Please enter the location of the existing admin's private key: [/etc/chef-server/admin.pem] /Users/NAME/.chef/admin.pem
Please enter the validation clientname: [chef-validator]
Please enter the location of the validation key: [/etc/chef-server/chef-validator.pem] /Users/NAME/.chef/chef-validator.pem
Please enter the path to a chef repository (or leave blank): /Users/NAME/chef-repo
Creating initial API user...
Please enter a password for the new user:
Created user[dev]
Configuration file written to /Users/NAME/.chef/knife.rb

Chef Serverとの通信確認。

Workstation
$ knife user list
admin
dev

knife configure で上書きされてしまった以下設定を追記しておく。まぁでももう使わないから任意で。

Workstation
$ vi ~/.chef/knife.rb
knife[:aws_credential_file] = "/Users/NAME/.chef/credentials"
knife[:availability_zone] = "AZ"
knife[:region] = "Region"
knife[:aws_ssh_key_id] = "mypem_name"

Chef Client構築

hostname設定

Chef Serverと同様に。本来ならば、EC2インスタンス起動時に設定されるのがよさげ。

Chef-Client
$ sudo vi /etc/hosts
10.3.1.85   test-chef-server

$ sudo sed -i -e 's/HOSTNAME=\(.*\)/HOSTNAME=test-chef-client/' /etc/sysconfig/network
$ sudo hostname test-chef-client

chef-client インストール

chef-clientをインストールし、Nodeとしても登録。

Workstation
$ knife bootstrap -i ~/.ssh/MY.pem test-chef-client -x ec2-user --sudo

コマンドで追加されたことを確認。

Workstation
$ knife client list
test-chef-client

$ knife node list
test-chef-client

Recipe実行

以上で環境は整ったので、動作確認がてら簡単なRecipeを実行する。
全てWorkstationから全て実行。

Coockbook作成

githubから取得したのをベースにして、新しく base_packages を作成。

Workstation
$ knife cookbook create base_packages
$ ls -1F chef-repo/cookbooks/base_packages/
CHANGELOG.md
README.md
attributes/
definitions/
files/
libraries/
metadata.rb
providers/
recipes/
resources/
templates/

Recipe修正

適当なパッケージを追加。

Workstation
vi chef-repo/cookbooks/base_packages/recipes/default.rb
chef-repo/cookbooks/base_packages/recipes/default.rb
%w{dstat git wget expect}.each do |pkg|
  package pkg do
    action :install
  end
end

Cookbookアップロード

個別にアップロードも可能だが、今回は全部。

Workstation
$ knife cookbook upload -a
Uploading base_packages [0.1.0]
Uploaded all cookbooks.

$ knife cookbook list
base_packages   0.1.0

Run List追加

NodeのRun ListにRecipeを追加

Workstation
$ knife node run_list add test-chef-client "recipe[base_packages]"
test-chef-client:
  run_list: recipe[base_packages]

NodeでRecipeを実行

ssh経由でリモート実行。

Workstation
$ ssh -t -i ~/.ssh/MY.pem ec2-user@test-chef-client "sudo chef-client"

以上。