テンプレートの割り当てにより、Zabbixへのサーバーの追加を自動化します

Zabbixに新しいサーバーを追加する最も簡単な方法は、Webインターフェイスを使用することです。 新しいサーバーにアクセスし、Webフェイスにアクセスして、タイプライターを追加しました。 しかし、何かを手作業で行う場合、特にサーバーを頻繁に運用する場合はいつでも忘れることができます。

別のそのような事件の後:何かがクラッシュし、それが監視されたことがないことが判明した、プロセスを自動化するためのアイデアが生まれました。



この問題の調査により、サーバーはいくつかの方法で自動的に追加できることが示されました。


  1. ネットワーク検出により-アドレスの範囲を設定し、システムは定期的にポートスキャンを起動し、検出結果に基づいてノードを自動的に追加し、受信したデータに基づいて特定のテンプレートを割り当てることができます。

    このオプションは悪くありませんが、私の場合、サブネットがたくさんあり、それらは変更され、毎回zabbixにリストを追加するのは不便です。 さらに、ポートに関するポーリングによってシステムに関するすべての情報を見つけることができるわけではありません。
  2. 自動登録 。 新しいエージェントが接続されると(一意のホスト名によって決定される)zabbixサーバーを構成して、ホストをグループに追加できます。 また、テンプレートのセットを追加できます。

    この場合、スキャン範囲とアドレス範囲から離れていますが、パターンに関して柔軟性が不足しています。

  3. オプションがあります-その場でテンプレートを生成する、データベースに直接情報を書き込むなど-すべてが何らかの形で複雑です。


新しいサーバーのセットアップ中に、Puppetを使用してエージェントの設定が自動的に生成されるため、2番目のオプションである自動登録を使用し、zabbix APIを介して必要なテンプレートをロールすることにしました。

実際、パペットの存在は重要ではありません。他の方法で新しいホストにスクリプトをスローし、他の何かを使用してホスト構成パラメーターを決定できます。 簡単なオプションを提供しますが、より複雑なスキームを考えることは難しくありません。



したがって、アルゴリズムは次のとおりです。


  1. サーバーのセットアップ時に、zabbixエージェントが到着し、その構成にFQDNホスト名が書き込まれます。 また、zabbixapiで動作できるスクリプトzabbixapi.pyが付属しています。
  2. エージェントはサーバーをノックし、自動登録がトリガーされると、ホストは特別なAutoRegisteredグループに分類され、「New Server」テンプレートが自動的に適用されます。唯一のhost.relocateデータ要素
  3. Zabbixサーバーは、zabbixapi.pyスクリプトを実行するよりもhost.relocateキーをポーリングします。
  4. 次に、スクリプトはホストの基本パラメーターを決定し、APIを介してZabbixサーバーにクロールし、そこでAutoRegisteredグループからホストを削除し、New Serverテンプレートを削除し、必要なグループに追加し、必要なテンプレートを含めます。


zabbixapi.pyの余分な実行から逃れるためには、中間テンプレートの複雑さが必要です。 実際、zabbixサーバー自体は、ホストがAutoRegisteredグループを離れるとすぐにプルを停止します。 それ以外の場合は、結果を確認できずに、一定の頻度で絶えずスクリプトを実行するか、一度実行する必要があります。



