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

Source: https://habr.com/ru/post/J219249/


All Articles