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

前書き

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

これは、https://www.digitalocean.com/community/tutorial_series/getting-started-managing-your-infrastructure-using-chef [Chefを使用したインフラストラクチャの管理の開始]シリーズの6番目のチュートリアルです。 このガイドでは、他の5つのチュートリアルを完了し、Chefサーバー、ワークステーション、1つ以上のノードが稼働していることを前提としています。

私たちの目標

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

knife cookbook create

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

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

  • +ナイフステータス

  • +ナイフssh +

  • ナイフノード

前提条件

このチュートリアルでは、5番目のガイドhttps://www.digitalocean.com/community/tutorials/how-to-use-the-digitalocean-plugin-for-knife-to-manage-droplets-inまで従ったことを前提としています。 -chef [ナイフのDigitalOceanプラグインを使用してChefのドロップレットを管理する方法]、https://www.digitalocean.com/community/tutorial_series/getting-started-managing-your-infrastructure-using-chef [はじめに] Chefを使用したインフラストラクチャの管理]シリーズ。

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

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

まず、* workstation *で、 `+ 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

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

(注:https://github.com/rmoriz/knife-digital_ocean [このプラグイン]は、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サーバーのウェブインターフェースで[ノード]> [削除]をクリックして、これらのノードをいつでも削除できます。

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

`+ 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.

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

同様の状況でノードを取得した場合は、 `+ chef-client +`エラーログを確認するか、Chefサーバーのウェブインターフェースから[レポート]> [実行履歴]を使用します。

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

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

サーバーへのSSHを許可されたユーザーが必要になります(つまり、 `+ ssh yourusername @ fe1.yourdomain.com `を実行してシェルを取得できます)。 SSHキーを設定していない場合は、「-P +」オプションを使用してパスワードの入力を求めることができます。

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

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

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

単一のknifeコマンドを発行して、すべての* frontend *サーバーでコマンドを実行しました。 引数を引き離して、 `+ knife ssh +`の仕組みについてもう少し学びましょう。

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

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

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

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

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

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

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

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

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  -a

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

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

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

https://www.digitalocean.com/community/tutorials/how-to-create-simple-chef-cookbooks-to-manage-infrastructure-on-ubuntu [管理するシンプルなシェフクックブックを作成する方法[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ツールです。

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

Related