Chef12でChef Serverを試してみた

普段はChef Soloしか使う機会がないので、Chef Serverを試してみた。
ちなみに、Chef12からはClientからServerへのリクエストにおいて、SSL証明書の検証が必要になり安全性がたかまったとか。

初めに一度それぞれの名称を整理しておく。

  • Chef Server:Clientの管理を行う(host name: chef_server)
  • Chef Node:Chefによって構築、管理される対象(host name: chef_client)
  • Chef Workstation:Cookbookの作成、更新を行う端末

Vagrantfileを作成

chef-server、chef-clientの2台分VMを定義する

Vagrantfileにプロビジョニングコード追加して、
とりあえず、Chef ServerとChefのインストール。
ntpで時刻も合わせておく。

Chef Serverのセットアップ

Web UI をインストールしている場合、192.168.33.12/signupにアクセスできるようになる。
workstation側でhostsの設定をしているとhttps://chef-server/でもアクセスできる。

ユーザー、Organization作成

またworkstationのhostsにchef-serverのipを追加しておく。

Workstationの.chef/knife.rbの設定

knife configureで指示に従って進めると、knife.rbが生成される。

Workstationに鍵を転送

knife ssl fetch を使うとChef Serverから鍵を取得できる。

node、userの確認

knife client list、knife user listでnodeとuserを確認する。

Chef Clientの準備

Chef Serverとの認証には鍵認証を使う。
Chef ServerはClientごとに秘密鍵を発行し、公開鍵を自身(Chef Server)に登録する。

Clientごとに発行するのは手間なので、Chef Serverにあらかじめ用意されているvalidator keyを使う。
ClientはChef Serverとの通の際にこのvalidator keyを使うと、
Chef ServerにClientとして登録され、以降の認証に必要な鍵が発行される。

これは最初の1回目にだけ利用される。
Chef Clientのhostsにchef-serverのipを追加して、名前解決できるようにしておく。

WorkstationからChef Serverにnodeを登録する

knife bootstrapでChef Serverに対してchef-clientを実行する。

ここで以下のように

INFO: HTTP Request Returned 401 Unauthorized: Failed to authenticate as NODENAME. Ensure that your node_name and client key are correct.

など401エラーが発生する場合、多くは証明書の問題っぽい。
エラーが出た際はhttps://docs.chef.io/errors.htmlを一度参考すると良さそう。

Chef Client の情報を取得する

WorkstationからChef ClientにRun Listを適用

Chef ClientからRecipeを実行する

nodeでcookbookを適用するには以下の条件が必要

  • Chef Serverにcookbookが登録されている
  • Chef Serverにnodeの情報が登録されていてrun listに適用したいレシピが登録されている
  • nodeにChef Serverと通信するためのclient keyもしくはvalidator keyが配置されている

運用するサーバーの台数が多くなると同時に複数台に設定を適用するのが大変になるので、
以下の方法でclient側で処理を行う。

  • Chef Clientをデーモンで起動して定期的にサーバーにアクセス
  • knife ssh で指定するサーバーにコマンドを実行する
  • Kickstartなどを使い、複数nodeでchef-clientコマンドを実行する

Chef12からcookbookにname attributeが必要になった

Chef Serverとは関係ないが、Chef12からcookbookのmetadata.rbにname attributeが必要になったぽい。
適当な古いcookbookを使うとエラーになる。

そんなときは、

  • cookbookを修正して、name attributeを追加するか、metadata.rbを削除する。
  • 古いバージョンのchef-clientを利用する

という方法で解決できそうだった。

参考にしたページ: Chef 12の新機能: knife ssl check/fetch #opschef_ja #getchef_ja

Comments