NagiosとPuppetによる自動監視

こんにちは

約1年前に遭遇した問題について書きたいと思います。 プロジェクトにAWSのアカウントを割り当て、開発プロセスをクラウドに移行することにしました。 すべてが便利であり、仮想サーバーはスマートに展開および構成されますが、本番環境に移行するほど、監視の問題はより深刻になりました。 新しいサーバーが毎日追加され、自動スケーリングは本番環境で計画されていました。



念のため、簡単な説明:



Nagiosは、オープンソースのコンピューターシステムおよびネットワーク監視プログラムです。 監視用に設計され、コンピューティングノードとサービスのステータスを監視し、一部のサービスが作業を停止(または再開)した場合に管理者に通知します。

Puppetは、複数のコンピューターにインストールされているオペレーティングシステムとプログラムの構成を集中管理できる、クロスプラットフォームのクライアントサーバーアプリケーションです。 PuppetはRubyプログラミング言語で書かれています。



プロジェクトコンポーネントのパペットマニフェストのほとんどはその時点ですでに記述されており、新しいノードを追加する現在の方法はこのシステムのボトルネックでした。 そして驚いたことに、人形がnagios_host、nagios_contactなどのリソースをサポートし始めたことがわかりました。

パペットタイプリファレンス



その結果、puppet-server、nagios-servers(dev / stage / production)、および多数のノードがあります。 新しいノードがあることをnagiosサーバーに伝える必要がありました。

アルゴリズムは次のとおりです。

新しいノードのブートストラップ=>ノードでのPuppetエージェントの起動=> nagiosを使用したノードでのPuppetエージェントの起動(デフォルトでは30分ごと)。

Puppetはエクスポートされたノードリソースをデータベース(puppetdb / mysql / postgress / etc?)に完全に保存できます。 エクスポートされたリソースは、fqdn、ip_addressなどのファクトノードから変数を抽出するのに役立ちます。これが必要でした。



puppetdbのインストールに移りましょう。

実際、すべてがシンプルです

Puppetlabs Puppet Labsパッケージリポジトリを追加する



この方法は私のために働く



wget apt.puppetlabs.com/puppetlabs-release-precise.deb

sudo dpkg -i puppetlabs-release-precise.deb

sudo apt-get update

sudo puppetリソースパッケージpuppetdb ensure = latest

sudo puppetリソースサービスpuppetdb ensure = running enable = true





/etc/puppet/puppet.conf

[マスター]

storeconfigs = true

storeconfigs_backend = puppetdb





/etc/puppet/puppetdb.conf

[メイン]

サーバー=パペット#dns名

ポート= 8081





ここでは、puppetdbの代わりにmysqlまたはpostgresqlをインストールする方法について詳しく説明します。







たとえば、エクスポートされたリソースを使用します。 2つのクラスを取る



クラステスト{



ファイル{"/ tmp / 1":

確認=>存在、

内容=> "$ :: ipaddress"、

}



}





クラステスト{



@@file



{"/ tmp / 1":

確認=>存在、

内容=> "$ :: ipaddress"、

}



}





最初のケースでは、ノードがテストマニフェストを使用するときに、ファクターの変数$ :: ipaddressの内容が/ tmp / 1ファイルにコピーされます。 2番目の場合、ノード上のファイルは作成されず、 @@file



リソースは後で呼び出すためにpuppetdbに保存され@@file





デザインを使用して呼び出すことができます



クラスexport_test {



ファイル<< | | >> {

}



}





彼女はクラスで宣言されており、次のように述べています。すべてのエクスポートリソースをFile形式で提供してください。



site.pp

ノード 'firstnode' {

テストを含める

}

ノード 'secondnode' {

exporttestを含める

}





その結果、fistnodeからのリソースがsecondnodeにコピーされます。

nagiosリソースでも同じことを行います



Nagios Config



