Posted at

Chef Server 11 環境構築手順

More than 3 years have 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"



以上。