Hadoop運用 >

目次

Chefとは

  1. Chefは、ICTインフラの構築、更新を自動化する強力なプラットフォームです。
  2. Chefの全体構成については、まずはOpscodeのAn Overview of Chefをご参照ください。

トピックス

  1. Chefひとめぐり
  2. RealWorldChef
  3. ChefTips
    1. Berkshelf
    2. ChefSpec
    3. Foodcritic
    4. Librarian-Chef
    5. RuboCop
    6. Spiceweasel
    7. Stove

Chefのレシピ適用形態

  • Chefはほぼ同一のレシピ(クックブック)セットを用いつつ、様々な形態でそれらを対象ノードに適用することができます。
  • 順に体験的な環境から、本格的なエンタープライズ向けの構成となり、スケールアウトしていきます。
No.ツールまたは構成タイプ説明備考
1chef-applylocal単一のレシピファイルやレシピソースコードをローカルノードに適用します。お試し用途
2chef-sololocalローカルファイルシステムにあるレシピをローカルノードに適用します。
3knife solopushローカルファイルシステムにあるレシピを(複数の)リモートノードに適用します。
(仕組みとしては、対象ノードにレシピが転送され、そこでchef-soloが実行されます。)
knifeプラグイン
4chef-client -z
(local mode)
virtual localchef-soloとほぼ同様のレシピ適用ですが、chef-zeroにより実現されています。
通常、knife -z (local mode)もあわせて使用します。
chef-solo後継
5chef-zerostandalone C/Sインメモリ簡易ChefServer
6knife zerovirtual pushchef-soloからchef-zeroへの移行に伴うknife solo後継。
(仕組みとしては、SSHポートフォワーディングによりリモートのchef-client(local mode)が
ローカルのchef-zero環境にアクセスして動作します。)
knifeプラグイン
7chef-client / ChefServerpullサーバにあるレシピを同期し、エージェントがノードに適用します。

Chefエコシステム

  • 以下がChefを構成するコンポーネント群です。個人の特定用途には Chef Development Kit だけでも十分な場合がありますが、エンタープライズ向けにはすべてのコンポーネントを配備することになるでしょう。
No.コンポーネント説明プライベートサーバ
の構築
備考
1Workstationクックブックの開発、運用を行うノードです。
Chef Development Kit(またはChefClient)をインストールしてセットアップします。
-
2Git(または他のSCM)Chef推奨のクックブックのソースコード管理環境です。他のSCMでも問題はありません。
クラウドのサービスとしては、GitHubがポピュラーです。
3ChefServerChefインフラの中核で、主に以下のような機能があります。
1. クックブックのリポジトリ
2. レシピの適用管理
3. 各エンティティ(ユーザ、クライアント、ノード、クックブック、ロール、環境等)の認証、認可管理
クラウドのサービスとしては、Hosted Chefがあります。
4ChefSupermarketクックブックのリポジトリに特化したサーバ。コミュニティクックブックは、Chef Supermarketにて提供されています。
5Berkshelf API Serverクックブックのインデックス情報を提供します。
Berkshelfによりクックブックの再利用、拡張が促進されます。
コミュニティクックブックのインデックス情報は、Chef Supermarketにて提供されています。
6ChefClientレシピ適用対象ノードにインストールされ、クックブックの同期、レシピの適用、レポーティングを行うエージェントです。-

インストール

運用環境の前提条件

  1. オペレータは、以下の権限を有するものとします。
    1. 各サーバに鍵認証にてSSHログインでき、常にSSHエージェントを使用するものとします。また、Chef WorkstationへのSSHログイン時にはエージェント転送を有効にします。
    2. 各サーバにおいてsudo権限を持ち、常にパスワードの入力が要求されるものとします。
  2. 当然ながら、rootのSSHログインは許可されないものとします。
  3. 可能な限り、作業はCLIにて完結するものとします。

インストールの流れ

  1. ChefServer を構築します。info.pngHosted Chefを利用する場合には、OpscodeでSign Upの上、まず最初にOraganizationを作成します。Hosted Chefはマルチテナント対応ですので、Organizationは1つのテナントとなる組織という意味合いです。
  2. ChefServer を管理運用するための Chef Workstation を構築します。
  3. Chef Workstation からknife bootstrapコマンドで管理対象のノードを追加登録していきます。対象ノードには、ChefClient がセットアップされます。
  4. プライベートなChefSupermarketはオプションですが、(名前空間がグローバルなので)クックブックを一元管理し、組織内での再利用を促進したい場合には構築を検討するとよいでしょう。

