Автоматическое добавление доменных компьютеров в Icinga2
Общая
Не так давно мне понадобилось поставить все пользовательские доменные компьютеры на мониторинг в Icinga2 и так, как компьютеров много, то вариант добавлять их в ручную сразу же отпадает.
Для использования данных скриптов необходимо настроить Icinga2 для работы с Windows машинами. Как это сделать можно прочитать в "Безагентный мониторинг Windows систем".
Так же для работы понадобится развёрнутый FTP сервер и максимально заполненные данные о пользователях в их доменных учётных записях.
Подготовка доменных компьютеров к постановки на мониторинг
Для автоматического получения полноты информации о компьютере и его владельце в организации нам необходимо в каждой учётной записи компьютера в домене, заполнить поле "Управляется" нажатием кнопки изменить и выбора владельца и учётных записей пользователей домена.
Скрипт для создания файла с данными о компьютерах
После того, как свойство "Управляется" заполнено необходимо поставить, на домен-контроллере или ином доменном сервере, в планировщике задач на выполнение следующий скрипт на PowerShell (скачать скрипт текстовым файлом):
del c:\Temp\*.csv
function Write-Log
{
[CmdletBinding()]
Param
(
[Parameter(Mandatory=$true,
ValueFromPipelineByPropertyName=$true)]
[ValidateNotNullOrEmpty()]
[Alias("LogContent")]
[string]$Message,
[Parameter(Mandatory=$false)]
[Alias('LogPath')]
[string]$Path='C:\Temp\PowerShellLog.log',
[Parameter(Mandatory=$false)]
[ValidateSet("Error","Warn","Info")]
[string]$Level="Info",
[Parameter(Mandatory=$false)]
[switch]$NoClobber
)
Begin
{
$VerbosePreference = 'Continue'
}
Process
{
if ((Test-Path $Path) -AND $NoClobber) {
Write-Error "Log file $Path already exists, and you specified NoClobber. Either delete the file or specify a different name."
Return
}
elseif (!(Test-Path $Path)) {
Write-Verbose "Creating $Path."
$NewLogFile = New-Item $Path -Force -ItemType File
}
else {
}
$FormattedDate = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
# Write message to error, warning, or verbose pipeline and specify $LevelText
switch ($Level) {
'Error' {
Write-Error $Message
$LevelText = 'ERROR:'
}
'Warn' {
Write-Warning $Message
$LevelText = 'WARNING:'
}
'Info' {
Write-Verbose $Message
$LevelText = 'INFO:'
}
}
# Write log entry to $Path
"$FormattedDate $LevelText $Message" | Out-File -FilePath $Path -Append
}
End
{
}
}
$global:Path = 'C:\Temp\MyLogFile.log'
$ComputerList = get-adcomputer -Filter {(Name -like "WS-*")} -SearchBase "OU=ИМЯ-ГРУППЫ,OU=ИМЯ-ГРУППЫ,DC=ИМЯ-ДОМЕНА,DC=local" -properties Name,DNSHostName,Managedby | select Name,DNSHostName,@{n="Managedby";e={($_.Managedby)}},@{n="Username";e={($_.Managedby -split ",*..=")[1]}}
$Output = @()
foreach ($PC in $ComputerList) {
$PcName = $PC.Name
Write-Log -Message "Get computer name in AD [$($PcName)]"
$DNSHostName = $PC.DNSHostName
Write-Log -Message "Get computer DNS name [$($DNSHostName)]"
$Username = $PC.Username
Write-Log -Message "Get computer controller username [$($PC.Username)]"
$ManagedBy = $PC.Managedby
Write-Log -Message "Get AD user distinguished name [$($PC.Managedby)]"
if ($ManagedBy) {
$user = get-aduser -identity "$ManagedBy" -Properties Mail,telephoneNumber,physicalDeliveryOfficeName,department,title
$PrimarySMTP = $user.Mail
$Phone = $user.telephoneNumber
$Room = $user.physicalDeliveryOfficeName
$Department = $user.department
$Position = $user.title
$Description = $PcName + ", " + $Position + " " + $Username + ", " + $Department + ", Каб: " + $Room + ", Тел: " + $Phone
Write-Log -Message "Get user info [$($PrimarySMTP)($Phone)($Room)($Department)($Position)]"
$MyObject = New-Object PSObject -Property @{
PcName = $PC.Name -replace "-", ""
ManagedBy = $Username
PrimarySMTP = $PrimarySMTP
Phone = $Phone
Room = $Room
Department = $Department
Position = $Position
DNSHostName = $PC.DNSHostName
Description = $Description
}
}else
{
$MyObject = New-Object PSObject -Property @{
PcName = $PC.Name -replace "-", ""
ManagedBy = ""
PrimarySMTP = ""
Phone = ""
Room = ""
Department = ""
Position = ""
DNSHostName = ""
Description = ""
}
}
$Output += $MyObject
Write-Log -Message "Create File [$($MyObject)]"
}
$Output | select PcName, ManagedBy, PrimarySMTP, Phone, Room, Department, Position, DNSHostName, Description | Export-CSV -delimiter ";" C:\Temp\userpc1.csv -force -NoTypeInformation -Encoding UTF8
Get-Content C:\Temp\userpc1.csv | select -Skip 1 | Set-Content C:\Temp\userpc.csv -Encodin UTF8
Write-Log -Message "Write File [$($Output)]"
$File = "C:\Temp\userpc.csv"
$ftp = 'ftp://ЛОГИН:ПАРОЛЬ@АДРЕС FTP Сервера:21/ПУТЬ/userpc.csv'
$webclient = New-Object System.Net.WebClient
$uri = New-Object System.Uri($ftp)
$webclient.UploadFile($uri, $File)
Так как нам нужны определённые имена компьютеров то в 62 строке скрипта указываем маску фильтра -filter {(Name -like "WS-*")}
и путь до доменной группы, где находятся нужные компьютеры.
В 114 строке, в Export-CSV -delimiter "`t" c:\temp\userpc.csv -Encoding UTF8 -NoTypeInfor
, необходимо указать папку для сохранения файла - эта папка должна быть доступна в сети по протоколу FTP.
Скрипт для создания файла конфигурации Icinga2
Следующим этапом будет автоматическое создание нужного для Icinga2 файла конфигурации.
Для этого понадобится следующий небольшой скрипт на bash (скачать скрипт в текстовом файле):
# Удаляем старые файлы конфигурации
rm /etc/icinga2/userpc.csv
rm /etc/icinga2/userpcbom.csv
rm /etc/icinga2/conf.d/userpc.conf
# Копируем новый сгенерированный файл с FTP сервера
wget -q ftp://логин:пароль@адрес:21/путь_к_csv/userpc.csv /путь_к_csv/userpc.csv
# Обрезаем первые байты для получения таблицы в UTF-8 без BOM
tail --bytes=+4 userpc.csv > userpcbom.csv
# Генерируем новый файл конфигурации для Icinga2 в нужной папке
cat userpcbom.csv | gawk -vFPAT='[^;]*|"[^"]*"' '{print "\nobject Host " $1 " {\naddress = " $8 "\ndisplay_name = " $9 "\ncheck_command = \"hostalive\"\nvars.os = \"Windows_users\"\n}\n\n"}' >> /etc/icinga2/conf.d/userpc.conf
# Перезапуск Icinga2
service icinga2 restart
Для автоматического выполнения добавим его в Cron.
После выполнения данного скрипта в /etc/icinga2/conf.d/
должен появиться файл userpc.conf
c понятном для Icinga2 формате.
Важно подметить, что в Icinga2 у меня был специально подготовлен сервис, и отдельная группа для хостов, нацеленные на переменную vars.os = "Windows_users"
. Как это сделать рассказывается в Безагентный мониторинг Windows систем
После перезапуска сервера Icinga2 мы увидим отдельную группу с перечисленными компьютерами, в именах которых будет вся информация о них
- Просмотров: 8724