UbuntuでChefとKnifeを使用してクラスターを管理する方法
序章
Chefは構成管理システムです。インフラストラクチャを構築するためのレシピの繰り返し可能なセットを提供するように設計されており、アプリケーションコードとほぼ同じ方法でインフラストラクチャを自動化、バージョン管理、およびテストできます。
これは、Chefシリーズを使用したインフラストラクチャの管理を開始するための6番目のチュートリアルです。 このガイドでは、他の5つのチュートリアルを完了し、Chefサーバー、ワークステーション、および1つ以上のノードが稼働していることを前提としています。
私たちの目標
knife は、Chefに同梱されているコマンドラインツールです。 シェフの料理本、データバッグ、または役割を作成および管理するために、すでにナイフを使用している可能性があります。 ナイフでコマンドを発行するときは、通常、次の行に沿って何かを入力します。
knife cookbook create
上記のコマンド例では、 cookbook
ナイフサブコマンド。 このガイドでは、コマンドを発行し、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インターフェイスからノード>削除をクリックすることで、いつでもこれらのノードを削除できます。
ナイフステータスでステータスを表示
The 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
(シェフの用語で「チェックイン」)約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
シェフの検索クエリです-通常、次のようなものが必要になります role:YOUR_ROLE_NAME
、ただし、他の多くの属性を介して検索することもできます(ブール演算子と組み合わせることができます)。 たとえば、platform属性にubuntuが含まれるノードでのみコマンドを実行するには、次のコマンドを実行できます。
knife ssh "platform:ubuntu*" "service nginx restart" -x yourusername -a ipaddress
上記の*はワイルドカード文字です。 属性値の0個以上の文字と一致します。 この場合、 ubuntu14.04に表示されている値と一致させることができます。 knife status
前に見た出力。
knife ssh "role:web_server" "service nginx restart" -x yourusername -a ipaddress
の2番目の引数 knife ssh
サーバーで実行するコマンドです(検索クエリに一致します)。 シェルに入力するほとんどすべてのものにすることができます。 コマンドをセミコロン(; )で結合することもできます。
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
The -x
すでに説明した引数-ログインに使用するSSHユーザー名です。
The -a
引数は、SSHのアドレスとして使用するノード属性を指定します。 デフォルトでは、これはノードのFQDNです(これは、 knife status
前に示したコマンド)、したがって、 http://fe1.yourdomain.com にアクセスしてサーバーを解決できる場合は、省略できます。 -a
オプション。
インタラクティブナイフssh
knife ssh
また、一連のコマンドを発行して結果をすばやく確認できるインタラクティブシェルにユーザーを配置する機能もあります。 インタラクティブを開始できます knife ssh
を使用してシェル interactive
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
インタラクティブの1つの本当にクールな使用法 knife ssh
サーバーログを追跡するために使用しています。 たとえば、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
これにより、非常に長い属性のリストが返されます。それらのほとんどは、 Ohai によって自動的に入力されます。これは、属性を自動的にに渡すChefツールです。 chef-client
実行するたびに。
長い印刷された属性のリストは、必ずしも私たちにとってあまり役に立ちません。 しかし、ナイフは私たちもそこでカバーしています。 指定できます --format
ノードの属性のJSONまたはYAML表現を取得するためのオプション。
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エンジニアにとって非常に強力なツールです。