這是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。學習
在展現個人代碼前,先讓咱們一塊兒學習下PSTools。spa
◆PsExec - 遠程執行進程
◆PsFile - 顯示遠程打開的文件
◆PsGetSid - 顯示計算機或用戶的 SID
◆PsInfo - 列出有關係統的信息
◆PsKill - 按名稱或進程 ID 終止進程
◆PsList - 列出有關進程的詳細信息
◆PsLoggedOn - 查看在本地經過資源共享(包含全部資源)登陸的用戶
◆PsLogList - 轉儲事件日誌記錄
◆PsPasswd - 更改賬戶密碼
◆PsService - 查看和控制服務
◆PsShutdown - 關閉並從新啓動(可選)計算機
◆PsSuspend - 暫停進程
其中,最經常使用到的是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,作完最後一步,纔算完整的添加進去了。