Hadoop運用 >
目次 †
Chefとは †
Chefは、ICTインフラの構築、更新を自動化する強力なプラットフォームです。
Chefの全体構成については、まずはOpscodeのAn Overview of Chef をご参照ください。
トピックス †
Chefひとめぐり
RealWorldChef
ChefTips
Berkshelf
ChefSpec
Foodcritic
Librarian-Chef
RuboCop
Spiceweasel
Stove
Chefのレシピ適用形態 †
Chefはほぼ同一のレシピ(クックブック)セットを用いつつ、様々な形態でそれらを対象ノードに適用することができます。
順に体験的な環境から、本格的なエンタープライズ向けの構成となり、スケールアウトしていきます。
No. ツールまたは構成 タイプ 説明 備考 1 chef-apply local 単一のレシピファイルやレシピソースコードをローカルノードに適用します。 お試し用途 2 chef-solo local ローカルファイルシステムにあるレシピをローカルノードに適用します。 3 knife solo push ローカルファイルシステムにあるレシピを(複数の)リモートノードに適用します。 (仕組みとしては、対象ノードにレシピが転送され、そこでchef-soloが実行されます。) knifeプラグイン 4 chef-client -z (local mode) virtual local chef-soloとほぼ同様のレシピ適用ですが、chef-zeroにより実現されています。 通常、knife -z (local mode)もあわせて使用します。 chef-solo後継 5 chef-zero standalone C/S インメモリ簡易ChefServer 6 knife zero virtual push chef-soloからchef-zeroへの移行に伴うknife solo後継。 (仕組みとしては、SSHポートフォワーディングによりリモートのchef-client(local mode)が ローカルのchef-zero環境にアクセスして動作します。) knifeプラグイン 7 chef-client / ChefServer pull サーバにあるレシピを同期し、エージェントがノードに適用します。
Chefエコシステム †
以下がChefを構成するコンポーネント群です。個人の特定用途には Chef Development Kit だけでも十分な場合がありますが、エンタープライズ向けにはすべてのコンポーネントを配備することになるでしょう。
No. コンポーネント 説明 プライベートサーバ の構築 備考 1 Workstation クックブックの開発、運用を行うノードです。 Chef Development Kit(またはChefClient )をインストールしてセットアップします。 - 2 Git(または他のSCM) Chef推奨のクックブックのソースコード管理環境です。他のSCMでも問題はありません。 クラウドのサービスとしては、GitHub がポピュラーです。 可 3 ChefServer Chefインフラの中核で、主に以下のような機能があります。 1. クックブックのリポジトリ 2. レシピの適用管理 3. 各エンティティ(ユーザ、クライアント、ノード、クックブック、ロール、環境等)の認証、認可管理 クラウドのサービスとしては、Hosted Chef があります。 可 4 ChefSupermarket クックブックのリポジトリに特化したサーバ。コミュニティクックブックは、Chef Supermarket にて提供されています。 可 5 Berkshelf API Server クックブックのインデックス情報を提供します。Berkshelf によりクックブックの再利用、拡張が促進されます。 コミュニティクックブックのインデックス情報は、Chef Supermarket にて提供されています。 可 6 ChefClient レシピ適用対象ノードにインストールされ、クックブックの同期、レシピの適用、レポーティングを行うエージェントです。 -
インストール †
運用環境の前提条件 †
オペレータは、以下の権限を有するものとします。
各サーバに鍵認証にてSSHログインでき、常にSSHエージェントを使用するものとします。また、Chef WorkstationへのSSHログイン時にはエージェント転送を有効にします。
各サーバにおいてsudo権限を持ち、常にパスワードの入力が要求されるものとします。
当然ながら、rootのSSHログインは許可されないものとします。
可能な限り、作業はCLIにて完結するものとします。
インストールの流れ †
ChefServer を構築します。 Hosted Chefを利用する場合には、Opscode でSign Upの上、まず最初にOraganizationを作成します。Hosted Chefはマルチテナント対応ですので、Organizationは1つのテナントとなる組織という意味合いです。
ChefServer を管理運用するための Chef Workstation を構築します。
Chef Workstation からknife bootstrapコマンドで管理対象のノードを追加登録していきます。対象ノードには、ChefClient がセットアップされます。
プライベートなChefSupermarket はオプションですが、(名前空間がグローバルなので)クックブックを一元管理し、組織内での再利用を促進したい場合には構築を検討するとよいでしょう。
例示環境 †
以降の説明では、以下のサーバ構成を例としています。
サービスするURL(FQDN)の特定に影響しますので、まずサーバの /etc/hosts が適切に設定されていることを確認します。
127.0.0.1 localhost
192.168.0.10 chef.io.example.com
こちら から環境にあったパッケージをダウンロードし、インストールします。現在サポートされているサーバ環境は、 Enterprise Linux および Ubuntu LTSの x86_64 アーキテクチャのみのようです。以下の説明では、 Ubuntu 14.04を使用しています。
$ sudo dpkg -i chef-server-core_12.2.0-1_amd64.deb
Chef Software Inc Packages : 最近では、パッケージリポジトリが提供されていますので、リポジトリ設定を追加の上、apt-get や yum コマンドでインストールすることも可能です。
以下のコマンドで初期セットアップを行います。
$ sudo chef-server-ctl reconfigure
管理ユーザを追加します。
$ sudo chef-server-ctl user-create alice Alice Kingsleigh alice@mail.example.com <password> --filename /home/alice/alice.pem
最初のOrganizationを追加し、先ほどの管理ユーザを紐付けます。
$ sudo chef-server-ctl org-create wonderland "Wonderland" --association_user alice --filename /home/alice/wonderland-validator.pem
必要な追加機能(アドオン)をインストールします。
ドキュメント によると、デフォルトではアドオンの一括インストールは無効になっています。もしすべてインストールしたい場合 には、以下の要領で有効にします。
/etc/opscode/chef-server.rb: 以下の設定を追加します。
# default: false
addons[ 'install' ] = true
再構成します。
$ sudo chef-server-ctl reconfigure
個別にインストールする場合には、以下の要領で行います。
ChefManage
$ sudo chef-server-ctl install opscode-manage
$ sudo chef-server-ctl reconfigure
$ sudo opscode-manage-ctl reconfigure
ChefPushJobs
$ sudo chef-server-ctl install opscode-push-jobs-server
$ sudo chef-server-ctl reconfigure
$ sudo opscode-push-jobs-server-ctl reconfigure
ChefReplication : 複数サーバで冗長化する場合には必要です。今回はインストールしません。
ChefReporting
$ sudo chef-server-ctl install opscode-reporting
$ sudo chef-server-ctl reconfigure
$ sudo opscode-reporting-ctl reconfigure
SSLサーバ証明書の入れ替え †
デフォルトでは自己署名証明書がインストールされますので、それを適切な証明書に入れ替えます。
環境に適したサーバ証明書を用意します(内部の認証局を運用する場合には、認証局(CA)の運用 をご参照ください)。証明書ファイルには、以下の要領でPEM形式に変換の上、信頼チェーンのすべての証明書(ルート、中間CA等)を含めます。
$ openssl x509 -in grid_ca.crt -out grid_ca.crt.pem -outform PEM
$ openssl x509 -in chef_io_example_com.crt -out chef_io_example_com.crt.pem -outform PEM
$ cat chef_io_example_com.crt.pem <(echo) grid_ca.crt.pem > chef_io_example_com.crts.pem
以下のパスに配備したものとします。秘密鍵はノーパスフレーズにし、rootにのみ読み取り権限を付与します。
$ sudo ls -l /etc/pki/tls/private/chef_io_example_com.key
-rw------- 1 root root 3243 Sep 23 14:21 /etc/pki/tls/private/chef_io_example_com.key
$ sudo ls -l /etc/pki/tls/certs/chef_io_example_com.crts.pem
-rw-r--r-- 1 root root 7187 Sep 23 14:14 /etc/pki/tls/certs/chef_io_example_com.crts.pem
chef-server.rb (Chef12は、/etc/opscode /chef-server.rb、Chef11は、/etc/chef-server /chef-server.rb): ChefServer 更新のための設定ファイルを用意します。
nginx[ 'ssl_certificate_key' ] = "/etc/pki/tls/private/chef_io_example_com.key"
nginx[ 'ssl_certificate' ] = "/etc/pki/tls/certs/chef_io_example_com.crts.pem"
以下のコマンドでサーバを再構成します。nginxが再起動されます。
$ sudo chef-server-ctl reconfigure
もしサービスするDNS名も同時に変更した場合には、追加機能についても再構成します。
$ sudo opscode-manage-ctl reconfigure
$ sudo opscode-push-jobs-server-ctl reconfigure
$ sudo opscode-reporting-ctl reconfigure
クライアントからテストします。
各設定ファイルに以下の要領で設定を追加します。
#ssl_ca_path
ssl_ca_file "/etc/pki/tls/certs/grid_ca.crt"
#trusted_certs_dir
ssl_verify_mode :verify_peer
knifeコマンドでチェックしてみます。
$ knife ssl check
Connecting to host chef.io.example.com:443
Successfully verified certificates from `chef.io.example.com'
メジャーバージョンアップについては、Opscodeのドキュメント をご参照ください。以下の説明は、Ver. 11のマイナーバージョンアップの模様です。
まず最初に各サービスを停止させます。
$ sudo chef-server-ctl stop
パッケージをダウンロードし、アップグレードさせます。
$ sudo rpm -Uvh chef-server-11.0.10-1.el6.x86_64.rpm
...
Thank you for installing Chef Server!
The next step in the install process is to run:
$ sudo chef-server-ctl reconfigure
複数桁のマイナーバージョンではアップグレードと見做されない場合がありますので、ご注意ください。
$ sudo yum install chef-server-11.0.10-1.el6.x86_64.rpm
...
Setting up Install Process
Examining chef-server-11.0.10-1.el6.x86_64.rpm: chef-server-11.0.10-1.el6.x86_64
Cannot install package chef-server-11.0.10-1.el6.x86_64. It is obsoleted by installed package chef-server-11.0.8-1.el6.x86_64
Error: Nothing to do
upgradeコマンドを指示された場合には、続けてそれを実行します。
$ sudo rpm -Uvh chef-server-11.1.7-1.el6.x86_64.rpm
...
1:chef-server ########################################### [100%]
You have upgraded Chef Server!
The next step in the upgrade process is to run:
sudo chef-server-ctl upgrade
再構成にはデータベースへのアクセスが必要な場合があるため、そのようなときにはサービスを開始してから再構成を行います。
$ sudo chef-server-ctl start
$ sudo chef-server-ctl reconfigure
...
Chef Client finished, 15 resources updated
chef-server Reconfigured!
参考までに、データベースアクセスエラーは以下の通りです。
================================================================================
Error executing action `run` on resource 'execute[/opt/chef-server/embedded/bin/createdb -T template0 -E UTF-8 opscode_chef]'
================================================================================
Mixlib::ShellOut::ShellCommandFailed
------------------------------------
Expected process to exit with [0], but received '1'
---- Begin output of /opt/chef-server/embedded/bin/createdb -T template0 -E UTF-8 opscode_chef ----
STDOUT:
STDERR: createdb: could not connect to database template1: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
---- End output of /opt/chef-server/embedded/bin/createdb -T template0 -E UTF-8 opscode_chef ----
Ran /opt/chef-server/embedded/bin/createdb -T template0 -E UTF-8 opscode_chef returned 1
ローカルroot権限による knife コマンド実行のためのセットアップ †
こちら の Chef Client タブから環境にあったパッケージをダウンロードし、インストールします。
$ sudo yum install chef-11.4.4-2.el6.x86_64.rpm
以下の要領で knife 実行環境のセットアップを行います。既存の管理ユーザは admin ですので、clientnameには必ずそれを指定します。クライアント追加用のバリデート専用clientnameは chef-validator で、その秘密鍵は /etc/chef-server/chef-validator.pem ですので、それらも間違いなく設定します。
$ sudo knife configure
WARNING: No knife configuration file found
Where should I put the config file? [/root/.chef/knife.rb]
Please enter the chef server URL: [http://chef.io.example.com:4000] https://chef.io.example.com
Please enter an existing username or clientname for the API: [alice] admin
Please enter the validation clientname: [chef-validator]
Please enter the location of the validation key: [/etc/chef/validation.pem] /etc/chef-server/chef-validator.pem
Please enter the path to a chef repository (or leave blank):
*****
You must place your client key in:
/root/.chef/admin.pem
Before running commands with Knife!
*****
You must place your validation key in:
/etc/chef-server/chef-validator.pem
Before generating instance data with Knife!
*****
Configuration file written to /root/.chef/knife.rb
admin ユーザの秘密鍵は、/etc/chef-server/admin.pem にありますので、シンボリックリンクにより調整します。
$ sudo ln -s /etc/chef-server/admin.pem /root/.chef/admin.pem
正しく動作するか確認します。これによりChefServer ローカルマシンのroot権限を持つユーザがChefServer の管理権限を持つようになりました。
$ sudo knife client list
chef-validator
chef-webui
Hosted Chef を利用する場合には †
クライアントバリデート用の秘密鍵(ORGANIZATION_NAME-validator.pem)は、Organizationの新規作成時にしかダウンロードできませんので、忘れずにダウンロードしておきましょう。通常、クライアント追加登録作業はChef Workstation上で行いますので、そちらでこの秘密鍵が必要となります。なお、作成時にダウンロードしなかった場合には、後ほどキーペアを再生成の上、新しい秘密鍵をダウンロードすることになります。
アクセス制御
ChefServer の停止は、運用上、即重大な障害につながるわけではありませんので、リアルタイムのフェイルオーバーは必須ではありません。
バックアップとリストア †
構成上、ChefServer にしか存在しない情報(主にPostgreSQL)を日常的にバックアップ(またはレプリケーション)しておき、迅速にリストアするようにします。
バックアップとリストア方法
Chef Workstation (Chef12) †
Chef Development Kit (DK) によるセットアップ †
Chef DK提供以降は、それを利用するのがよいでしょう。
http://downloads.chef.io/chef-dk/ から適切なパッケージをダウンロードし、インストールします。
$ sudo dpkg -i ./chefdk_0.8.0-1_amd64.deb
インストールされたコンポーネントをチェックします。
$ sudo chef verify
Running verification for component 'berkshelf'
Running verification for component 'test-kitchen'
Running verification for component 'chef-client'
Running verification for component 'chef-dk'
Running verification for component 'chef-provisioning'
Running verification for component 'chefspec'
Running verification for component 'rubocop'
Running verification for component 'fauxhai'
Running verification for component 'knife-spork'
Running verification for component 'kitchen-vagrant'
Running verification for component 'package installation'
Running verification for component 'openssl'
.........
---------------------------------------------
Verification of component 'chefspec' succeeded.
Verification of component 'fauxhai' succeeded.
Verification of component 'kitchen-vagrant' succeeded.
Verification of component 'openssl' succeeded.
Verification of component 'berkshelf' succeeded.
Verification of component 'chef-client' succeeded.
Verification of component 'rubocop' succeeded.
Verification of component 'test-kitchen' succeeded.
Verification of component 'knife-spork' succeeded.
Verification of component 'chef-dk' succeeded.
Verification of component 'chef-provisioning' succeeded.
Verification of component 'package installation' succeeded.
rubyへのパスを通します。
$ which ruby
$ echo 'eval "$(chef shell-init bash)"' >> ~/.bash_profile
$ . ~/.bash_profile
$ which ruby
/opt/chefdk/embedded/bin/ruby
開発、運用用に(管理権限クライアントは使用できないので)管理権限をもつユーザ を用意します。
Chef DKがWindowsで正式にサポートしているシェルは PowerShell? のみです。
しかし、ssh や rsync などとあわせて使用する場合には、Cygwin や MinGW を利用するのが便利だったのですが、2016年8月にWindows 10 Anniversary Updateがリリースされ BashOnUbuntuOnWindows が利用可能になったため、そちらを利用する方が問題が少なくなりました。
Chef Workstation (Chef11) †
なぜ ChefServer から Chef Workstation を構築しないのか †
後述の knife bootstrap コマンドを使用すれば、ChefServer から Chef Workstation を容易に構築することが可能です。ただし、同時に管理者権限を付与するようなオプションがないようですので後ほどWeb UIから付与しなければなりません。以上の理由から、Chef Workstation を knife bootstrap コマンドで構築することは見送っています。
当然ながら、Hosted Chefではサーバ上でのCLIは利用できません。
Chef Workstation(管理権限をもつクライアント)のセットアップ †
ChefServer マシンにて、-a オプションを付けて、管理権限を持つクライアント (Chef Workstation)を追加します。このクライアントの秘密鍵は、-f オプションの指定ファイルに出力されます。もちろん、その公開鍵はChefServer に保存されます。 以下の例では、秘密鍵のファイル名に短縮した clientname を使っていますが、長くとも clientname をそのまま用いた方が生成される設定ファイルと辻褄合わせが必要なくなります。
$ sudo knife client create adm00.io.example.com -a -e vi -f adm00.io.pem
Created client[adm00.io.example.com]
$ sudo knife client list
adm00.io.example.com
chef-validator
chef-webui
ワークステーションに、その秘密鍵とバリデート用の秘密鍵を転送します。ワークステーションでバリデート用の秘密鍵が必要な理由は、ワークステーションが専ら管理対象クライアントの追加に従事するからです。
$ scp adm00.io.pem adm00.io.example.com:~/tmp/
$ sudo cat /etc/chef-server/chef-validator.pem | ssh adm00.io.example.com 'cat > ~/tmp/chef-validator.pem'
これ以降はワークステーション上での作業ですが、knife の設定のみです。まず、こちら の Chef Client タブから環境にあったパッケージをダウンロードし、インストールします。以下の例では、 Debian wheezy を使用しています。
$ sudo dpkg --install chef_11.4.4-2.debian.6.0.5_amd64.deb
ワークステーション設定用のディレクトリ(/etc/chef-workstation )を用意し、先ほど転送した2つの秘密鍵を移動させ、パーミッションを適切に変更します。 ワークステーションといえどもChefの1クライアントであることには変わりませんので、ワークステーションもノードとして管理したい場合には設定用ディレクトリを /etc/chef にしておくと ChefClient セットアップ時に好都合です。
$ sudo mkdir /etc/chef-workstation
$ sudo mv ~/tmp/adm00.io.pem /etc/chef-workstation/
$ sudo chown root:root /etc/chef-workstation/adm00.io.pem
$ sudo chmod 400 /etc/chef-workstation/adm00.io.pem
$ sudo mv chef-validator.pem /etc/chef-workstation/
$ sudo chown root:root /etc/chef-workstation/chef-validator.pem
$ sudo chmod 400 /etc/chef-workstation/chef-validator.pem
以下の要領で knife 実行環境のセットアップを行います。
$ sudo knife configure
WARNING: No knife configuration file found
Where should I put the config file? [/root/.chef/knife.rb] /etc/chef-workstation/knife.rb
Please enter the chef server URL: [http://adm00.io.example.com:4000] https://chef.io.example.com
Please enter an existing username or clientname for the API: [alice] adm00.io.example.com
Please enter the validation clientname: [chef-validator]
Please enter the location of the validation key: [/etc/chef/validation.pem] /etc/chef-workstation/chef-validator.pem
Please enter the path to a chef repository (or leave blank):
*****
You must place your client key in:
/etc/chef-workstation/adm00.io.example.com.pem
Before running commands with Knife!
*****
You must place your validation key in:
/etc/chef-workstation/chef-validator.pem
Before generating instance data with Knife!
*****
Configuration file written to /etc/chef-workstation/knife.rb
ワークステーションクライアントの秘密鍵の場所をシンボリックリンクで調整します。
$ sudo ln -s /etc/chef-workstation/adm00.io.pem /etc/chef-workstation/adm00.io.example.com.pem
まずは設定ファイルを指定して、knife の動作を確認します。
$ sudo knife client list -c /etc/chef-workstation/knife.rb
adm00.io.example.com
chef-validator
chef-webui
問題なければ、最後にChefServer 上に残っているワークステーションクライントの秘密鍵を忘れずに削除します。
[@gpm00]$ sudo rm adm00.io.pem
Chef管理グループへの権限付与(オプション) †
Chef Workstation から行う作業の範囲によりますが、対象ノードへのSSHログインを経由した操作(knife bootstrap、knife ssh等)を行いたい場合には、(rootは不可ですから)SSHログイン可能なオペレータのアカウントを使う必要がありますので、それらのChef管理ユーザに Chef Workstation 秘密鍵へのアクセスを許可します。
運用ポリシーによりますが、もちろんオペレータを個別にChefのクライアントとして登録しても構いません。
Chef管理グループ(例えば、chefadmins)に、先ほどの2つの秘密鍵へのアクセスを許可します。
$ sudo chgrp chefadmins /etc/chef-workstation/adm00.io.pem
$ sudo chmod 440 /etc/chef-workstation/adm00.io.pem
$ sudo chgrp chefadmins /etc/chef-workstation/chef-validator.pem
$ sudo chmod 440 /etc/chef-workstation/chef-validator.pem
各オペレータは、knife 設定ファイルをコピーし、動作を確認します。
$ mkdir ~/.chef
$ cp /etc/chef-workstation/knife.rb ~/.chef/
$ knife client list
adm00.io.example.com
chef-validator
chef-webui
Hosted Chef を利用する場合には †
Web UIからWorkstation用のクライアントを追加します。 APIアクセス用の秘密鍵(CLIENT_NAME.pem)は、この追加時にしかダウンロードできませんので、忘れずにダウンロードしておきましょう。なお、追加時にダウンロードしなかった場合には、後ほどキーペアを再生成の上、新しい秘密鍵をダウンロードすることになります。
Web UIからWorkstation用のクライアントに管理者権限を付与します。
以降は、Open Source Chefとほぼ同様の手順ですが、knife configure コマンドは使用せず、設定ファイルは、Web UIのOrganizationsページにある Generate knife config リンクからダウンロードし、適宜編集して配備します。
管理対象ノードの追加 †
事前準備(Chef12以降) †
Chef12以降では、デフォルトでサーバのSSL証明書が検証されますので、そのための準備作業を行います。
まず以下のコマンドであらかじめChefServer のSSL証明書を取得し、真正なものであるかフィンガープリントをチェックしておきます。また必要であれば認証局の証明書も同じ trusted_certs_dir(デフォルトは .chef/trusted_certs)にコピーしておきます。ノード登録(knife bootstrap)時には、これらの証明書が対象ノードにもコピーされ、それ以降、ノードからChefServer へのSSL接続が正しく検証されるようになります。
WARNING: Certificates from chef.io.example.com will be fetched and placed in your trusted_cert
directory (/path/to/trusted_certs).
Knife has no means to verify these are the correct certificates. You should
verify the authenticity of these certificates after downloading.
Adding certificate for chef.io.example.com in /path/to/trusted_certs/gpm00_grid_example_com.crt
次に(Chef 12.1以降では)バリデーションクライアントキーを使ったノード登録は古い方法ですので、それらの設定を無効にします。なお、新しい方法を Validatorless Bootstrap といいます。
古い方法でも登録が可能ですが、以下のようなアドバイスが表示されます。
$ knife bootstrap chef-node00.grid.example.com -x `whoami` --sudo -N chef-node00.grid.example.com -V
INFO: Using configuration from /path/to/.chef/knife.rb
Doing old-style registration with the validation key at /path/to/.chef/chef-validator.pem...
Delete your validation key in order to use your user credentials instead
.chef/knife.rb: 以下の要領でバリデーションクライアントの設定を無効化します。ノード登録時には、代わりにユーザの資格証が使用されるようになり、対象ノードにはバリデーションクライアントの秘密鍵(validation.pem)がコピーされなくなり、よりセキュアになります。
#validation_client_name "#{org_name}-validator"
validation_key "/nonexist"
#(...)
trusted_certs_dir "#{conf_dir}/trusted_certs"
verify_api_cert true # overridden by ssl_verify_mode (= :verify_peer)
ssl_verify_mode :verify_peer
一般ノードの追加 †
Chef Workstation マシンから knife bootstrap コマンドを使って、対象ノードへの ChefClient のインストールから ChefServer へのクライアントおよびノード追加までを一気に行います。
$ knife bootstrap ns00.grid.example.com -x `whoami` --sudo -N ns00.grid.example.com -V
...
ns00.grid.example.com Chef Client finished, 0 resources updated
よく同時に使用されるオプションとしては以下のようなものがあります。
-r, --run-list RUN_LIST : ノードに適用されるrun_list。ノード追加後、そのまま即座に反映されますのでご注意ください。chef-clientをサービスとして起動させるchef-clientレシピ 等を反映させるとよいでしょう。
-E, --environment ENVIRONMENT : そのノードが属するEnvironmentを指定。明示しない場合には、_default 環境。
$ knife bootstrap ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com -N dn40000.grid.example.com \
> -x ec2user -i ~/.ssh/ec2-demo.pem --sudo -r 'role[ptolemy-dn]' -E hadoop_aws_io-bound -V
--node-ssl-verify-mode none (Chef12): peer がデフォルトで none にするのは非推奨ですが、アクセス先のサーバ証明書がテスト用の自己署名である場合などに一時的に利用するとよいでしょう。
Chef12
ノード登録後の状態を確認します。サーバ証明書がコピーされ、検証が通っています。Validatorless Bootstrapにより、バリデート用の秘密鍵を削除する必要はありません。
$ knife ssh 'name:chef-node00.grid.example.com' 'ls -R /etc/chef'
chef-node00.grid.example.com /etc/chef:
chef-node00.grid.example.com client.pem client.rb first-boot.json trusted_certs
chef-node00.grid.example.com
chef-node00.grid.example.com /etc/chef/trusted_certs:
chef-node00.grid.example.com grid_ca.crt gpm00_grid_example_com.crt
$ knife ssh 'name:chef-node00.grid.example.com' 'knife ssl check -c /etc/chef/client.rb'
chef-node00.grid.example.com
chef-node00.grid.example.com Configuration Info:
chef-node00.grid.example.com
chef-node00.grid.example.com OpenSSL Configuration:
chef-node00.grid.example.com * Version: OpenSSL 1.0.1p 9 Jul 2015
chef-node00.grid.example.com * Certificate file: /opt/chef/embedded/ssl/cert.pem
chef-node00.grid.example.com * Certificate directory: /opt/chef/embedded/ssl/certs
chef-node00.grid.example.com Chef SSL Configuration:
chef-node00.grid.example.com * ssl_ca_path: nil
chef-node00.grid.example.com * ssl_ca_file: nil
chef-node00.grid.example.com * trusted_certs_dir: "/etc/chef/trusted_certs"
chef-node00.grid.example.com WARNING: There are invalid certificates in your trusted_certs_dir.
chef-node00.grid.example.com OpenSSL will not use the following certificates when verifying SSL connections:
chef-node00.grid.example.com
chef-node00.grid.example.com /etc/chef/trusted_certs/gpm00_grid_example_com.crt: unable to get local issuer certificate
chef-node00.grid.example.com
chef-node00.grid.example.com
chef-node00.grid.example.com TO FIX THESE WARNINGS:
chef-node00.grid.example.com
chef-node00.grid.example.com We are working on documentation for resolving common issues uncovered here.
chef-node00.grid.example.com
chef-node00.grid.example.com * If the certificate is generated by the server, you may try redownloading the
chef-node00.grid.example.com server's certificate. By default, the certificate is stored in the following
chef-node00.grid.example.com location on the host where your chef-server runs:
chef-node00.grid.example.com
chef-node00.grid.example.com /var/opt/opscode/nginx/ca/SERVER_HOSTNAME.crt
chef-node00.grid.example.com
chef-node00.grid.example.com Copy that file to your trusted_certs_dir (currently: /etc/chef/trusted_certs)
chef-node00.grid.example.com using SSH/SCP or some other secure method, then re-run this command to confirm
chef-node00.grid.example.com that the server's certificate is now trusted.
chef-node00.grid.example.com
chef-node00.grid.example.com Connecting to host chef.io.example.com:443
chef-node00.grid.example.com Successfully verified certificates from `chef.io.example.com'
Chef11
対象ノードに対する操作はSSH経由で行われますが、WorkstationローカルにSSHの秘密鍵がある場合、SSHエージェントよりもそちらが優先されてしまい、さらにその対応する公開鍵がない場合には以下の様なエラーとなってしまいます。(通常推奨される運用ポリシーですが)WorkstationマシンにはSSHの秘密鍵を置かず、エージェント転送(ForwardAgent? )を有効にしてSSHログインし作業するのがよいでしょう*1 。
Bootstrapping Chef on ns00.grid.example.com
ERROR: ArgumentError: Could not parse PKey: no start line
対象ノードに配備された秘密鍵や設定ファイルは以下の通りです。
$ ssh ns00.grid.example.com ls -l /etc/chef
total 16
-rw------- 1 root root 1675 2013-05-25 16:07 client.pem
-rw-r--r-- 1 root root 172 2013-05-25 16:07 client.rb
-rw-r--r-- 1 root root 16 2013-05-25 16:07 first-boot.json
-rw------- 1 root root 1679 2013-05-25 16:07 validation.pem
ChefClient の動作が確認できた時点で、(このノードはWorkstationではなく一般クライアントですので)クライアント登録のために使用されたバリデート用の秘密鍵を忘れずに削除します。
$ ssh -t ns00.grid.example.com sudo rm /etc/chef/validation.pem
なお、デフォルトでは Chef Omnibusインストーラ(chef-full)によって ChefClient のセットアップが行われます(このテンプレートをカスタマイズすることも可能です)。依存コンポーネントはすべて /opt/chef 以下にインストールされますので、対象ノードの環境に影響を与えないという点で最適でしょう。ただし、未対応のOSでは以下のようにセットアップに失敗しますので注意が必要です。 多少強引ですが、ある程度互換性が見込まれるOSであれば手動でOmnibusパッケージ(例えばDebian 7.0に6.0.5用のパッケージ等)をインストールしておいてから、bootstrapコマンドを実行するとインストール部分がスキップされますので追加に成功します。
gw00.grid.example.com Downloading Chef 11.4.4 for debian...
gw00.grid.example.com Unable to retrieve a valid package!
gw00.grid.example.com Please file a bug report at http://tickets.opscode.com
gw00.grid.example.com Project: Chef
gw00.grid.example.com Component: Packages
gw00.grid.example.com Label: Omnibus
gw00.grid.example.com Version: 11.4.4
gw00.grid.example.com
gw00.grid.example.com Please detail your operating system type, version and any other relevant details
gw00.grid.example.com URL: http://www.opscode.com/chef/download?v=11.4.4&prerelease=false&p=debian&pv=7.0&m=x86_64
gw00.grid.example.com bash: 行 74: chef-client: コマンドが見つかりません
ChefClient の明示的な実行は以下の要領で行います。ChefServer とのレシピの同期が行われ、そのレシピが適用された結果がレポートされます。
$ ssh -t ns00.grid.example.com sudo chef-client
ChefClient をデーモンとして起動させたい場合には、以下のようなオプションを用います。
$ ssh -t ns00.grid.example.com sudo chef-client -d -P /var/run/chef-client.pid -L /var/log/chef-client.log -i 1800 -s 20
さらにノード数が非常に多く、ChefClient の制御を自動化したい場合、また後からChefClient の設定を調整したい場合には、Opscodeが提供するクックブック の利用を検討するとよいでしょう。
既存ワークステーションのノードとしての追加 †
既存のワークステーションはすでにクライアントとしてのキーペアを生成済ですので、手動でノードとしての追加と ChefClient のセットアップを行います。
ワークステーションをノードとしても作成します。
$ knife node create adm00.io.example.com -e vi
Created node[adm00.io.example.com]
ChefClient の設定ファイルは、/etc/chef 以下に格納されますので、ワークステーションの秘密鍵や設定ファイルが他のディレクトリにある場合には、そちらにシンボリックリンクしておくと何かと便利です。
$ sudo ln -s /etc/chef-workstation /etc/chef
/etc/chef/client.rb : ChefClient の設定ファイルを用意します。
log_level :auto
log_location STDOUT
chef_server_url "https://chef.io.example.com"
validation_client_name "chef-validator"
node_name "adm00.io.example.com"
ChefClient の秘密鍵のデフォルトファイルパスは、/etc/chef/client.pem ですので、必要であればシンボリックリンクで調整します。
$ sudo ln -s /etc/chef/adm00.io.pem /etc/chef/client.pem
ChefClient を起動させ、動作を確認します。
$ sudo chef-client
最後に忘れてはいけないChefServer 自身のノードとしての管理ですが、自サーバにノード追加しては障害時に復旧できませんので、もし存在するのであれば他のChefServer にノード追加して管理します。他のChefServer がない場合には、OpscodeのHosted Chefの利用を検討するとよいでしょう。
$ knife bootstrap chef00.io.example.com -x `whoami` --sudo -N chef00.io.example.com -V
ノードのリスト †
登録されたノードの状態は、knife status コマンドで確認できます。
$ knife status
1 hour ago, ns00.grid.example.com, ns00.grid.example.com, 192.168.10.180, debian 6.0.7.
1 hour ago, ns01.grid.example.com, ns01.grid.example.com, 192.168.10.181, debian 6.0.7.
1 hour ago, nn00.grid.example.com, nn00.grid.example.com, 192.168.10.182, debian 6.0.7.
1 hour ago, nn02.grid.example.com, nn02.grid.example.com, 192.168.10.188, debian 6.0.7.
1 hour ago, jt00.grid.example.com, jt00.grid.example.com, 192.168.10.185, debian 6.0.7.
1 hour ago, dn00000.grid.example.com, dn00000.grid.example.com, 192.168.10.190, debian 6.0.7.
1 hour ago, dn00001.grid.example.com, dn00001.grid.example.com, 192.168.10.191, debian 6.0.7.
59 minutes ago, gm00.grid.example.com, gm00.grid.example.com, 192.168.10.170, debian 6.0.7.
56 minutes ago, zk00.grid.example.com, zk00.grid.example.com, 192.168.10.160, debian 6.0.7.
54 minutes ago, zk01.grid.example.com, zk01.grid.example.com, 192.168.10.161, debian 6.0.7.
52 minutes ago, zk02.grid.example.com, zk02.grid.example.com, 192.168.10.162, debian 6.0.7.
50 minutes ago, hm00.grid.example.com, hm00.grid.example.com, 192.168.10.163, debian 6.0.7.
48 minutes ago, hm01.grid.example.com, hm01.grid.example.com, 192.168.10.164, debian 6.0.7.
43 minutes ago, nm00.grid.example.com, nm00.grid.example.com, 192.168.10.174, debian 6.0.7.
32 minutes ago, pxy00.grid.example.com, pxy00.grid.example.com, 192.168.10.168, debian 6.0.7.
24 minutes ago, wf00.grid.example.com, wf00.grid.example.com, 192.168.10.177, debian 6.0.7.
実際の運用にはCLIが有用ですが、Web UIからも確認が可能です。
Chef Supermarket †
こちら をご参照ください。
アクセス制御
ChefVault - 秘密情報の管理
アドオン(Chef12) †
ChefManage
ChefPushJobs
ChefReplication
ChefReporting
トラブルシューティング †
ChefServer
参考リソース †
http://docs.opscode.com/install_server.html
http://docs.opscode.com/chef/install_workstation.html