Zabbix自動部署Agent及自動發現

這是Zabbix系列的第二篇,介紹Zabbix自動部署Agent的腳本實現及自動發現功能。node

爲何咱們要「自動」呢?由於懶~,咱們有60多臺windows服務器,若是一臺一臺的裝Agent,很枯燥且很容易出錯,因此咱們要「自動化」部署。web

本文假設讀者已經學習了該系列第一篇推薦的朱雙印老師的博客,掌握了Zabbix的基本使用。c#

自動部署

先介紹一下我自動部署腳本的思路:windows

  1. 修改zabbix_agentd.win.conf的Hostname,對,沒有猜錯,這個是Agent的config檔,其餘設置同樣,只有Hostname每臺服務器都不相同。服務器

  2. 複製修改後的Agent安裝文件到對應服務器,該功能用腳本實現,難道每臺服務器都要寫一個腳本?不須要,咱們只要在調用腳本前修改腳本里對應服務器的IP地址便可。socket

  3. 上述兩處修改的數據從哪裏來?咱們能夠寫一個配置檔,調用配置檔便可獲取數據。ide

  4. Agent安裝文件是複製到對應服務器了,但怎麼安裝呢?難道要一臺臺的裝?這裏推薦一個好用的工具箱,PSTools,能夠遠程調用腳本進行安裝。工具

通過以上步驟,便可實現自動部署Agent。學習

在展現個人代碼前,先讓咱們一塊兒學習下PSToolsspa

◆PsExec - 遠程執行進程

◆PsFile - 顯示遠程打開的文件

◆PsGetSid - 顯示計算機或用戶的 SID

◆PsInfo - 列出有關係統的信息

◆PsKill - 按名稱或進程 ID 終止進程

◆PsList - 列出有關進程的詳細信息

◆PsLoggedOn - 查看在本地經過資源共享(包含全部資源)登陸的用戶

◆PsLogList - 轉儲事件日誌記錄

◆PsPasswd - 更改賬戶密碼

◆PsService - 查看和控制服務

◆PsShutdown - 關閉並從新啓動(可選)計算機

◆PsSuspend - 暫停進程
PSTools包含的12款工具
其中,最經常使用到的是psexec這款工具。知道服務器或者電腦的用戶名和密碼,你就能夠利用它遠程執行系統命令。
詳細參數:
-u 遠程計算機的用戶名
-p 遠程計算機用戶對應密碼
-c <[路徑]文件名>:拷貝文件到遠程機器並運行(注意:運行結束後文件會自動刪除)
-d 不等待程序執行完就返回 (意思就是,當你執行一個程序無需等到他結束才返回信息)
-h用於目標系統是Vista或更高版本
psexec \\目標ip -u 用戶名 -p 密碼 命令或腳本

下面是個人腳本及config檔:

<!--配置檔,讀取該檔獲取HostName及IP-->
<?
xml version="1.0" encoding="UTF-8"?> <LineSetting> <Shop > <LineType Name="A_TYPE1"> <Line ServerName = "A1" SocketIP="10.9.9.1" SocketPort="9000" /> </LineType> <LineType Name="B_TYPE1"> <Line ServerName = "B10" SocketIP="10.9.9.2" SocketPort="9000" /> </LineType> </shop> </LineSetting>
//copyAndStart.bat
//複製Agent安裝文件到對應服務器
@echo on ********* starting....**************** net use \\10.9.9.1\D$ /user:admin password xcopy "C:\Users\lq\Desktop\zabbix" "\\10.9.9.1\D$\zabbix" /s /e /q /i psexec \\10.9.9.1 -u admin -p password -d -c InstallAndStart.bat
//InstallAndStart.bat
//安裝腳本,命令詳情請參考Zabbix官方指南

D:\zabbix\zabbix_agentd.exe -i -c D:\zabbix\zabbix_agentd.win.conf
D:\zabbix\zabbix_agentd.exe -s -c D:\zabbix\zabbix_agentd.win.conf
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.IO;
using System.Text.RegularExpressions;
using System.Diagnostics;

