UbuntuでChefとKnifeを使用してクラスターを管理する方法
序章
Chefは構成管理システムです。インフラストラクチャを構築するためのレシピの繰り返し可能なセットを提供するように設計されており、アプリケーションコードとほぼ同じ方法でインフラストラクチャを自動化、バージョン管理、およびテストできます。
これは、Chefシリーズを使用したインフラストラクチャの管理を開始するための6番目のチュートリアルです。 このガイドでは、他の5つのチュートリアルを完了し、Chefサーバー、ワークステーション、および1つ以上のノードが稼働していることを前提としています。
私たちの目標
knife は、Chefに同梱されているコマンドラインツールです。 シェフの料理本、データバッグ、または役割を作成および管理するために、すでにナイフを使用している可能性があります。 ナイフでコマンドを発行するときは、通常、次の行に沿って何かを入力します。
knife cookbook create
上記のコマンド例では、cookbook
knifeサブコマンドを使用しています。 このガイドでは、コマンドを発行し、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エンジニアにとって非常に強力なツールです。