Ad Widget

Collapse

Массовое обновление zabbix_agentd.conf на Linux и Windows

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • sperr0w
    Member
    • Oct 2014
    • 44

    #1

    Массовое обновление zabbix_agentd.conf на Linux и Windows

    Добрый день!

    Подскажите, у кого как реализовано массовое изменение конфигов для Zabbix?

    Например, нужно добавить новый UserParameter в конфиг на всех серверах.

    Поделитесь скриптами?
  • yukra
    Senior Member
    • Apr 2013
    • 1359

    #2
    Originally posted by sperr0w
    Добрый день!

    Подскажите, у кого как реализовано массовое изменение конфигов для Zabbix?

    Например, нужно добавить новый UserParameter в конфиг на всех серверах.

    Поделитесь скриптами?
    Я просто храню конфиг в SVN (один на всех) и в нем есть строчка
    Code:
    ...
    Include=/etc/zabbix/zabbix_hostname.conf
    ...
    , а zabbix_hostname.conf делается путем выполнения команды
    Code:
    echo Hostname=`hostname` > /etc/zabbix/zabbix_hostname.conf
    , обновление заключается в "svp up && service zabbix-agent restart" (в нужной директории от нужного пользователя).

    Comment

    • sperr0w
      Member
      • Oct 2014
      • 44

      #3
      Может у кого нибудь есть вариант без svn?

      Comment

      • lopaka
        Junior Member
        • Dec 2013
        • 15

        #4
        Originally posted by sperr0w
        Может у кого нибудь есть вариант без svn?
        Был скрипт, не найду уже где (сборник костылей )

        Суть его такова:
        создаем на машинке с заббиксом дополнительный сайт в аппаче;
        на этом сайте у нас будут лежать архив с заббиксом + 7za.exe;
        смотрим заббиксом md5 zabbix.rar, как только тот изменяется посылаем удаленные команды по хостам.


        на хостах останавливается сервис агента
        бэкапится текущий zabbix (создавая ограниченное количество бекапов и затирая старые);
        скрипт скачивает архив (если нет 7za на хосте, то и его тоже)
        заливается новый zabbix из архива поверх текущего, и стартуется сервис агента

        если найду, то скину)

        Comment

        • sperr0w
          Member
          • Oct 2014
          • 44

          #5
          Originally posted by lopaka
          если найду, то скину)
          Было бы здорово.

          А никто не встречался со способом того, как на куче агентов отредактировать конфиг и записать новые скрипты в папку scripts?

          или как алтернатива - на шаре держать копии заббикс агентов со всех серверов и чтобы удаленные хосты периодически проверяли изменения (Или на самом сервере заббикса крутился бы скрипт, который мониторил изменения в файлах и отправлял их на удаленные клиенты) в этих копиях, и при обнаружении изменений, копировали себе файлы с изменениями.

          Comment

          • lopaka
            Junior Member
            • Dec 2013
            • 15

            #6
            Originally posted by sperr0w
            Было бы здорово.

            А никто не встречался со способом того, как на куче агентов отредактировать конфиг и записать новые скрипты в папку scripts?

            или как алтернатива - на шаре держать копии заббикс агентов со всех серверов и чтобы удаленные хосты периодически проверяли изменения (Или на самом сервере заббикса крутился бы скрипт, который мониторил изменения в файлах и отправлял их на удаленные клиенты) в этих копиях, и при обнаружении изменений, копировали себе файлы с изменениями.
            а что мешает иметь одну копию заббикс агента, и деплоить ее на все хосты?

            Comment

            • khodus
              Junior Member
              • Jun 2015
              • 14

              #7
              Originally posted by lopaka
              а что мешает иметь одну копию заббикс агента, и деплоить ее на все хосты?
              Ну как же, в каждом конфиге уникальный hostname надо прописывать чтобы его сервер нашел.

              Присоединяюсь к теме!

              На виндовых серваках все просто, если есть доменная учетка - пишется батник который ходит в нужную папку по всем сервакам и правит конфиг. Примера такого скрипта нет, но написать не сложно.

              На линуховых массового апдейта не делал, но пачки серверов штук по 30 настраивал. И, на некоторые серваки доступ только через VPN, потому все настраивал через SSH.

              1. Запаковал в архив бинарники + скрипт для настройки
              2. Раскидал с помощью scp zabbix.tar.gz @hostname:~ на серваки архив по ssh
              3. Запускаю скрипт по настройки из домашней директории:
              (предполагается что там будет создана папка zabbix в которой будет лежать агент)

              Code:
              #/bin/bash
              
              #задаем путь к домашней директории (в интерактивном режиме) 
              
              echo -n set home directory:
              read home
              
              #переходим в директорию zabbix и создаем скрипты запуска/остановки агента
              
              cd ~/zabbix
              touch agent.start.sh
              chmod 755 agent.start.sh
              echo "#/bin/bash" > agent.start.sh
              echo "$home/zabbix/bin/zabbix_agentd -c $home/zabbix/config/zabbix_agentd.conf" >> agent.start.sh
              
              touch agent.stop.sh
              chmod 755 agent.stop.sh
              echo "#/bin/bash" > agent.stop.sh
              echo "for pid in \$(ps -ef | grep zabbix_agent | awk '{print \$2}' | grep -v grep); do kill -9 \$pid; done;" >> agent.stop.sh
              
              #выдаем права на запуск бинарникам
              cd bin/
              chmod 755 zabbix_agentd
              
              #создаем файл конфига для агента
              cd ../config
              touch zabbix_agentd.conf
              
              #далее заполняем конфиг
              
              #в интерактивном режиме вводим ip адрес zabbix_server
              
              echo -n set zabbix server ip for connect:
              read server
              
              echo Server=$server > zabbix_agentd.conf
              echo ListenPort=10500 >> zabbix_agentd.conf
              
              #в интерактивном режиме указываем скрипту hostmane сервера агента
              
              echo -n set param hostname for this server:
              read hostname
              
              echo Hostname=$hostname >> zabbix_agentd.conf
              echo StartAgents=5 >> zabbix_agentd.conf
              echo DebugLevel=4 >> zabbix_agentd.conf
              echo PidFile=$home/zabbix/log/zabbix_agent.pid >> zabbix_agentd.conf
              echo LogFile=$home/zabbix/log/zabbix_agentd.log >> zabbix_agentd.conf
              echo Timeout=30 >> zabbix_agentd.conf
              echo "#UserParameter=script_name[*],scriptpath.sh $1" >> zabbix_agentd.conf
              cd ../log
              touch zabbix_agent.pid
              touch zabbix_agentd.log
              cd ..
              
              sh agent.stop.sh
              sh agent.start.sh
              Не исключаю что есть более адекватные решения, просто мне быстрее было написать чем рыть весь интернет. Если знаете другие поделитесь.

              Comment

              • lopaka
                Junior Member
                • Dec 2013
                • 15

                #8
                Originally posted by khodus
                Ну как же, в каждом конфиге уникальный hostname надо прописывать чтобы его сервер нашел.
                Code:
                ### Option: HostnameItem
                #       Item used for generating Hostname if it is undefined. Ignored if Hostname is defined.
                #       Does not support UserParameters or aliases.
                #
                # Mandatory: no
                # Default:
                # HostnameItem=system.hostname

                Comment

                • sadman
                  Senior Member
                  • Dec 2010
                  • 1611

                  #9
                  А если раскидывать общий .conf с include персонального? В последнем уже hostname, hostmetadada и проч.

                  Упс... Пост не читай, ответ сразу пиши ))

                  Comment

                  • khodus
                    Junior Member
                    • Jun 2015
                    • 14

                    #10
                    Хм, надо будет попробовать!

                    Comment

                    • aydar
                      Senior Member
                      • Dec 2014
                      • 176

                      #11
                      я пока сделал так, сделал действие

                      и скачиваю свежий конфиг с сервера заббикса по хттп через повершелл.

                      но есть минусы, повершелл нужен от 3.0

                      если есть у кого-то более универсальные решения, прошу поделится.

                      Comment

                      • Akella0
                        Junior Member
                        • Jul 2014
                        • 21

                        #12
                        Я делал Active agent с использованием DNS.


                        Все win-хосты должны иметь свое имя в DNS. Это нужно для уникального HostnameItem.

                        Написан скрипт FQDN для запроса собственного имени машины у DNS. Это и есть параметр HostnameItem.

                        Существует 2 конфига заббикса - базовый для обнаружения (passive) и индивидуальный (active). Реализованы в виде SFX-RAR za_setup.exe и za_build_xxx.exe

                        На zabbix поднят FTP с шарой, где лежат оба .exe и win-сценарий апдейта. Сценарий использует штатный ftp и штатный планировщик at для перезапуска.

                        Также на zabbix идет проверка билда файла на этой шаре.

                        Как работает:
                        билды задаются вручную, в названии файла и в .conf агентов. Триггеры сравнивают значение макроса #BUILD с файлами на шаре, скаченными с шары и внутри .conf.

                        Разница версий с шарой выдает лишь предупреждение.
                        Разница версий со скаченным на винду вызывает Действие для удаления/закачки нового.
                        Разница версий с conf вызывает Действие, которое запускает сценарий полного апдейта с перезапуском сервиса.

                        Результат:
                        Пихаем в SFX-архив любые скрипты, настройки, параметры. Все это задеплоится.
                        После смены значения макроса все агенты начинают процедуру обновления. Если нет проблем с DNS, то все гладко и 50-100-1000 агентов обновятся в пределах 5 минут.
                        При добавлении новой машины с базовым конфигом она автоматически добавится в Заббикс, подцепит свои шаблоны и обновится.

                        Довольно много костылей. Зато используются штатные средства WinXP-Win10 / Zabbix и в условиях отсутствия AD.

                        Костыли обусловлены тем, что я не нашел простого способа узнать DNS-имя машины. Я не нашел простого способа сделать рестарт сервиса Windows. Действия без активного агента не работают.
                        Last edited by Akella0; 27-06-2015, 10:03.

                        Comment

                        • zmdpc
                          Senior Member
                          • Oct 2014
                          • 484

                          #13
                          Может powershell поможет ?
                          http://habrahabr.ru/company/netwrix/blog/164731/

                          Comment

                          • allburov
                            Junior Member
                            • Sep 2015
                            • 1

                            #14
                            PowerShell поможет

                            Originally posted by zmdpc
                            Может powershell поможет ?
                            http://habrahabr.ru/company/netwrix/blog/164731/
                            У нас реализован вот такой костыль (добавляет только новые userpamamentrs)
                            Code:
                            $ShopServers=Get-ADComputer -Filter * -SearchBase (Get-NormalOUpath "domain.com/OU_MAIN/MyServers")
                            
                            $seachstrs="kassy.discovery","scales.discovery1","zbxuserparam"
                            
                            foreach ($seachstr in $seachstrs){
                                foreach ($shopserver in $ShopServers){
                            
                                    $servername=$shopserver.name
                                    if ((get-service -Name *zabbix*) -eq $null)
                                    {
                                        Write-Debug "Zabbix Server not found on $servername"
                                    }
                            
                                    $containsstr=$false
                                    $filepath64="\\$servername\c$\Program Files\Zabbix Agent\zabbix_agentd.conf"
                                    $filepath=$filepath64
                                    $filepath32="\\$servername\c$\Program Files (x86)\Zabbix Agent\zabbix_agentd.conf"
                            
                                    if (Test-Path $filepath64){
                                            get-content $filepath64 | Where-Object {$_ -like "*$seachstr*"} | %{$containsstr=$true}
                                     }
                                     elseif (Test-Path $filepath32){
                                        get-content $filepath32 | Where-Object {$_ -like "*$seachstr*"} | %{$containsstr=$true}
                                        $filepath=$filepath32
                                     }
                                     else
                                     {
                                        Write-Debug "Not file on $servername"
                                        break;
                                     }
                                 
                                     if ($containsstr)
                                     {} 
                                     else
                                     { echo "$servername add $seachstr";
                                        if ($seachstr -eq "kassy.discovery")
                                        {
                                            'UserParameter=kassy.discovery, type "c:\ZBX\ZBX\kassy.conf"' |out-file $filepath -Encoding ascii -append
                                        }
                                        if ($seachstr -eq "scales.discovery1")
                                        {
                                            'UserParameter=scales.discovery1, type "c:\ZBX\ZBX\scales.conf"' |out-file $filepath -Encoding ascii -append
                                        }
                                        if ($seachstr -eq "zbxuserparam")
                                        {
                                            'UserParameter=zbxuserparam, echo 1' |out-file $filepath -Encoding ascii -append
                                        }
                                        Get-Service -Name *zabbix* -ComputerName $servername | Restart-Service
                                     }
                                }
                            }

                            Comment

                            • aydar
                              Senior Member
                              • Dec 2014
                              • 176

                              #15
                              Как сделано пока у меня для Win

                              У нас есть сервера, которые в домене и не. обновил везде shell до 3
                              единственный минус моего решения пока, то что на xp, win2003 данный скрипт не отрабатывает, тк там не получается обновить pshell до 3, но таких серверов очень мало у меня. Костылей особых нету

                              собственно сам скрипт

                              Code:
                              %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe  -NoProfile -ExecutionPolicy Bypass -command "Copy-Item -Path 'C:\Program Files\zabbix\conf\zabbix_agentd.win.conf' -Destination 'C:\Program Files\zabbix\conf\zabbix_agentd.win.conf.bac' -Force ; Invoke-WebRequest -uri http://ипзсервер/zabbix/file_agent/zabbix_agentd.win.conf -OutFile 'C:\Program Files\zabbix\conf\zabbix_agentd.win.conf' ; Get-Service -Name 'Zabbix Agent' | Restart-Service"
                              1. Делает бекап конфига
                              2. Скачивает его по http
                              3. Перегружает Агента

                              Единственное, пока не знаю как сравнивать даты обновления конфига на серваке и хосте, может даже не даты, а например кол-во символов
                              Last edited by aydar; 30-09-2015, 10:49.

                              Comment

                              Working...