UbuntuでChefとKnifeを使用してクラスターを管理する方法

前書き

Chefは構成管理システムです。インフラストラクチャを構築するための繰り返し可能なrecipesのセットを提供するように設計されており、アプリケーションコードとほぼ同じ方法でインフラストラクチャを自動化、バージョン管理、およびテストできます。

これは、Getting Started Managing Your Infrastructure Using Chefシリーズの6番目のチュートリアルです。 このガイドでは、他の5つのチュートリアルを完了し、Chefサーバー、ワークステーション、1つ以上のノードが稼働していることを前提としています。

私たちの目標

knifeは、Chefに同梱されているコマンドラインツールです。 Chef cookbook、データバッグ、またはロールの作成と管理にナイフを既に使用している可能性があります。 knifeでコマンドを発行するとき、通常、次の行に沿って何かを入力します。

knife cookbook create

上記のコマンド例では、cookbookknifeサブコマンドを使用しています。 このガイドでは、コマンドを発行してChefクラスターに関する情報を取得するためのいくつかの新しいknifeサブコマンドを紹介します。

以下について説明します。

  • knife status

  • knife ssh

  • knife node

前提条件

このチュートリアルは、Getting Started Managing Your Infrastructure Using Chefシリーズの5番目のガイドであるHow To Use the DigitalOcean Plugin for Knife to Manage Droplets in Chefまで従ったことを前提としています。

サンプルのロールとサーバーを作成する

Chefクラスターが確立されていない場合、またはこのガイドをよく読んで同じ出力を確認したい場合は、ロールとサーバーの例を設定できます。

まず、workstationで、chef-repoディレクトリに移動します。

cd ~/chef-repo

既存のweb_serverロールにbackendロールを追加します。 今のところは空白ですが、後でこれをデータベースまたはアプリケーションサーバーに変えることができます。

nano roles/backend.rb

このコンテンツをbackend.rbファイルに追加します。

name "backend"
description "Backend for application servers"

次に、新しい役割をChefサーバーにアップロードします。

knife role from file roles/backend.rb

それが完了したら、DigitalOcean Knifeプラグインを使用してサンプルノードを作成できます。

(注:This pluginは、2014年10月の時点で保守されていません。 使い始めるかどうかはあなた次第です。)

knife digital_ocean droplet create --server-name frontend01 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[web_server]"

knife digital_ocean droplet create --server-name frontend02 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[web_server]"

knife digital_ocean droplet create --server-name backend01 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[backend]"

knife digital_ocean droplet create --server-name backend02 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[backend]"

注:Chefクラスター内のさまざまなホストのドメイン名が外部で解決されず、編集された/etc/hostsファイルを使用して相互に接続する場合、プロビジョニングは新しいサーバーインスタンスとして機能しません。デフォルトの/etc/hostsファイルが与えられます。

Chefチュートリアルシリーズで作成したノードがまだアクティブな場合があります。 つまり、このチュートリアルで実行するコマンドには、余分な行や情報が含まれることがあります。 正確にフォローしたい場合は、ChefサーバーのウェブインターフェースからNodes > Deleteをクリックすることで、いつでもこれらのノードを削除できます。

ナイフのステータスでステータスを表示する

statusサブコマンドは、ノードに関するステータス情報を表示するように設計されています。 knife statusを使用するには、chef-repoディレクトリに移動して次のように入力します。

knife status

Chefサーバーが認識しているノードのリストが表示されます。これには、最後のchef-clientの実行時刻、ノード名、完全修飾ドメイン名、IPアドレス、プラットフォームが含まれます。

3 minutes ago, frontend01, fe1.yourdomain.com, 111.111.111.111, ubuntu 14.04.
3 minutes ago, frontend02, fe2.yourdomain.com, 222.222.222.222, ubuntu 14.04.
20 hours ago,  backend01, be1.yourdomain.com, 333.333.333.333, ubuntu 14.04.
3 minutes ago, backend02, be2.youdomain.com, 333.333.333.333, ubuntu 14.04.

このことから、backend01を詳しく調べる必要があることがすぐにわかります。約20時間でchef-client(Chefの用語では「チェックイン」)が正常に実行されていません。

同様の状況にあるノードがある場合は、chef-clientエラーログを確認するか、ChefサーバーのウェブインターフェースからReports > Run Historyを使用してください。

knife sshを使用したコマンドの発行

knife sshを使用して、ノード(またはノードのサブセット)にコマンドを一度に発行できます。 たとえば、knife sshを使用して、ロールfrontendを持つすべてのノードでNginxを再起動できます。

サーバーへのSSH接続を許可されたユーザーが必要です(つまり、ssh [email protected]を実行してシェルを取得できます)。 SSHキーを設定していない場合は、-Pオプションを使用してパスワードの入力を求めることができます。

knife ssh "role:web_server" "service nginx restart" -x yourusername -a ipaddress

次のような出力が得られます。

111.111.111.111  * Restarting nginx nginx      [ OK ]
222.222.222.222  * Restarting nginx nginx      [ OK ]

1つのknifeコマンドを発行して、すべてのfrontendサーバーでコマンドを実行しました。 引数を分解して、knife sshがどのように機能するかについてもう少し学びましょう。

knife ssh "web_server" "service nginx restart" -x yourusername -a ipaddress

knife sshの最初の引数はChef検索クエリです。通常はrole:YOUR_ROLE_NAMEのようなものが必要ですが、他の多くの属性を介して検索することもできます(ブール演算子と組み合わせることができます)。 たとえば、platform属性にubuntuが含まれるノードでのみコマンドを実行するには、次のコマンドを実行できます。