namespace AddService
{
    class Program
    {
        static void Main(string[] args)
        {
            //該魔術數字是HostName在config行數
            int n=141;
            XmlDocument xml = new XmlDocument();
            xml.Load("HostNameAndIP.xml");
            XmlNodeList lineNodes = xml.GetElementsByTagName("Line");
            foreach (XmlNode node in lineNodes)
            {
                string serverName = ((XmlElement)node).GetAttribute("ServerName");
                string socketIP = ((XmlElement)node).GetAttribute("SocketIP");
                //注意,GetAttribute獲得的string是所有的字符,\\就是\\!!
                ChangeHostName(n,serverName);
                ChangeBatIP(socketIP);
                ExeBat();
                System.Threading.Thread.Sleep(3000);
                Console.WriteLine($"{socketIP} {serverName} start up success");
            }
            Console.ReadLine();
        }
        static void ChangeHostName(int n,string serverName)
        {
            StreamReader sr=new StreamReader(@"C:\Users\lq\Desktop\zabbix\zabbix_agentd.win.conf");
            string[] all=sr.ReadToEnd().Split('\n');
            sr.Close();
            StreamWriter sw=new StreamWriter(@"C:\Users\lq\Desktop\zabbix\zabbix_agentd.win.conf");
            string wl="";
            for(int i=0;i<all.Length-1;i++)
            {
                if(i==n-1)
                    wl="Hostname="+serverName+"\n";
                else
                    wl=all[i]+"\n";
                sw.Write(wl);
            }
            sw.Flush();
            sw.Close();
        }
        static void ChangeBatIP(string socketIP)
        {
            FileStream fs=new FileStream("copyAndStart.bat",FileMode.Open,FileAccess.Read);
            StreamReader sr=new StreamReader(fs);
            string con=sr.ReadToEnd();
            Regex regex=new Regex(@"10.9.9.\d{1,3}");
            con=regex.Replace(con,socketIP);
            sr.Close();
            fs.Close();
            FileStream fs2=new FileStream("copyAndStart.bat",FileMode.Create,FileAccess.Write);
            StreamWriter sw= new StreamWriter(fs2);
            sw.Write(con);
            sw.Close();
            fs2.Close();
        }
     //c#執行DOS命令
static void ExeBat() { try { string targetDir=AppDomain.CurrentDomain.BaseDirectory; var proc=new Process(); proc.StartInfo.WorkingDirectory=targetDir; proc.StartInfo.FileName="copyAndStart.bat"; proc.StartInfo.Arguments=string.Format("10"); //隱藏DOS窗口 proc.StartInfo.CreateNoWindow=true; proc.StartInfo.WindowStyle=ProcessWindowStyle.Hidden; proc.Start(); proc.WaitForExit(); } catch(Exception ex) { Console.WriteLine("Exception Occurred :{0},{1}", ex.Message, ex.StackTrace.ToString()); } } } }

 以上,即實現了Agent的自動部署,可是部署了Agent還不行,還要讓Zabbix Server識別並自動添加主機,怎麼作呢?請繼續往下看。

自動發現

 注意這裏的自動發現是discovery,和以後介紹的自動發現規則是兩碼事。

Zabbix Server識別並自動添加主機比較簡單,第一步,在web頁面,配置 -> 自動發現 -> 建立發現規則。

第二步,在web頁面,配置 -> 動做 -> 自動發現(右上角的事件源) -> 建立動做

 

 通過自動部署和自動發現,咱們已經成功的將衆多服務器加到Zabbix監控裏來了。

 

可是,你會發現Zabbix自動添加的服務器的HostName是以IP命名的,不是咱們設定的主機名,怎麼解決呢?請參考這篇博客。

zabbix應用之discovery批量添加主機並實現自定義主機名

OK,作完最後一步,纔算完整的添加進去了。

相關文章
相關標籤/搜索