Этот скрипт используется для установки или переустановки агента zabbix на сервере. Перед запуском, скрипт копирует файл агента zabbix_agent из каталога со скриптом на сервер. Конфигурационный файл агента создается динамически в соответствии с заданными параметрами.
В начале скрипта устанавливается значение параметра ErrorActionPreference, чтобы скрипт игнорировал ошибки, возникающие при его выполнении. Затем скрипт определяет путь к текущему скрипту и имя лог-файла.
Далее задаются значения параметров конфигурации zabbix_agent, такие как: путь к лог-файлу, сервера zabbix, порт, таймаут и другие параметры. Также скрипт определяет несколько пользовательских параметров для мониторинга различных служб на сервере, таких как Redis, MSMQ, запланированные задачи,путь к каталогу с файлом агента и имя службы Zabbix Agent. Также задается список серверов.
Для записи лог-файла в скрипте задается функция Add-WriteLog. Затем скрипт проверяет наличие каталога лог-файла и создает его, если он отсутствует. Затем происходит установка службы Zabbix Agent с помощью команды sc.exe. Затем скрипт устанавливает права доступа к каталогу с файлом агента и конфигурационному файлу.
После установки службы Zabbix Agent, скрипт проверяет ее работу и записывает результат в лог-файл. Если служба работает, скрипт выводит сообщение о завершении работы. Если служба не работает, скрипт выводит сообщение об ошибке и записывает соответствующую информацию в лог-файл.
# Скрипт переустанавливает или устанавливает zabbix_agent
# Сам агент копируетмя из каталога со скриптом на сервер, а конфиг создается динамически!
$global:ErrorActionPreference="SilentlyContinue"
# import external variables
$mypath = $MyInvocation.MyCommand.Path
$mypath = Split-Path $mypath -Parent
$error.clear()
$namelog = $MyInvocation.MyCommand.Name
$namelog = $namelog.split(".")[0]
#Конфигурационный файл агента Zabbix
$configvalues =[Ordered] @{
LogFile = "LogFile=c:\zabbix_agent\zabbix_agent2.log"
# Параметр не работает на zabbix_agent2
#EnableRemoteCommands = "EnableRemoteCommands=1"
Server = "Server=zabbixs01.corp.net"
ServerActive = "ServerActive=zabbixs01.corp.net"
ListenPort = "ListenPort=10050"
Timeout = "Timeout=30"
# TCP connection count
tcpconcomment = "# TCP connection count"
tcpconDiscover='UserParameter=tcpcondiscovery,powershell -NoProfile -executionpolicy bypass -File "C:\zabbix_agent\scripts\TCP\tcpconDiscover.ps1"'
tcpconcount='UserParameter=tcpconcount[*],powershell -NoProfile -executionpolicy bypass -File "C:\zabbix_agent\scripts\TCP\tcpconcount.ps1" "$1"'
# Config FF discovering
configsDiscoverComment = "# Config FF discovering"
configsDiscover='UserParameter=configsdiscovery,powershell -NoProfile -executionpolicy bypass -File "C:\zabbix_agent\scripts\ConfigFFDicovering\configsDiscover.ps1"'
# Process Discovering
ProcessDiscoverComment = "# Process Discovering"
ProcessDiscover='UserParameter=processdiscovery,powershell -NoProfile -executionpolicy bypass -File "C:\zabbix_agent\scripts\Process\ProcessDiscover.ps1"'
# Redis
RedisInfoComment = "# Redis"
RedisInfo='UserParameter=RedisInfo,powershell -NoProfile -executionpolicy bypass -File "C:\zabbix_agent\scripts\Redis\RedisInfo.ps1"'
#DBMsSQLDicovering = 'UserParameter=databases.mssql.discovery,powershell -NoProfile -executionpolicy bypass -File "C:\zabbix_agent\scripts\DBDiscovering.ps1"'
# Scheduled tasks monitoring
ScheduledComment = "# Scheduled tasks monitoring"
ScheduledTaskDiscover='UserParameter=ScheduledTaskDiscover,powershell -NoProfile -executionpolicy bypass -File "C:\zabbix_agent\scripts\Scheduled\ScheduledTaskDiscover.ps1"'
ScheduledTaskStatus='UserParameter=ScheduledTaskStatus[*],powershell -NoProfile -executionpolicy bypass -File "C:\zabbix_agent\scripts\Scheduled\ScheduledTaskStatus.ps1" "$1"'
ScheduledLastRunResult='UserParameter=ScheduledLastRunResult[*],powershell -NoProfile -executionpolicy bypass -File "C:\zabbix_agent\scripts\Scheduled\ScheduledLastRunResult.ps1" "$1"'
# MSMQ
msmqComment = "# MSMQ"
msmqdiscovery='UserParameter=msmqdiscovery,powershell -NoProfile -executionpolicy bypass -File "C:\zabbix_agent\scripts\MSMQ\MSMQDiscovering.ps1"'
msmqmessagecount='UserParameter=msmqmessagecount[*],powershell -NoProfile -executionpolicy bypass -File "C:\zabbix_agent\scripts\MSMQ\MSMQMessageCount.ps1" "$1"'
# Integration links monitoring ForiFix
IntegrationComment = "# Integration links monitoring ForiFix"
getconfigstopath ='UserParameter=getconfigstopath,powershell -NoProfile -executionpolicy bypass -File "C:\zabbix_agent\scripts\CheckLinksPortStatus\GetPathConfigToFile.ps1"'
DicoveringLinks = 'UserParameter=Dicovering.Links,powershell -NoProfile -executionpolicy bypass -File "C:\zabbix_agent\scripts\CheckLinksPortStatus\GetLinksFromConfigs.ps1"'
CheckPortStatus1 = 'UserParameter=CheckPortStatus1[*],powershell -NoProfile -executionpolicy bypass -File "C:\zabbix_agent\scripts\CheckLinksPortStatus\CheckStatusPort.ps1" "$1"'
# Тэг принадлежности сервера к контуру и системе
HostMetadata="HostMetadata=win.t2.server"
}
$src_folder_zabbix_agent = "$mypath/zabbix_agent"
$serviceName="Zabbix Agent"
# Список серверов
$servers = @("t1-server01")
#Function Write Log
function Add-WriteLog {
param (
[string] $logpath,
[string] $text,
[string] $logname
)
#Create log folder
$testlogpath=Test-Path -Path $logpath
if (!$testlogpath) {
New-Item -Path $logpath -ItemType "directory"
}
$logpathname = "$logpath\$logname"
Add-Content -Path "$logpathname-$((Get-Date).Year)-$((Get-Date).Month)-$((Get-Date).Day).log"`
-Value "[$((Get-Date).TimeOfDay)] $text"
}
Add-WriteLog -logpath "$mypath\Log" -logname $namelog -text "*****************************************************"
Add-WriteLog -logpath "$mypath\Log" -logname $namelog -text "Start script"
foreach ($srv in $servers)
{
Write-Output "$("*"*20)"
Write-Output "Server: $srv"
if ((Test-NetConnection -ComputerName $srv).PingSucceeded)
{
# Проверяем есть ли сервис на сервере
$testservice = Get-Service -Name "$serviceName*" -ComputerName $srv
if (!@($testservice).Count -eq 0)
{
Add-WriteLog -logpath "$mypath\Log" -logname $namelog -text "Service Zabbix Agent found on $srv"
Write-Output "Service Zabbix Agent found on $srv"
# Останавливаем службу
$ServiceAgentZabbix=Get-Service -Name "$serviceName*" -ComputerName $srv
Stop-Service $ServiceAgentZabbix
Add-WriteLog -logpath "$mypath\Log" -logname $namelog -text "Stop and Uninstall Service Zabbix Agent on $srv"
Write-Output "Stop and Uninstall Service Zabbix Agent on $srv"
$cfg = @("\\$srv\C$\zabbix_agent\conf\zabbix_agent2.win.conf")
# Удаляем службу
$service = Get-WmiObject -Class Win32_Service -Filter "Name='$($ServiceAgentZabbix.Name)'" -ComputerName $srv
$service.delete() | Out-Null
Invoke-Command -ComputerName $srv -ScriptBlock {Remove-Item -Path HKLM:"\SYSTEM\CurrentControlSet\Services\EventLog\Application\Zabbix Agent 2" -Recurse}
# Удаляем все из каталока агента кроме txt файлов
Remove-Item -Path "\\$srv\C$\zabbix_agent\" -Exclude *.txt -Recurse -ErrorAction SilentlyContinue -WarningAction SilentlyContinue
Write-Output "Deleted all files in folder zabbix_agent excluding *.txt"
# Копируем каталог с агентом забикса на сервер
Copy-Item -Path $src_folder_zabbix_agent -Destination "\\$srv\C$" -Recurse -Force
Add-WriteLog -logpath "$mypath\Log" -logname $namelog -text "Copy Zabbix Agent on $srv"
Add-WriteLog -logpath "$mypath\Log" -logname $namelog -text "Create config Zabbix Agent on $srv"
Write-Output "Copy Zabbix Agent and Create config Zabbix Agent on $srv"
# Создаем конфигурационный файл
foreach ($v in $configvalues.Values)
{
if (($v -match "#") -or ($v -match "HostMetadata"))
{
Add-Content -Path $cfg -Value ""
}
Add-Content -Path $cfg -Value $v
}
Add-Content -Path $cfg -Value ""
Add-Content -Path $cfg -Value @("Hostname=$srv")
# Устанавливаем службу агента забикса
$res = Invoke-Command -ComputerName $srv -ScriptBlock {
Invoke-Expression -Command:'c:\windows\system32\cmd.exe /c "c:\zabbix_agent\bin\win64\zabbix_agent2.exe --config C:\zabbix_agent\conf\zabbix_agent2.win.conf --install"'
} -Verbose -ErrorAction SilentlyContinue
IF ($res -match 'installed successfully')
{
Add-WriteLog -logpath "$mypath\Log" -logname $namelog -text "Successfully Installed Zabbix Agent on $srv"
Add-WriteLog -logpath "$mypath\Log" -logname $namelog -text "Start UP Zabbix Agent on $srv"
Write-Output "Successfully Installed Zabbix Agent! Start UP Zabbix Agent on $srv!"
Get-Service -Name "$serviceName*" -ComputerName $srv | Start-Service
}
ELSEIF ($res -match 'already exists')
{
Add-WriteLog -logpath "$mypath\Log" -logname $namelog -text "Zabbix Agent Already Exists on $srv"
Write-Output "Zabbix Agent Already Exists on $srv"
Write-Output $res
Get-Service -Name "$serviceName*" -ComputerName $srv | Start-Service
}
ELSE {
Add-WriteLog -logpath "$mypath\Log" -logname $namelog -text "ERROR: Zabbix Agent not installed on $srv"
Add-WriteLog -logpath "$mypath\Log" -logname $namelog -text $res
Write-Output "ERROR: Zabbix Agent not installed on $srv"
Write-Output $res
}
}
ELSE{
Add-WriteLog -logpath "$mypath\Log" -logname $namelog -text "Service Zabbix Agent not found on the $srv!"
Add-WriteLog -logpath "$mypath\Log" -logname $namelog -text "Copy agent to [$srv]!"
Write-Output "Service Zabbix Agent not found on the $srv!"
Write-Output "Copy agent to [$srv]!"
Copy-Item -Path $src_folder_zabbix_agent -Destination "\\$srv\C$" -Recurse -Force
Add-WriteLog -logpath "$mypath\Log" -logname $namelog -text "Create config file on [$srv]!"
Add-WriteLog -logpath "$mypath\Log" -logname $namelog -text "Install Service zabbix agent to [$srv]!"
Write-Output "Create config file on [$srv]!"
Write-Output "Install Service zabbix agent to [$srv]!"
if (test-path -Path "\\$srv\C$\zabbix_agent\")
{
# Удаляем все из каталока агента кроме txt файлов
Remove-Item -Path "\\$srv\C$\zabbix_agent\" -Exclude *.txt -Recurse -ErrorAction SilentlyContinue -WarningAction SilentlyContinue
}
# Копируем каталог с агентом забикса на сервер
Copy-Item -Path $src_folder_zabbix_agent -Destination "\\$srv\C$" -Recurse -Force
$cfg = @("\\$srv\C$\zabbix_agent\conf\zabbix_agent2.win.conf")
foreach ($v in $configvalues.Values)
{
if (($v -match "#") -or ($v -match "HostMetadata"))
{
Add-Content -Path $cfg -Value ""
}
Add-Content -Path $cfg -Value $v
}
Add-Content -Path $cfg -Value ""
Add-Content -Path $cfg -Value @("Hostname=$srv")
#Устанавливаем службу агента забикса
$res = Invoke-Command -ComputerName $srv -ScriptBlock {
Invoke-Expression -Command:'c:\windows\system32\cmd.exe /c "c:\zabbix_agent\bin\win64\zabbix_agent2.exe --config C:\zabbix_agent\conf\zabbix_agent2.win.conf --install"'
} -Verbose -ErrorAction SilentlyContinue
if ($res -match 'installed successfully')
{
Add-WriteLog -logpath "$mypath\Log" -logname $namelog -text "Successfully Installed Zabbix Agent on $srv"
Add-WriteLog -logpath "$mypath\Log" -logname $namelog -text "Start UP Zabbix Agent on $srv"
Write-Output "Successfully Installed Zabbix Agent on $srv"
Write-Output "Startup Zabbix Agent on $srv"
Get-Service -Name "$serviceName*" -ComputerName $srv | Start-Service
}
ELSEIF ($res -match 'already exists')
{
Add-WriteLog -logpath "$mypath\Log" -logname $namelog -text "Zabbix Agent Already Exists on $srv"
Write-Output "Zabbix Agent Already Exists on $srv"
Write-Output $res
Get-Service -Name "$serviceName*" -ComputerName $srv | Start-Service
}
ELSE {
Add-WriteLog -logpath "$mypath\Log" -logname $namelog -text "ERROR: Zabbix Agent not installed on $srv"
Add-WriteLog -logpath "$mypath\Log" -logname $namelog -text $res
Write-Output "ERROR: Zabbix Agent not installed on $srv"
Write-Output $res
}
}
}
else {
Add-WriteLog -logpath "$mypath\Log" -logname $namelog -text "The server [$srv] is unavailable!"
Write-Output "The server [$srv] is unavailable!"
}
}
Add-WriteLog -logpath "$mypath\Log" -logname $namelog -text "End script"