かざん

徒然に

Vagrantを使ってChefのSever/Client環境を構築

Vagrantを使ってChefのSever/Client環境を構築したのでその備忘録 (1年くらいまえにやったことなので、多少情報が古い可能性がある...)

概要

やったこと

Vagrantを使って以下4つのVMを立てて、ChefのSever/Client環境を構築した - Chef Server - Chef Client01 - Chef Client02 - Chef Client03 VMのOSはCent OS7.2

Chefの構成

Workstation:Chef ServerへCookbookをアップロードしたり設定変更を行う環境 - 今回は手元のMacBookを使用 Chef Server:Chefの設定ファイルを管理するサーバー Chef Client:Chefによって管理されているサーバー - 厳密に言えばこの文章で述べているClientはNodeのことを指している

仕組み

WorkstationからChef ServerにCook Bookアップロード WorkstationからChef Client起動 Chef ClientがChef ServerからCookbookを取り込む

参考にさせていただいた記事

Chef client-server入門 <男は黙ってChef client-server> - Qiita Vagrantで作った環境にChef12 でChef Serverをためしてみた · GitHub https://qiita.com/brighton0725/items/cc363e9400d133c0f9e8j

Workstation(ローカル環境)の事前準備

chefdkのインストール

https://downloads.chef.io/chefdk こちらのダウンロードページからOS X を選択してdmgファイルをダウンロード。 ダウンロードしたdmgファイルを起動させ、指定の通りにNextボタンを押してインストールを完了させる インストールが完了したら以下のコマンドで確認

$ chef --version
Chef Development Kit Version: 3.3.23
chef-client version: 14.5.33
delivery version: master (6862f27aba89109a9630f0b6c6798efec56b4efe)
berks version: 7.0.6
kitchen version: 1.23.2
inspec version: 2.2.112

作業ディレクトリを作成しVagrant環境構築

$ mkdir chef-server-client
$ cd $_

下記サイトからBOXのURLをコピーしてくる - http://www.vagrantbox.es/

$ vagrant box add centos72 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box
$ vagrant init centos72

起動時に自動でVMにChef Solo及びChef Clientをインストールしてくれるvagrant-omnibusをインストール

vagrant plugin install vagrant-omnibus

Vagrantfile編集

以下Vagrantfileの中身

$script = <<EOF
  sudo yum update -y
  sudo yum install -y wget ntp openssl-devel
  sudo ntpdate ntp.nict.jp
  sudo rpm -Uvh https://packages.chef.io/files/stable/chef-server/12.17.33/el/7/chef-server-core-12.17.33-1.el7.x86_64.rpm
EOF

$client_script = <<EOF
  sudo yum update -y
  sudo yum install -y ntp openssl-devel
  sudo ntpdate ntp.nict.jp
  curl -L https://www.chef.io/chef/install.sh | sudo bash
  sudo bash -c "echo '192.168.33.12 chef-server' >> /etc/hosts"
EOF

Vagrant.configure("2") do |config|

  config.omnibus.chef_version = :latest

  config.vm.define :chef_server do |host|
    host.vm.box = "centos/7"
    host.vm.hostname = 'chef-server'
    host.vm.network :private_network, ip: '192.168.33.12'
    host.vm.provision :shell, :inline => $script
  end

  config.vm.define :chef_client01 do |host|
    host.vm.box = "centos/7"
    host.vm.hostname = 'chef-client'
    host.vm.network :private_network, ip: '192.168.33.13'
    host.vm.provision :shell, :inline => $client_script
  end

  config.vm.define :chef_client02 do |host|
    host.vm.box = "centos/7"
    host.vm.hostname = 'chef-client'
    host.vm.network :private_network, ip: '192.168.33.14'
    host.vm.provision :shell, :inline => $client_script
  end

  config.vm.define :chef_client03 do |host|
    host.vm.box = "centos/7"
    host.vm.hostname = 'chef-client'
    host.vm.network :private_network, ip: '192.168.33.15'
    host.vm.provision :shell, :inline => $client_script
  end

end

Chef Serverの構築

$ vagrant up chef_server
$ vagrant ssh chef_server

以下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

Web UI のインストールに成功すると、https://192.168.33.12 にアクセスできるようになる 後述するWorkstation側でhosts の設定をしていると https://chef-server/ でもアクセスできる

ユーザー, organization作成

用途 - ユーザ: Web UIのログインに必要 - 組織: Chef Server内を論理分割するのに必要 今回作成したユーザ、組織 - ユーザ名: kazan - 組織名: pokoya 組織名、ユーザ名に特に深い意味はない

ユーザー登録

$ chef-server-ctl user-create USER_NAME FIRST_NAME LAST_NAME EMAIL 'PASSWORD' --filename FILE_NAMEで作成

$ sudo chef-server-ctl user-create kazan admin admin xxxxxxx@gmail.com 'XXXXXX' --filename kazan.pem

organization登録

鍵は ORGANIZATION-validator.pem となる

$ sudo chef-server-ctl org-create pokoya "pokoya org" --association_user kazan --filename /etc/opscode/pokoya/pokoya-validator.pem

確認

$ sudo chef-server-ctl user-list
kazan
pivotal
$ sudo chef-server-ctl org-list
pokoya
$ ls
kazan.pem  pokoya-validator.pem