例示環境

  • 以降の説明では、以下のサーバ構成を例としています。
ドメインexample.com
No.ホスト役割備考
1adm0{0..1}.io管理ワークステーション(Chef Workstation)
2chef0{0..1}.ioChefServerBerkshelf-API-Serverを含む)または、Hosted Chef
3berks-api0{0..1}.ioBerkshelf-API-Server
4*管理対象ノード(ChefClient構成対象のサーバ群

ChefServer

  • ChefServer は、Nginx、Erchef、RabbitMQ、Apache Solr、PostgreSQL等で構成されています(The Chef Server)ので、商用サーバであればまず問題ありませんが、検証する場合にも十分なスペックのマシンを用意するとよいでしょう。
  • ChefServer には、次の提供形態があります。OpscodeによってホストされているSaaSの Hosted Chef、企業内に配備できるオンプレミスな Private Chef(以上はサブスクリプション方式)および Open Source ChefServer の3つです。運用ポリシーにあわせて最適なプロダクト(Which Chef is Right for You?)を選択するとよいでしょう。以下の説明では、主に Open Source ChefServer を対象としています。

ChefServer本体(Chef12)のセットアップ

  1. サービスするURL(FQDN)の特定に影響しますので、まずサーバの /etc/hosts が適切に設定されていることを確認します。
    127.0.0.1      localhost
    192.168.0.10   chef.io.example.com
  2. こちらから環境にあったパッケージをダウンロードし、インストールします。現在サポートされているサーバ環境は、redhat.pngEnterprise Linux および ubuntu.pngUbuntu LTSの x86_64 アーキテクチャのみのようです。以下の説明では、ubuntu.pngUbuntu 14.04を使用しています。
    $ sudo dpkg -i chef-server-core_12.2.0-1_amd64.deb
    1. info.pngChef Software Inc Packages: 最近では、パッケージリポジトリが提供されていますので、リポジトリ設定を追加の上、apt-get や yum コマンドでインストールすることも可能です。
  3. 以下のコマンドで初期セットアップを行います。
    $ sudo chef-server-ctl reconfigure
  4. 管理ユーザを追加します。
    $ sudo chef-server-ctl user-create alice Alice Kingsleigh alice@mail.example.com <password> --filename /home/alice/alice.pem
  5. 最初のOrganizationを追加し、先ほどの管理ユーザを紐付けます。
    $ sudo chef-server-ctl org-create wonderland "Wonderland" --association_user alice --filename /home/alice/wonderland-validator.pem
  6. 必要な追加機能(アドオン)をインストールします。
    1. info.pngドキュメントによると、デフォルトではアドオンの一括インストールは無効になっています。もしすべてインストールしたい場合には、以下の要領で有効にします。
      1. /etc/opscode/chef-server.rb: 以下の設定を追加します。
        1. # default: false
        2. addons['install'] = true
      2. 再構成します。
        $ sudo chef-server-ctl reconfigure
    2. 個別にインストールする場合には、以下の要領で行います。
      1. ChefManage
        $ sudo chef-server-ctl install opscode-manage
        $ sudo chef-server-ctl reconfigure
        $ sudo opscode-manage-ctl reconfigure
      2. ChefPushJobs
        $ sudo chef-server-ctl install opscode-push-jobs-server
        $ sudo chef-server-ctl reconfigure
        $ sudo opscode-push-jobs-server-ctl reconfigure
      3. ChefReplication: 複数サーバで冗長化する場合には必要です。今回はインストールしません。
      4. ChefReporting
        $ sudo chef-server-ctl install opscode-reporting
        $ sudo chef-server-ctl reconfigure
        $ sudo opscode-reporting-ctl reconfigure

ChefServer本体(Chef11)のセットアップ

SSLサーバ証明書の入れ替え

  • デフォルトでは自己署名証明書がインストールされますので、それを適切な証明書に入れ替えます。
  1. 環境に適したサーバ証明書を用意します(内部の認証局を運用する場合には、認証局(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
  2. 以下のパスに配備したものとします。秘密鍵はノーパスフレーズにし、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
  3. chef-server.rb(Chef12は、/etc/opscode/chef-server.rb、Chef11は、/etc/chef-server/chef-server.rb): ChefServer更新のための設定ファイルを用意します。
    1. nginx['ssl_certificate_key']    = "/etc/pki/tls/private/chef_io_example_com.key"
    2. nginx['ssl_certificate']        = "/etc/pki/tls/certs/chef_io_example_com.crts.pem"
  4. 以下のコマンドでサーバを再構成します。nginxが再起動されます。
    $ sudo chef-server-ctl reconfigure
    1. もしサービスするDNS名も同時に変更した場合には、追加機能についても再構成します。
      $ sudo opscode-manage-ctl reconfigure
      $ sudo opscode-push-jobs-server-ctl reconfigure
      $ sudo opscode-reporting-ctl reconfigure
  5. クライアントからテストします。
    1. 各設定ファイルに以下の要領で設定を追加します。
      1. #ssl_ca_path
      2. ssl_ca_file "/etc/pki/tls/certs/grid_ca.crt"
      3. #trusted_certs_dir
      4. ssl_verify_mode :verify_peer
    2. knifeコマンドでチェックしてみます。
      $ knife ssl check
      Connecting to host chef.io.example.com:443
      Successfully verified certificates from `chef.io.example.com'

Chef12へのアップグレード

ChefServer本体のアップデート

info.pngメジャーバージョンアップについては、Opscodeのドキュメントをご参照ください。以下の説明は、Ver. 11のマイナーバージョンアップの模様です。

  1. まず最初に各サービスを停止させます。
    $ sudo chef-server-ctl stop
  2. パッケージをダウンロードし、アップグレードさせます。
    $ 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
    • note.png複数桁のマイナーバージョンではアップグレードと見做されない場合がありますので、ご注意ください。
      $ 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
    • note.pngupgradeコマンドを指示された場合には、続けてそれを実行します。
      $ 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
    • note.png再構成にはデータベースへのアクセスが必要な場合があるため、そのようなときにはサービスを開始してから再構成を行います。
      $ sudo chef-server-ctl start
      $ sudo chef-server-ctl reconfigure
      ...
      Chef Client finished, 15 resources updated
      chef-server Reconfigured!
      • note.png参考までに、データベースアクセスエラーは以下の通りです。
        1. ================================================================================
        2. Error executing action `run` on resource 'execute[/opt/chef-server/embedded/bin/createdb -T template0 -E UTF-8 opscode_chef]'
        3. ================================================================================
        4.  
        5.  
        6. Mixlib::ShellOut::ShellCommandFailed
        7. ------------------------------------
        8. Expected process to exit with [0], but received '1'
        9. ---- Begin output of /opt/chef-server/embedded/bin/createdb -T template0 -E UTF-8 opscode_chef ----
        10. STDOUT:
        11. STDERR: createdb: could not connect to database template1: could not connect to server: No such file or directory
        12.         Is the server running locally and accepting
        13.         connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
        14. ---- End output of /opt/chef-server/embedded/bin/createdb -T template0 -E UTF-8 opscode_chef ----
        15. Ran /opt/chef-server/embedded/bin/createdb -T template0 -E UTF-8 opscode_chef returned 1

ローカルroot権限による knife コマンド実行のためのセットアップ

  1. こちらChef Client タブから環境にあったパッケージをダウンロードし、インストールします。
    $ sudo yum install chef-11.4.4-2.el6.x86_64.rpm
  2. 以下の要領で 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
  3. admin ユーザの秘密鍵は、/etc/chef-server/admin.pem にありますので、シンボリックリンクにより調整します。
    $ sudo ln -s /etc/chef-server/admin.pem /root/.chef/admin.pem
  4. 正しく動作するか確認します。これによりChefServerローカルマシンのroot権限を持つユーザがChefServerの管理権限を持つようになりました。
    $ sudo knife client list
    chef-validator
    chef-webui

Hosted Chef を利用する場合には

  1. note.pngクライアントバリデート用の秘密鍵(ORGANIZATION_NAME-validator.pem)は、Organizationの新規作成時にしかダウンロードできませんので、忘れずにダウンロードしておきましょう。通常、クライアント追加登録作業はChef Workstation上で行いますので、そちらでこの秘密鍵が必要となります。なお、作成時にダウンロードしなかった場合には、後ほどキーペアを再生成の上、新しい秘密鍵をダウンロードすることになります。
    hosted_chef00.png

ChefServer の権限管理

  1. アクセス制御

ChefServer の高可用性

  1. ChefServer の停止は、運用上、即重大な障害につながるわけではありませんので、リアルタイムのフェイルオーバーは必須ではありません。

バックアップとリストア

  1. 構成上、ChefServerにしか存在しない情報(主にPostgreSQL)を日常的にバックアップ(またはレプリケーション)しておき、迅速にリストアするようにします。
  2. バックアップとリストア方法

Chef Workstation (Chef12)

Chef Development Kit (DK) によるセットアップ

  1. Chef DK提供以降は、それを利用するのがよいでしょう。
    1. http://downloads.chef.io/chef-dk/ から適切なパッケージをダウンロードし、インストールします。
      $ sudo dpkg -i ./chefdk_0.8.0-1_amd64.deb
      • lightbulb.pngバージョンを指定して、インストールスクリプトから直接インストールすることも可能です。
        $ curl -L https://www.chef.io/chef/install.sh | sudo bash -s -- -P chefdk -v 1
    2. インストールされたコンポーネントをチェックします。
      $ 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.
    3. rubyへのパスを通します。
      $ which ruby
      $ echo 'eval "$(chef shell-init bash)"' >> ~/.bash_profile
      $ . ~/.bash_profile
      $ which ruby
      /opt/chefdk/embedded/bin/ruby
      • lightbulb.pngシェル環境を汚したくない場合には、direnvを利用するとよいでしょう。クックブックまたはそれらを格納しているルートディレクトリに、.envrc を設置します。
        $ direnv edit .
        ...
        $ cat .envrc
        eval "$(chef shell-init bash)"
  2. 開発、運用用に(管理権限クライアントは使用できないので)管理権限をもつユーザを用意します。

ChefWorkstationOnWindows

  • Chef DKがWindowsで正式にサポートしているシェルは PowerShell? のみです。
  • しかし、ssh や rsync などとあわせて使用する場合には、CygwinMinGW を利用するのが便利だったのですが、2016年8月にWindows 10 Anniversary Updateがリリースされ BashOnUbuntuOnWindows が利用可能になったため、そちらを利用する方が問題が少なくなりました。
    • 詳細は、こちらをご参照ください。

Chef Workstation (Chef11)

なぜ ChefServer から Chef Workstation を構築しないのか

  1. 後述の knife bootstrap コマンドを使用すれば、ChefServer から Chef Workstation を容易に構築することが可能です。ただし、同時に管理者権限を付与するようなオプションがないようですので後ほどWeb UIから付与しなければなりません。以上の理由から、Chef Workstation を knife bootstrap コマンドで構築することは見送っています。
  2. info.png当然ながら、Hosted Chefではサーバ上でのCLIは利用できません。

Chef Workstation(管理権限をもつクライアント)のセットアップ

  1. ChefServerマシンにて、-a オプションを付けて、管理権限を持つクライアント(Chef Workstation)を追加します。このクライアントの秘密鍵は、-f オプションの指定ファイルに出力されます。もちろん、その公開鍵はChefServerに保存されます。lightbulb.png以下の例では、秘密鍵のファイル名に短縮した 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
  2. ワークステーションに、その秘密鍵とバリデート用の秘密鍵を転送します。ワークステーションでバリデート用の秘密鍵が必要な理由は、ワークステーションが専ら管理対象クライアントの追加に従事するからです。
    $ 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'
  3. これ以降はワークステーション上での作業ですが、knife の設定のみです。まず、こちらChef Client タブから環境にあったパッケージをダウンロードし、インストールします。以下の例では、debian.pngDebian wheezy を使用しています。
    $ sudo dpkg --install chef_11.4.4-2.debian.6.0.5_amd64.deb
  4. ワークステーション設定用のディレクトリ(/etc/chef-workstation)を用意し、先ほど転送した2つの秘密鍵を移動させ、パーミッションを適切に変更します。lightbulb.pngワークステーションといえども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
  5. 以下の要領で 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
  6. ワークステーションクライアントの秘密鍵の場所をシンボリックリンクで調整します。
    $ sudo ln -s /etc/chef-workstation/adm00.io.pem /etc/chef-workstation/adm00.io.example.com.pem
  7. まずは設定ファイルを指定して、knife の動作を確認します。
    $ sudo knife client list -c /etc/chef-workstation/knife.rb
    adm00.io.example.com
    chef-validator
    chef-webui
  8. note.png問題なければ、最後にChefServer上に残っているワークステーションクライントの秘密鍵を忘れずに削除します。
    [@gpm00]$ sudo rm adm00.io.pem

Chef管理グループへの権限付与(オプション)

  • Chef Workstation から行う作業の範囲によりますが、対象ノードへのSSHログインを経由した操作(knife bootstrap、knife ssh等)を行いたい場合には、(rootは不可ですから)SSHログイン可能なオペレータのアカウントを使う必要がありますので、それらのChef管理ユーザに Chef Workstation 秘密鍵へのアクセスを許可します。
  • 運用ポリシーによりますが、もちろんオペレータを個別にChefのクライアントとして登録しても構いません。
  1. 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
  2. 各オペレータは、knife 設定ファイルをコピーし、動作を確認します。
    $ mkdir ~/.chef
    $ cp /etc/chef-workstation/knife.rb ~/.chef/
    $ knife client list
    adm00.io.example.com
    chef-validator
    chef-webui

Hosted Chef を利用する場合には

  1. Web UIからWorkstation用のクライアントを追加します。note.pngAPIアクセス用の秘密鍵(CLIENT_NAME.pem)は、この追加時にしかダウンロードできませんので、忘れずにダウンロードしておきましょう。なお、追加時にダウンロードしなかった場合には、後ほどキーペアを再生成の上、新しい秘密鍵をダウンロードすることになります。
    hosted_chef01.png
  2. Web UIからWorkstation用のクライアントに管理者権限を付与します。
  3. 以降は、Open Source Chefとほぼ同様の手順ですが、knife configure コマンドは使用せず、設定ファイルは、Web UIのOrganizationsページにある Generate knife config リンクからダウンロードし、適宜編集して配備します。

管理対象ノードの追加

事前準備(Chef12以降)

  • Chef12以降では、デフォルトでサーバのSSL証明書が検証されますので、そのための準備作業を行います。
  1. まず以下のコマンドであらかじめ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
  2. 次に(Chef 12.1以降では)バリデーションクライアントキーを使ったノード登録は古い方法ですので、それらの設定を無効にします。なお、新しい方法を Validatorless Bootstrap といいます。
    1. 古い方法でも登録が可能ですが、以下のようなアドバイスが表示されます。
      $ 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
    2. .chef/knife.rb: 以下の要領でバリデーションクライアントの設定を無効化します。ノード登録時には、代わりにユーザの資格証が使用されるようになり、対象ノードにはバリデーションクライアントの秘密鍵(validation.pem)がコピーされなくなり、よりセキュアになります。
      1. #validation_client_name   "#{org_name}-validator"
      2. validation_key           "/nonexist"
      3. #(...)
      4. trusted_certs_dir "#{conf_dir}/trusted_certs"
      5. verify_api_cert   true  # overridden by ssl_verify_mode (= :verify_peer)
      6. ssl_verify_mode   :verify_peer

一般ノードの追加

  1. 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
    1. info.pngよく同時に使用されるオプションとしては以下のようなものがあります。
      1. -r, --run-list RUN_LIST: ノードに適用されるrun_list。ノード追加後、そのまま即座に反映されますのでご注意ください。chef-clientをサービスとして起動させるchef-clientレシピ等を反映させるとよいでしょう。
      2. -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
      3. --node-ssl-verify-mode none(Chef12): peer がデフォルトで none にするのは非推奨ですが、アクセス先のサーバ証明書がテスト用の自己署名である場合などに一時的に利用するとよいでしょう。
    2. Chef12
      1. ノード登録後の状態を確認します。サーバ証明書がコピーされ、検証が通っています。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'
    3. Chef11
      1. note.png対象ノードに対する操作は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
      2. 対象ノードに配備された秘密鍵や設定ファイルは以下の通りです。
        $ 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
      3. note.pngChefClient の動作が確認できた時点で、(このノードはWorkstationではなく一般クライアントですので)クライアント登録のために使用されたバリデート用の秘密鍵を忘れずに削除します。
        $ ssh -t ns00.grid.example.com sudo rm /etc/chef/validation.pem
  2. なお、デフォルトでは Chef Omnibusインストーラ(chef-full)によって ChefClient のセットアップが行われます(このテンプレートをカスタマイズすることも可能です)。依存コンポーネントはすべて /opt/chef 以下にインストールされますので、対象ノードの環境に影響を与えないという点で最適でしょう。ただし、未対応のOSでは以下のようにセットアップに失敗しますので注意が必要です。lightbulb.png多少強引ですが、ある程度互換性が見込まれるOSであれば手動でOmnibusパッケージ(例えばDebian 7.0に6.0.5用のパッケージ等)をインストールしておいてから、bootstrapコマンドを実行するとインストール部分がスキップされますので追加に成功します。
    1. gw00.grid.example.com Downloading Chef 11.4.4 for debian...
    2. gw00.grid.example.com Unable to retrieve a valid package!
    3. gw00.grid.example.com Please file a bug report at http://tickets.opscode.com
    4. gw00.grid.example.com Project: Chef
    5. gw00.grid.example.com Component: Packages
    6. gw00.grid.example.com Label: Omnibus
    7. gw00.grid.example.com Version: 11.4.4
    8. gw00.grid.example.com
    9. gw00.grid.example.com Please detail your operating system type, version and any other relevant details
    10. 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
    11. gw00.grid.example.com bash: 行 74: chef-client: コマンドが見つかりません
  3. ChefClient の明示的な実行は以下の要領で行います。ChefServerとのレシピの同期が行われ、そのレシピが適用された結果がレポートされます。
    $ ssh -t ns00.grid.example.com sudo chef-client
  4. 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
    1. さらにノード数が非常に多く、ChefClientの制御を自動化したい場合、また後からChefClientの設定を調整したい場合には、Opscodeが提供するクックブックの利用を検討するとよいでしょう。

既存ワークステーションのノードとしての追加

  • 既存のワークステーションはすでにクライアントとしてのキーペアを生成済ですので、手動でノードとしての追加と ChefClient のセットアップを行います。
  1. ワークステーションをノードとしても作成します。
    $ knife node create adm00.io.example.com -e vi
    Created node[adm00.io.example.com]
  2. ChefClient の設定ファイルは、/etc/chef 以下に格納されますので、ワークステーションの秘密鍵や設定ファイルが他のディレクトリにある場合には、そちらにシンボリックリンクしておくと何かと便利です。
    $ sudo ln -s /etc/chef-workstation /etc/chef
  3. /etc/chef/client.rb: ChefClient の設定ファイルを用意します。
    1. log_level        :auto
    2. log_location     STDOUT
    3. chef_server_url  "https://chef.io.example.com"
    4. validation_client_name "chef-validator"
    5. node_name "adm00.io.example.com"
  4. ChefClient の秘密鍵のデフォルトファイルパスは、/etc/chef/client.pem ですので、必要であればシンボリックリンクで調整します。
    $ sudo ln -s /etc/chef/adm00.io.pem /etc/chef/client.pem
  5. ChefClient を起動させ、動作を確認します。
    $ sudo chef-client

ChefServer自身のノードとしての追加

  1. 最後に忘れてはいけないChefServer自身のノードとしての管理ですが、自サーバにノード追加しては障害時に復旧できませんので、もし存在するのであれば他のChefServerにノード追加して管理します。他のChefServerがない場合には、OpscodeのHosted Chefの利用を検討するとよいでしょう。
    $ knife bootstrap chef00.io.example.com -x `whoami` --sudo -N chef00.io.example.com -V

ノードのリスト

  1. 登録されたノードの状態は、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.
  2. 実際の運用にはCLIが有用ですが、Web UIからも確認が可能です。
    chef_server00.png

Chef Supermarket

  1. こちらをご参照ください。

Chefのセキュリティ

  1. アクセス制御
  2. ChefVault - 秘密情報の管理

アドオン(Chef12)

  1. ChefManage
  2. ChefPushJobs
  3. ChefReplication
  4. ChefReporting

トラブルシューティング

  1. ChefServer

参考リソース

  1. http://docs.opscode.com/install_server.html
  2. http://docs.opscode.com/chef/install_workstation.html

*1 参考までに、SSHアクセスを利用している knife bootstrap および knife ssh コマンド自身のエージェント転送設定は、11.6.0で利用できるようになるようです(CHEF-3779)。

添付ファイル: filehosted_chef01.png 160件 [詳細] filehosted_chef00.png 169件 [詳細] filechef_server00.png 261件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-04-30 (月) 10:27:24 (107d)