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

提供:Dev Guides
移動先:案内検索

序章

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

これは、Chefシリーズを使用したインフラストラクチャの管理を開始するための6番目のチュートリアルです。 このガイドでは、他の5つのチュートリアルを完了し、Chefサーバー、ワークステーション、および1つ以上のノードが稼働していることを前提としています。

私たちの目標

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

knife cookbook create

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

カバーします:

  • knife status
  • knife ssh
  • knife node

前提条件

このチュートリアルは、Chefシリーズを使用したインフラストラクチャの管理の開始の5番目のガイドナイフ用DigitalOceanプラグインを使用してChefでドロップレットを管理する方法を理解していることを前提としています。

役割とサーバーの例を作成する

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

まず、ワークステーションで、chef-repoディレクトリに移動します。

cd ~/chef-repo

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

nano roles/backend.rb

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

name "backend"
description "Backend for application servers"

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

knife role from file roles/backend.rb

それが済んだら、DigitalOceanKnifeプラグインを使用していくつかのサンプルノードを作成できます。

(注:このプラグインは、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サーバーのWebインターフェイスからノード>削除をクリックすることで、いつでもこれらのノードを削除できます。

ナイフステータスでステータスを表示

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

同様の状況のノードがある場合は、chef-clientエラーログを確認するか、ChefサーバーのWebインターフェイスからレポート>実行履歴を使用してください。

ナイフsshを使用したコマンドの発行

knife sshを使用して、ノード(またはノードのサブセット)にコマンドを一度に発行できます。 たとえば、knife sshを使用して、フロントエンドの役割を持つすべてのノードで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コマンドを発行することにより、すべてのフロントエンドサーバーでコマンドを実行しました。 議論を分解して、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

上記の*はワイルドカード文字です。 属性値の0個以上の文字と一致します。 この場合、前に見たknife status出力に表示されている値ubuntu14.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(フォロー)オプションを使用してログを調整でき、結果はコンソールに継続的に出力されます。

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

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

Webブラウザでノードの1つのIPアドレスにアクセスすると、何もしなくてもNginxアクセスログにエントリが表示されます。

ナイフノードによるノードの管理

Ubuntuでインフラストラクチャを管理するためのシンプルなChefクックブックを作成する方法ガイドに従っている場合は、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

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

長い印刷された属性のリストは、必ずしも私たちにとってあまり役に立ちません。 しかし、ナイフは私たちもそこでカバーしています。 ノードの属性の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エンジニアにとって非常に強力なツールです。