WebUI(https://192.168.33.12)でログインできるか確認 f:id:okuya-KAZAN:20181021232357p:plain f:id:okuya-KAZAN:20181021232358p:plain f:id:okuya-KAZAN:20181021232400p:plain

Workstationでの準備

$ sudo vim /etc/hosts
# 以下追記
192.168.33.12 chef-server

workstation内のChef-repoとChef Serverを紐付けるにはChef-repoの.chef以下に以下のファイルが必要 - knife.rb - ORGANIZATION-validator.pem - USER.pem

まだChefサーバとの接続確認はとれない

$ knife ssl check
WARNING: No knife configuration file found. See https://docs.chef.io/config_rb_knife.html for details.
Connecting to host localhost:443
ERROR: Network Error: Connection refused - connect(2) for "localhost" port 443
Check your knife configuration and network settings

.chef/knife.rb の設定

$ cd chef-server-cleient
$ mkdir .chef

WebUIに接続(https://192.168.33.12)し、「Generate Knife Config」を押して、knife.rbをダウンロード f:id:okuya-KAZAN:20181021231555p:plain

ダウンロードしてきたknife.rbを.chef以下に配置

$ cp ~/Downloads/knife.rb ./.chef/
$ cat .chef/knife.rb
# See https://docs.getchef.com/config_rb_knife.html for more information on knife configuration options
current_dir = File.dirname(__FILE__)
log_level                :info
log_location             STDOUT
node_name                "kazan"
client_key               "#{current_dir}/kazan.pem"
chef_server_url          "https://chef-server/organizations/pokoya"
cookbook_path            ["#{current_dir}/../cookbooks"]

Workstationに鍵を転送

USER.pem, ORGANIZATION-validator.pemをServerからコピーしてきて.chef以下に配置

# USER.pem
$ scp -o stricthostkeychecking=no vagrant@192.168.33.12:/home/vagrant/kazan.pem .chef/kazan.pem

# ORGANIZATION-validator.pem
$ scp -o stricthostkeychecking=no vagrant@192.168.33.12:/home/vagrant/pokoya-validator.pem .chef/pokoya-validator.pem

コピーしたファイルのパーミッションは 600に変更

$ sudo chmod 600 .chef/*pem

証明書もってくる

knife.rb で設定したChef Serverの自己証明書を信頼する設定コマンドknife ssl fetchを実行する 設定は knife.rb が参照できるよう作業ディレクトリ配下で実行

$ knife ssl fetch -s https://chef-server/organizations/pokoya

確認

.chef以下に必要なファイルの用意ができたことで、Chefサーバーとの接続確認がknifeコマンドを通して可能になる sslで通信ができるかチェック

$ knife ssl check
Connecting to host chef-server:443
Successfully verified certificates from `chef-server'

確認

$ ls -l .chef
-rw-------  1 okuyamatakashi  staff  1678 10 21 21:45 kazan.pem
-rw-r--r--@ 1 okuyamatakashi  staff   415 10 21 21:42 knife.rb
-rw-------  1 okuyamatakashi  staff  1678 10 21 21:47 pokoya-validator.pem
drwxr-xr-x  3 okuyamatakashi  staff   102 10 21 21:51 trusted_certs

$ knife user list # ユーザ名確認
kazan

$ knife client list # 組織名確認
pokoya-validator

$ knife node list
# 出力なし

Chef Clientの準備

Chef Serverとの認証は鍵認証を使う 鍵認証のやり方の1つに、Chef ServerはClientごとに秘密鍵を発行し、公開鍵を自身(Chef Server)に登録する方法がある だが、clientごとに発行するのは手間なので、Chef Serverにあらかじめ用意されているvalidator keyを使う ClientがChef Serverとの通信の際にvalidator keyを使うことで、Chef Serverにclientとして登録され、以降の認証に必要な鍵が発行される - これは最初の1回目にだけ利用される

$ vagrant up chef_client01
$ vagrant ssh-config chef_client01 --host chef-client01 >> ~/.ssh/config
$ vagrant up chef_client02
$ vagrant ssh-config chef_client02 --host chef-client02 >> ~/.ssh/config
$ vagrant up chef_client03
$ vagrant ssh-config chef_client03 --host chef-client03 >> ~/.ssh/config

Workstation上でnodeの登録

knife bootstrap NodeのIPアドレス -x username --sudoで登録できる

$ knife bootstrap chef-client01 -x vagrant -P vagrant --sudo
$ knife bootstrap chef-client02 -x vagrant -P vagrant --sudo
$ knife bootstrap chef-client03 -x vagrant -P vagrant --sudo

Nodeの名前を指定したい場合(例: chef-client01-DBnode)

$ knife bootstrap 192.168.33.13 --ssh-user vagrant --ssh-password 'vagrant' --sudo --use-sudo-password --node-name chef-client01-DBnode

確認

nodeの確認

$ knife node list
chef-client01
chef-client02
chef-client03

Clientの確認

$ knife client list
chef-client01
chef-client02
chef-client03
pokoya-validator

今後

今回作成したWorkstationの作業ディレクトリをChef-repoとしてレシピを作成してノードに適用していく 今回はそのための土台作り