ホストの定義{

アドレス23.253.222.185

エイリアスMagnetdb-1

host_name Magnetdb-1

linux-serverを使用

ホストグループ開発

}



サービスの定義{

service_description SSH

ローカルサービスを使用する

check_command check_ssh

サービスグル​​ープGENERIC_GROUP

host_name Magnetdb-1

}



サービスの定義{

service_description PING

nagios-graph-serviceを使用

check_command check_ping!100.0.20%!500.0.60%

サービスグル​​ープGENERIC_GROUP

host_name Magnetdb-1

}







puppetdbにホストと2つのチェックを追加するクライアントのクラスを作成します

クラスnagios ::ホスト::ジェネリック{



@@nagios_host



{"$ nagios_hostname":

確認=>存在、

エイリアス=> $ nagios_hostname、

host_name => "$ nagios_hostname"、

アドレス=> $ ipaddress、

ホストグループ=> $ env、

=> 'linux-server'を使用します。

target => "$ nagios :: params :: nagios_base / hosts / $ {env} _ $ {nagios_hostname} .cfg"、#エクスポートされるノード上のリソースの場所

タグ=> $ :: deployment_id、

notify =>サービス["nagios"]、

require => File [$ nagios :: params :: nagios_dirs]、

}



@@nagios_service



{"ssh $ ipaddress":

確認=>存在、

check_command => 'check_ssh'、

host_name => $ nagios_hostname、

servicegroups => 'GENERIC_GROUP'、

service_description => 'SSH'、

=> 'local-service'を使用します。

ターゲット=> "$ nagios :: params :: nagios_base / hosts / services / $ {env} _ $ {nagios_hostname} .cfg"、

タグ=> $ :: deployment_id、

notify =>サービス["nagios"]、

require => File [$ nagios :: params :: nagios_dirs]

}



@@nagios_service



{「ping $ ipaddress」:

確認=>存在、

check_command => 'check_ping!100.0,20%!500.0,60%'、

host_name => $ nagios_hostname、

servicegroups => 'GENERIC_GROUP'、

service_description => 'PING'、

=> 'nagios-graph-service'を使用します。

ターゲット=> "$ nagios :: params :: nagios_base / hosts / services / $ {env} _ $ {nagios_hostname} .cfg"、

タグ=> $ :: deployment_id、

notify =>サービス["nagios"]、

}



}





エクスポートされたリソースのヘッダーは、ノードごとに一意である必要があります。そうでない場合、エクスポートされたリソースのパラメーターの重複に関するエラーが発生します。 これを行うには、一意の$ ipaddressまたは$ fqdnを追加します。



サーバーのクラス



クラスnagios_server {

Nagios_host << | tag == $ :: deployment_id | >> {

}

Nagios_service << | tag == $ :: deployment_id | >> {

}



#tag == $ :: deployment_idは、データベースから特定のタグを持つすべてのリソースを選択することを意味します。これは、異なるホストでチェックする必要があるいくつかのnagioがある場合に便利です。

#最初にsite.ppでdeployment_id変数を宣言する必要があります



}





site.pp

$ deployment_id = "dev"

$ env = "dev"



ノード「nagios-1」{

$ nagios_hostname = "$ {hostname}"

クラス{'nagios :: server':

}

}



ノード「nagios-client-1」{

$ nagios_hostname = "$ hostname_ $ ipaddress"

クラス{'nagios :: hosts :: generic':}



}



puppetdbからすべてのノードリソースを削除するには

puppet node clean "node_certname"





かつて、この方法は、AWSで100個のノードを処理する時間を大幅に節約するのに役立ちました。

この記事が誰かの役に立つことを願っています。 ご清聴ありがとうございました。



参照:

docs.puppetlabs.com/puppetdb/1/connect_puppet_master.html

projects.puppetlabs.com/projects/1/wiki/using_stored_configuration

docs.puppetlabs.com/guides/exported_resources.html




All Articles