システム全体が機能するには、何を構成する必要がありますか?


  1. ZabbixサーバーでAutoRegisterネットワークノードのグループを作成します
  2. 単一のデータ項目で自動登録テンプレートを作成する
    host.relocate
    画像




  3. テンプレートを新しいホストに割り当て、それをAutoRegisteredグループに追加する検出ルールを作成します。 Webインターフェース-設定->アクションで、右上を選択-イベントのソース:自動登録->新規アクション

    ホストの自動登録
    画像








  4. 対応するUserParameterをエージェントzabbix構成に追加します。

    UserParameter=host.relocate,/etc/zabbix/bin/zabbixapi.py > /dev/null 2>&1 ;echo $?





  5. 指定されたパスにスクリプトを配置します。

    /etc/zabbix/bin/zabbixapi.py
     #!/usr/bin/env python import urllib, json, httplib, socket, sys, os def httpRequest(request): body = json.dumps(request) headers = {"Content-type": "application/json"} conn = httplib.HTTPConnection("zabbix.example.com", 80) conn.request("POST", "/api_jsonrpc.php", body, headers) response = conn.getresponse() data = response.read() conn.close() return data me = os.popen('facter --puppet fqdn').read().strip('\n') #    authToken = httpRequest({"jsonrpc": "2.0","method":"user.authenticate","params":{"user":"API_USER","password":"API_PASSWORD"},"auth": None,"id":0}) authToken = json.loads(authToken).get('result', None) # ,      Autoregistered hostInGroup = httpRequest({"jsonrpc":"2.0","method":"host.get","params":{"output":"extend","filter":{"host":me}, "groupids":"21"},"auth":authToken,"id":1}) hostInGroup = json.loads(hostInGroup).get('result', None) if hostInGroup: hostID = httpRequest({"jsonrpc":"2.0","method":"host.get","params":{"output":"extend","filter":{"host":me}, "groupids":"21"},"auth":authToken,"id":2}) hostID = json.loads(hostID) hostID = hostID['result'][0]['hostid'] print "Host is in AutoRegistered Group" print "HostID is",hostID print "We need to update host info, link templates and move host to proper group" #  facter  ,      print "Collecitng host info..." osFamily = os.popen('facter --puppet kernel').read().strip('\n') virtualEnv = os.popen('facter --puppet virtual').read().strip('\n') print "Base OS is",osFamily if osFamily == "FreeBSD": hostGroups = [{"groupid":"11"}, {"groupid":"6"}] hostTemplates = [{"templateid":"10077"}, {"templateid":"10090"}] if osFamily == "Linux": print "Checking virtualization..." if virtualEnv == "physical": print "Physical host detected, no virtualization" hostGroups = [{"groupid":"11"}, {"groupid":"2"}] hostTemplates = [{"templateid":"10076"}, {"templateid":"10090"}, {"templateid":"10127"}] if virtualEnv == "openvzve" or virtualEnv == "openvz": print "OpenVZ virtualization detected" hostGroups = [{"groupid":"11"}, {"groupid":"14"}] hostTemplates = [{"templateid":"10117"}, {"templateid":"10090"}] print "Detected groups are", hostGroups print "Detected templates are", hostTemplates updateHost = { "jsonrpc":"2.0", "method":"host.update", "params":{ "hostid":hostID, "ip":"127.0.0.1", "groups":hostGroups, "templates":hostTemplates, "templates_clear":"10263" }, "auth":authToken, "id":3 } print "Trying to update host..." httpRequest(updateHost) hostInterfaceID = httpRequest({"jsonrpc":"2.0","method":"hostinterface.get","params":{"output":"extend", "hostids":hostID},"auth":authToken,"id":4}) hostInterfaceID = json.loads(hostInterfaceID) hostInterfaceID = hostInterfaceID['result'][0]['interfaceid'] print "Host Interface ID detected as", hostInterfaceID updateHostInterface = { "jsonrpc":"2.0", "method":"hostinterface.update", "params":{ "interfaceid":hostInterfaceID, "dns": me, "useip": 0 }, "auth":authToken, "id":4 } print "Trying to update host interface to DNS based..." httpRequest(updateHostInterface) sys.exit(0) else: print "Host is absent in AutoRegistered Group" print "Nothing to do..." sys.exit(0)
          
          







    与えられた例では、LinuxまたはFreeBSDのオペレーティングシステムを調べ、OpenVZ仮想化の存在を調べます-これは、基本的なテンプレートの選択に影響します。 必要に応じて、機能を簡単に拡張できます。実装は使用するものとは大きく異なる可能性があるため、情報の単純なバージョンを公開します。

    注意してください、グループとテンプレートの数はスクリプトにハードコードされています、それらはあなたのインストールで異なるでしょう、それを修正することを忘れないでください!




All Articles