Ad Widget

Collapse

HostnameItem=system.run[...]

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • prostrelov
    Senior Member
    • May 2012
    • 115

    #1

    HostnameItem=system.run[...]

    Требуется через агент автоматически получать FQDN хоста чтобы не
    прописывать в каждом zabbix_agentd.conf имя хоста руками
    и чтобы не было путаницы при одинаковых system.hostname но разных
    доменах.

    Есть такой вариант реализаци:
    zabbix_agentd.conf
    EnableRemoteCommands=1
    HostnameItem=system.run[c:\windows\zabbix\dns_name.bat]

    dns_name.bat
    Code:
    @echo off
    ping -n 1 localhost 1>1.log
    For /F "tokens=4" %%i in ('findstr /C:"[127.0.0.1]" 1.log') do Set FULLNAME=%%i
    if '%FULLNAME%' == '' (goto :step2 
    ) else (Echo %FULLNAME%)
    :step2
    For /F "tokens=4" %%i in ('findstr /C:"[::1]" 1.log') do Set FULLNAME=%%i
    Echo %FULLNAME%
    но проблема заключается в том что в eng винде в лог идёт строка
    Pinging test2003 [127.0.0.1] with 32 bytes of data:

    а в rus винде
    Обмен пакетами с S324.mgs.ru [::1] с 32 байтами данных:

    соответственно tokens будет иметь разное значение для разных языков ОС.

    Пробовали сначало выбирать первое слово и если оно == Pinging делать рызне проверки, но упёрлись в выбор 1й строки средствами cmd.

    Если кто сталкивался подскажите пожалуйста как получить из
    текстовика только 1ю строку не через искомое слово или символ.

    Или возможно есть вариант получить FQDN способом проще ?
  • RPovorov
    Junior Member
    • Jan 2013
    • 20

    #2
    а почему бы не получить имя через повершелл?
    powershell $env:computername
    для клиента нужно не fqdn, а netbios имя
    А еще тут https://www.zabbix.com/documentation...indows_agent?s[]=hostname
    фигурирует такая запись: HostnameItem=system.hostname[host]
    Last edited by RPovorov; 06-02-2013, 19:44.

    Comment

    • prostrelov
      Senior Member
      • May 2012
      • 115

      #3
      powershell $env:computername
      возвращает только netbios имя а не fqdn
      system.hostname[host] - также возвращяет только имя хоста без доменной части.

      Comment

      • pavelikus
        Junior Member
        • Jan 2015
        • 4

        #4
        Понимаю, что поздно отписываюсь, но ...
        гугл сразу же дал мне эту страничку, ну вот и напишу как я решил подбную проблему.

        Используя WiX скомпилировал инсталлятор, инструкции инсталлятора:
        • сначала распаковка в папку %PROGRAMFILES%
        • потом средствими WiX установка службы
        • далее средствами VBS дополнил функционал:
        • по веткам реестра узнается FQDN (см. скрипт)
        • и запуск сервиса после удачной установки

        скомпилированный msi устанавливал в сети через GPO
        Code:
        'автор pavelik
        'дата 28.12.11
        'программа читает из реестра имя компьютера и домен
        'после открывает на запись файл zabbix_agentd.conf
        'и указывает параметр hostname=Name.Domain
        
        'чтение и вывод связки Hostname+Domain в файл
        
        Sub ChangeHostComp()
        
        On Error Resume Next
        
        Set wshShell = CreateObject( "WScript.Shell" )
        'Set objArgs = WScript.Arguments
        Set FSO   = CreateObject( "Scripting.FileSystemObject" )
        
        NameConfig = Session.TargetPath("SRC") & "conf\hostname.conf"
        LogFile = Session.TargetPath("SRC") & "install.log"
        'где читать значение имени компьютера
        strRegValue = "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Hostname"
        'где читать значение домена
        strRegValue2 = "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Domain"
        
        
        strHostName = wshShell.RegRead( strRegValue )
        strHostName2 = wshShell.RegRead( strRegValue2 )
        
        'если второй параметр не читаем то переменной присваем значение первого и закрываемся
        if strHostName2="" Then
            PHostname=LCase(strHostName)
        else
        	PHostname=LCase(strHostName) & "." & strHostName2
        end if
        
        
        'открываем для записи
        Set f1 = fso.OpenTextFile(NameConfig,2)
        f1.WriteLine("Hostname=" & PHostName)
        f1.close
        
        Set f1 = fso.CreateTextFile(LogFile)
        f1.WriteLine("-- Instruction function ChangeHostComp() --")
        f1.WriteLine("NameConfig=" & NameConfig)
        f1.WriteLine("strRegValue=" & strRegValue)
        f1.WriteLine("strRegValue2=" & strRegValue2)
        f1.WriteLine("PHostname=" & PHostname)
        f1.WriteLine("Log=" & LogFile)
        f1.close
        
        End Sub
        
        'pavelik
        '12/12/14
        'Дабавляем в файл zabbix_agent.conf строку в конец файла в которой прописан путь к
        'каталогу с конфигами, он находится по пути conf\*.conf
        
        Sub AddPathToConFiles()
        'On Error Resume Next
        
        Set wshShell = CreateObject( "WScript.Shell" )
        'Set objArgs = WScript.Arguments
        Set FSO2   = CreateObject( "Scripting.FileSystemObject" )
        
        NameConfig2 = Session.TargetPath("SRC") & "zabbix_agentd.conf"
        LogFile = Session.TargetPath("SRC") & "install2.log"
        
        'открываем для чтения
        Set f2 = fso2.OpenTextFile(NameConfig2,1)
        StrAdd = f2.ReadAll()
        f2.close
        'открываем для записи
        Set f2 = fso2.OpenTextFile(NameConfig2,2)
        ' Добавляем в конец файл путь к каталогу с конфигами
        StrAdd = StrAdd & vbCrLf & "Include=" & Session.TargetPath("SRC") & "conf\*.conf"
        f2.Write(StrAdd)
        f2.close
        
        
        Set f3 = fso2.CreateTextFile(LogFile)
        f3.WriteLine("-- Instruction function AddPathToConFiles() --")
        f3.WriteLine("NameConfig=" & NameConfig2)
        'f3.WriteLine("StrAdd=" & "include=" & Session.TargetPath("SRC") & "conf\*.conf")
        f3.WriteLine("Log=" & LogFile)
        f3.close
        
        End Sub
        
        Sub StartService()
        strComputer = "."
        Set objWMIService = GetObject("winmgmts:" _
            & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
        
        Set colServiceList = objWMIService.ExecQuery _
            ("Select * from Win32_Service where Name='Zabbix Agent'")
        
        For Each objService in colServiceList
            errReturn = objService.StartService()
        Next
        End Sub
        Почему не использовал такой вот популярный powershell? Да все просто ... он до сих пор не блестит производительностью, VBS гораздо шустрее проводит интерпретацию, вдобавок обязательно должен быть установлен Framework.
        Парк ПК на winXP до сих пор приличный, а влезать в дебри WiX, чтобы устанавливать зависимости - не было не желания ни времени.

        Comment

        • Akella0
          Junior Member
          • Jul 2014
          • 21

          #5
          Апну тему, вдруг кому интересно такое решение.

          BAT-скриптик получает FQDN хоста через HostnameItem, минимум итераций, должен работать на любом языковом пакете любой популярной винды (тестил 2003r2 ru, 2008 en, win7 ru).
          Нейтрален, если хост - гейтвей (нужно задать подсеть со стороны Zabbix и DNS) и если хосту задано множество IP из одной подсети и если на интерфейсе есть включенный IPv6.

          Code:
          @echo off
          REM written by Akella
          REM This script for Zabbix agent, where HostnameItem sets host FQDN.
          REM Use HostnameItem=system.run[fullpath]
          
          
          set subnet={
          
          REM if host gateway or smth else uncomment below
          REM set subnet=192.168.
          
          REM not defined
          REM find one of local IPv4 addresses {"aaa.bbb.ccc.ddd"} in subnet (find "{" or IP-subnet uncommented). Parse them to normal and set 1st of all. 
          set ip=
          for /F "tokens=1 delims={,}" %%A IN ('wmic nicconfig get ipaddress ^| find "%subnet%"') DO if not defined ip set ip=%%~A 
          
          REM not defined
          REM use nslookup to resolve oneself. Search not empty lines, skip 2 lines
          set dns=
          for /F "tokens=2" %%B IN ('nslookup %ip% 2^>NUL ^| find ":" ^| more /E +2') DO if not defined dns set dns=%%~B 
          echo %dns%
          powershell пробовал, но короче все равно не получается. Batch быстрее.
          Last edited by Akella0; 02-03-2015, 21:04.

          Comment

          Working...