Автоматическое добавление доменных компьютеров в Icinga2

Main

Оценка: 85.4% - 15 Голосов

Общая

Не так давно мне понадобилось поставить все пользовательские доменные компьютеры на мониторинг в Icinga2 и так, как компьютеров много, то вариант добавлять их в ручную сразу же отпадает.

Для использования данных скриптов необходимо настроить Icinga2 для работы с Windows машинами. Как это сделать можно прочитать в "Безагентный мониторинг Windows систем".

 Так же для работы понадобится развёрнутый FTP сервер и максимально заполненные данные о пользователях в их доменных учётных записях.

 

Подготовка доменных компьютеров к постановки на мониторинг

Для автоматического получения полноты информации о компьютере и его владельце в организации нам необходимо в каждой учётной записи компьютера в домене,  заполнить поле "Управляется" нажатием кнопки изменить и выбора владельца и учётных записей пользователей домена.

domain1

 
 Скрипт для создания файла с данными о компьютерах

После того, как свойство "Управляется" заполнено необходимо поставить, на домен-контроллере или ином доменном сервере, в планировщике задач на выполнение следующий скрипт на 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 мы увидим отдельную группу с перечисленными компьютерами, в именах которых будет вся информация о них

icinga

 

 

 

Добавить комментарий


Logo