knife ssh "platform:ubuntu*" "service nginx restart" -x yourusername -a ipaddress

上記の*は、ワイルドカード文字です。 属性値のゼロ個以上の文字と一致します。 この場合、前に見たknife status出力に表示されている値ubuntu 14.04と一致させることができます。

knife ssh "role:web_server" "service nginx restart" -x yourusername -a ipaddress

knife sshの2番目の引数は、サーバーで実行するコマンドです(検索クエリに一致します)。 シェルに入力するほとんどすべてのものを使用できます。 コマンドをセミコロン(;)で結合することもできます。

knife ssh "role:web_server" "uptime;date" -x yourusername -a ipaddress

次のようなものが出力されます:

111.111.111.111  12:53:36 up 2 days, 15:25,  1 user,  load average: 0.08, 0.03, 0.05
111.111.111.111 Wed Oct 22 12:53:36 UTC 2014
222.222.222.222  12:53:30 up 2 days, 15:21,  1 user,  load average: 0.00, 0.01, 0.05
222.222.222.222 Wed Oct 22 12:53:30 UTC 2014

すでに説明した-x引数-ログインに使用するSSHユーザー名です。

-a引数は、SSHのアドレスとして使用するノード属性を指定します。 デフォルトでは、これはノードのFQDNです(これは前に示したknife statusコマンドで見つけることができます)。したがって、http://fe1.yourdomain.comにアクセスしてサーバーを解決できる場合は、-aオプション。

インタラクティブナイフssh

knife sshには、インタラクティブシェルにユーザーを配置する機能もあります。このシェルでは、一連のコマンドを発行して、結果をすばやく確認できます。 SSHコマンドの代わりにinteractiveを使用すると、対話型のknife sshシェルを開始できます。

knife ssh "role:web_server" interactive -x yourusername -a ipaddress

これにより、次のことがわかります。

Connected to 111.111.111.111 and 222.222.222.222

To run a command on a list of servers, do:
  on SERVER1 SERVER2 SERVER3; COMMAND
  Example: on latte foamy; echo foobar

To exit interactive mode, use 'quit!'

knife-ssh>

コマンドを入力してEnterを押すだけで、検索結果のすべてのサーバーにコマンドを発行できます。

knife-ssh> uptime
111.111.111.111  18:43:55 up 2 days, 21:16,  1 user,  load average: 0.01, 0.03, 0.05
222.222.222.222  18:43:49 up 2 days, 21:11,  1 user,  load average: 0.00, 0.01, 0.05

サーバーリストをさらに絞り込みたい場合は、ヘルプメッセージに示されているように、onを使用してください。 サンプルコマンドのSERVER1を、-aとして使用した属性に置き換える必要があることに注意してください。私たちにとって、これはノードのIPアドレスです。

knife-ssh> on 111.111.111.111; echo hello digitalocean
111.111.111.111 hello digitalocean

インタラクティブなknife sshの非常に優れた使用法の1つは、サーバーログを調整するために使用することです。 たとえば、Nginxのアクセスログがデフォルトの場所(/var/log/nginx/access.log)にある場合、-f(follow)オプションを使用してログを調整すると、結果がコンソールに継続的に出力されます。

knife-ssh> tail -f /var/log/nginx/access.log

(Nginxの設定方法によっては、このコマンドの前にsudoを使用する必要がある場合があります。)

WebブラウザーでノードのいずれかのIPアドレスにアクセスすると、何もせずにNginxアクセスログにエントリが表示されます。

ナイフノードでノードを管理する

How To Create Simple Chef Cookbooks to Manage Infrastructure on Ubuntuガイドに従っている場合は、すでにknife nodeを使用してChefサーバー上のすべてのノードを一覧表示し、ノード属性を編集しています。

knife node list
knife node edit frontend01

knife nodeを使用してノードを削除することもできます。

knife node delete frontend01

または、より詳細なノード属性を表示します。

knife node show frontend01
*******
Node Name:   frontend01
Environment: _default
FQDN:        fe01.yourdomain.com
IP:          111.111.111.111
Run List:    role[frontend]
Roles:       web_server
Recipes:     apt, nginx, apt::default, nginx::default
Platform:    ubuntu 14.04
Tags:

-lオプションを使用して、ノードの属性の完全なリストを取得できます。

knife node show -l frontend01

これにより、非常に長い属性のリストが返されます。それらのほとんどは、Ohaiによって自動的に入力されます。これは、実行されるたびに属性をchef-clientに自動的に渡すChefツールです。

長い印刷された属性のリストは、必ずしも非常に有用ではありません。 しかし、ナイフでも私たちはそれをカバーしています。 ノードの属性のJSONまたはYAML表現を取得するために、--formatオプションを指定できます。

knife node show frontend01 --format json
*******

{
  "name": "frontend01",
  "chef_environment": "_default",
  "run_list": [
  "role[web_server]"
]
,
  "normal": {
    "tags": [

    ]
  }
}

-aを使用して単一ノード属性を取得することもできます。

knife node show frontend01 --format json -a ipaddress
*******
{
  "frontend01": {
    "ipaddress": "111.111.111.111"
  }
}

JSONやYAMLの出力は、ナイフが関係するより複雑なスクリプトを作成したい場合や、ダッシュボードやメトリックを表示する場合でも非常に便利です。

結論

knifeは、Chefクラスター内のさまざまなオブジェクトを作成および更新するだけでなく、クラスターの状態を表示および管理するための強力なツールです。

knife sshを使用すると、1つのコマンドを記述して、それを多数のノードで同時に実行できます。これは、DevOpsエンジニアにとって非常に強力なツールです。