複数のChef-serverで同一のvalidation.pemを利用させたいとき

運用設計・ルール的な是非は一旦おいておいて、複数のChef Servervalidation.pem(chef-validatorの鍵)を共通化させたいときに、どうやったかというメモ。ちなみに、バージョン10系での話です。

イメージは、既に1台のChef-serverを運用していて、もう1台新しいChef-serverを足したいんだけど、nodeとなるサーバの運用フローを変えたくないので(面倒くさいので)、validation.pemは共通で使いたいなー、というケース。(これはユースケースによってメリット・デメリットがあります)


僕が探した感じ、APIではその口が用意されていなかった(というか、あるように見えてeditしてみたけど反映されなかった)ので、結論からいうとバックエンドのCouchDBにアクセスして書き換えた感じです。

説明はここまででいいような気もしますが、一応自分のために手順を残しておきます。(鍵は適当に書き換えております)

1. (既存)共通化したいchef-validatorの公開鍵を持っているChef-serverにて

まず、共通化したい(validation.pemが発行されている)chef-validatorの公開鍵があるchef-server(既存のサーバとかで、共有させたい鍵を持っている方)に対して、APIを介して、公開鍵を取得します。

from$ knife client show chef-validator
_rev:        1-05b1c3dd8fab1851bab19e3659544e82
admin:       false
chef_type:   client
json_class:  Chef::ApiClient
name:        chef-validator
public_key:  -----BEGIN PUBLIC KEY-----
             MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsNT0grepATYCo6xUDQJ4
             gBv3CmNKiFGNV0hoVRZD53XxE9UpECIsmVxDO/3og967qiEKeAXJryF4C1CmwD/l
             VKW9f/dBPA0XCujS3naX/9cKFU8qDz/W8vJwXZw89EAQJWXsFaHSClCF4eHBR490
             5FU2wBNgTmR4vEStnWA7FhujAysY2J7xASM2EbXfCjRk2IVICLsr2YzfHiW+GcfE
             EzonCuds+pUSArk3w2aOjESFYbatqkqjQfu/P48f+Dw1mOzTtArOepu126eS5GaC
             ua4UfOS2+0waa/drxdueJSX7Y6h/xZHnkQfOmmUUZCZAPDvCR/izBe/w/bLqMe2/
             KQIDAQAB
             -----END PUBLIC KEY-----

↑は、とりあえずお手軽に、knifeコマンドでリクエストしてみました。"public_key"ってのがそうですね。
knifeコマンド使える状態にセットアップしてないよー、って場合は、後述するような手順でにCouchDBに直接アクセスしてもよいです。


※もしくは、CouchDBにビルトインしているFuton(Web管理ユーティリティ)から確認する方法もあります。後述するパラメータの書き換えも、以下のWeb管理ユーティリティから出来ます。

2. (新規)↑で取得した公開鍵を設定したいChef-serverにて

次に、↑で取得したchef-validatorの公開鍵を設定するChef-server(新しいサーバとかで、鍵を共有させたい方)に対して、以下のオペレーションを行います。

to$ knife client show chef-validator
_rev:        10-9210a57a5358211c2d3962b64283729f
admin:       false
chef_type:   client
json_class:  Chef::ApiClient
name:        chef-validator
public_key:  -----BEGIN PUBLIC KEY-----
             MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCeJcVPnQbdRJFxjhtDJ
             XglQRL/3f/B7FSIWuSE7nMdo5dvx3UDhPlLuM6wPIndxGL+cMKwmdFNJLVc72k1o
             HPUzM8OdsshIETzCpJAs81I4VcNLI5iq3rt7i/EZkOKehC+T5yzgZGVy55/dcR9L
             ogtGK68lKFe9yNnHZEPlUilTMsHo6Xf72Vz8tHwwW+9T6qcaTYR3buVuYsFvW1K5
             xUUx2nwlAbrdM/GkBM//XZFIKpm292sI7+iwzz82C7KctfZLck4OrErMA4HQQ/wY
             rzxm6VO32lsjx2vE/uhNMWGBCged45inVds9WbXbG8sbL9thkss7+MzNJ/7PDPNb
             LQIDAQAB
             -----END PUBLIC KEY-----

まずは確認の意味で、このサーバで今設定されているchef-validatorの共通鍵を確認します。

to$ curl -X GET "http://127.0.0.1:5984/chef/_design/clients/_view/all_id" | grep chef-validator
{"id":"99483c11-599d-4b2c-bacb-73132e571673","key":"chef-validator","value":"chef-validator"},

次に、Chef-server上で、上記な感じでcurlコマンドでCouchDBにアクセスし、chef-validatorというClientの情報が入っている、ドキュメントIDを探します。
↑のサンプルでは、chef-validatorのclient情報が格納されているドキュメントIDは"99483c11-599d-4b2c-bacb-73132e571673"となります。

to$ curl -X GET http://127.0.0.1:5984/chef/99483c11-599d-4b2c-bacb-73132e571673 > client.txt

次に、↑のような感じで、さっき取得したドキュメントIDを使って、CouchDBにGETすることで、chef-validatorのclient情報を取得し、テキストファイル(client.txt)に落とします。

client.txtにはJSONフォーマットでデータが書かれているので、vim等で開いて、"public_key"の部分のValueを1.で取得したものに書き換えます。

to$ curl -X PUT -d @client.txt -H "Content-type: application/json" http://127.0.0.1:5984/chef/99483c11-599d-4b2c-bacb-73132e571673

書き換えが済んだらファイルを保存して、上記のコマンドでCouchDBにPUTして保存します。
ここまででオペレーションは完了です。

to$ knife client show chef-validator
_rev:        11-749ca30c2615a1a148c8ad9977050200
admin:       false
chef_type:   client
json_class:  Chef::ApiClient
name:        chef-validator
public_key:  -----BEGIN PUBLIC KEY-----
             MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsNT0grepATYCo6xUDQJ4
             gBv3CmNKiFGNV0hoVRZD53XxE9UpECIsmVxDO/3og967qiEKeAXJryF4C1CmwD/l
             VKW9f/dBPA0XCujS3naX/9cKFU8qDz/W8vJwXZw89EAQJWXsFaHSClCF4eHBR490
             5FU2wBNgTmR4vEStnWA7FhujAysY2J7xASM2EbXfCjRk2IVICLsr2YzfHiW+GcfE
             EzonCuds+pUSArk3w2aOjESFYbatqkqjQfu/P48f+Dw1mOzTtArOepu126eS5GaC
             ua4UfOS2+0waa/drxdueJSX7Y6h/xZHnkQfOmmUUZCZAPDvCR/izBe/w/bLqMe2/
             KQIDAQAB
             -----END PUBLIC KEY-----

knifeコマンドとかで確認すると、既存のchef-serverのchef-validatorの公開鍵の内容と同一のものになっていることが確認できるはずです。
一応、ここまでで、共有したい既存のvalidation.pemを使って動作確認してみましたが、問題なく動きいております。今のところ。
バージョン11系のChefでは、違うやり方があるかもしれませんが、もっとエレガントなやり方とかあれば教えてください!

それでは! =͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́


入門Chef Solo - Infrastructure as Code

入門Chef Solo - Infrastructure as Code

  • 作者:伊藤直也
  • 出版社/メーカー: 伊藤直也
  • 発売日: 2013/03/11
  • メディア: Kindle版