Существует 2 способа конфигурации агента:
В динамическую конфигурацию намеренно вынесены только безопасные параметры, изменение которых не может привести к неработоспособности агента.
В статической конфигурации присутствуют параметры:
Поэтому параметры статической конфигурации, не представленные в динамической конфигурации необходимо изменять с большой осторожностью.
Для применения новых значений статической конфигурации необходимо выполнить перезапуск службы агента.
Рекомендованный способ по работе с параметрами статической конфигурации:
ручное изменение параметров на одной выделенной машине в период пилотного тестирования или как первый этап промышленного развертывания Зодиак.АйТиЭм
тестирование всего функционала для проверки корректности параметров
первичная массовая установка агентов на все целевые машины уже с измененными параметрами
После определения необходимых параметров статической конфигурации при массовой установке агентов эти параметры могут быть растиражированы одним из двух способов:
путем создания файла конфигурации agent.ini до или после установки агента
путем их передачи непосредственно в инсталлятор агента
Любой параметр статической конфигурации может быть передан в инсталлятор агента Зодиак.АйТиЭм на этапе его установки.
Для инсталлятора MSI передача параметров осуществляется путем дописывания их как аргументов msiexec, например:
msiexec /i agent.msi ZDC_SET_SERVER_URL=https://192.168.1.37:3001 ZDC_SET_SERVER_INTERVAL=600
Именование аргументов msiexec осуществляется следующим образом:
<префикс ZDC_SET_> <имя секции> <имя параметра>
На основании переданных параметров инсталлятор агента автоматически создаст файл конфигурации с секциями и параметрами.
Например, если запустить инсталлятор агента с параметрами:
msiexec /i agent.msi ZDC_SET_SERVER_URL=https://192.168.1.37:3001 ZDC_SET_SERVER_INTERVAL=600 ZDC_SET_SCATTER_DOWNLOADER=fred
инсталлятор создаст конфигурационный файл agent.ini со следущим содержимым:
[Server]
url=https://192.168.1.37:3001
interval=600
[Scatter]
downloader=fred
Для инсталляторов в форматах RPM и DEB не существует такого понятия, как передача параметров установки. Это связано с тем, что в большинстве случаев такие инсталляторы устанавливаются массово при помощи пакетных менеджеров, многие пакеты являются зависимостями других пакетов, поэтому разработчики Linux не предусматривают конфигурирование на этапе установки для уменьшения сложности этого процесса.
Однако для инсталляторов Зодиак.АйТиЭм для ОС семейства Linux предусмотрен способ конфигурирования на этапе установки, симметричный инсталляторам в формате MSI - при помощи переменных окружения.
Для этого перед запуском инсталлятора агента необходимо задать переменные окружения, например в той же строке установки:
env ZDC_SET_SERVER_URL=https://192.168.1.45:3001 sudo -E apt install ./zodiac.agent.linux.deb
Именование переменных окружения полностью эквивалентно именованию аргументов msiexec и осуществляется следующим образом:
<префикс ZDC_SET_> <имя секции> <имя параметра>
На основании переданных переменных окружения инсталлятор агента автоматически создаст файл конфигурации с секциями и параметрами.
Например, если запустить инсталлятор агента с переменными окружения:
env ZDC_SET_SERVER_URL=https://192.168.1.45:3001 env ZDC_SET_SERVER_INTERVAL=600 env ZDC_SET_SCATTER_DOWNLOADER=fred sudo -E apt install ./zodiac.agent.linux.deb
инсталлятор создаст конфигурационный файл agent.ini со следущим содержимым:
[Server]
url=https://192.168.1.37:3001
interval=600
[Scatter]
downloader=fred
Если несмотря на рекомендованный способ однократного задания всех параметров на этапе установки требуется выполнить массовую модификацию всех конфигурационных файлов агентов (например, по причине допущенной ошибки) и при этом агенты находятся в рабочем состоянии, то данную модификацию можно выполнить средствами Зодиак.АйТиЭм - при помощи механизма скриптов.
Главной сложностью при модификации файла агента из скрипта, запускаемого самим агентом, является корректный перезапуск его службы после внесения изменений в конфигурационный файл.
Поскольку такой скрипт перезапускает свою родительскую службу - служба агента не будет фиксировать такой запуск скрипта как законченный. Таким образом, даже при выборе триггера прерывания "После первого запуска" в параметрах скрипта - скрипт будет исполняться бесконечно, до его отключения в веб-консоли, что в свою очередь будет приводить к регулярному перезапуску службы агента.
При написании подобного скрипта его необходимо оформлять как Complience-скрипт, т.е. проверять, что текущее состояние не соответствует целевому и только в этом случае выполнять компенсирующие действия.
Пример подобного скрипта для PowerShell приведен ниже:
##################################################
# Путь до файла конфигурации.
$path = "C:\ProgramData\Zodiac\agent\agent.ini"
# Имя службы агента.
$sname = "Zodiac.Agent"
# Имя задачи планировщика задач для перезапуска агента.
$tname = "Zodiac Agent Automatic Restart"
# Целевое содержимое файла конфигурации.
$config = @'
[Server]
url=https://leonov.keenetic.pro:3001/
[Scatter]
downloader=fred
'@
##################################################
# Кодировка UTF-8 без BOM.
$UTF8NoBom = New-Object System.Text.UTF8Encoding $False
# Читаем текущее содержимое файла.
$current = [IO.File]::ReadAllText($path, $UTF8NoBom);
# Если текущее состояние конфигурации не совпадает с целевым.
if ($current -ne $config) {
# Перезаписываем файл целевым содержимым.
[IO.File]::WriteAllText($path, $config, $UTF8NoBom);
# Создаем задание планировщика для перезапуска службы (без триггеров, только ручной запуск).
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -WindowStyle Hidden -ExecutionPolicy ByPass -Command `"Restart-Service $sname -Force`""
Register-ScheduledTask -TaskName $tname -Description "Автоматический перезапуск службы агента Зодиак.АйТиЭм при изменении конфигурации." -User "System" -Action $action -Force
# Запускаем созданное задание планировщика.
Start-ScheduledTask -TaskName $tname
}
# Получаем службу.
$service = Get-WmiObject -ClassName Win32_Service -Property ProcessId -Filter "Name='$sname'"
# Получаем процесс службы.
$process = [Diagnostics.Process]::GetProcessById($service.ProcessId)
# Возвращаем дату/время модификации файла и время старта службы.
return @{
mtime = [IO.File]::GetLastWriteTimeUtc($path).ToString("yyyy-MM-ddTHH:mm:ss.fffZ", [Globalization.CultureInfo]::InvariantCulture);
stime = $process.StartTime.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ", [Globalization.CultureInfo]::InvariantCulture);
}
Данный скрипт адресует следующие особенности задачи и языка PowerShell:
Скрипт выполняет модификацию файла конфигурации и перезапуск службы только если конфигурационный файл отличается от необходимого (if ($current -ne $config)). Таким образом, повторные запуски этого скрипта не будут приводить к регулярному перезапуску службы, даже без использования Триггера прерывания в настройках скрипта.
Скрипт выполняет перезапуск службы при помощи задачи Планировщика задач Windows. Стандартный командлет Restart-Service сначала выполняет останов службы, а затем ее запуск. При запуске такого скрипта из агента данный командлет выполнит останов службы агента, в результате которого прервется и сам скрипт, и командлет Restart-Service. При этом запуск службы не будет выполнен. Оформление перезапуска как задания Планировщика позволяет решить данную проблему.
Скрипт выполняет чтение и запись конфигурационного файла агента в кодировке UTF-8 без BOM. Стандартные командлеты Get-Content и Set-Content выполняют чтение и запись файлов в кодировке UTF-8 с BOM. Файлы в такой кодировке считаются агентом ошибочными.
Скрипт выполняет перезапись конфигурационного файла целиком, а не замену отдельных его строк при помощи Select-String -Pattern или других механизмов PowerShell. При замене частей файла высок риск получения некорректных результатов, если изначальный файл на машине создавался вручную, содержал закомментированные строки и пр.
Скрипт вне зависимости от того, перезаписывал он файл и перезапускал ли он службу, возвращает результат как данные инвентаризации. Возвращаемые скриптом параметры: mtime - дата/время модификации файла конфигурации в UTC и stime - дата/время запуска службы агента.
Пример оформления скрипта как элемента директивы приведен ниже:

Настройки скрипта:

Анализ результатов, возвращаемых скриптом можно произвести в "сыром" виде, воспользовавшись кнопками "Статистика" в окне его создания:

и "Результаты":

Для получения расширенных инструментов анализа результатов исполнения данного скрипта можно создать Выборку и Представление в веб-консоли Зодиак.АйТиЭм.
Выборка
При создании выборки выбрать колонки:


В настройках выборки задать Имя в БД: agent_config_mod и тип всех колонок String:

Представление
При создании представления использовать следующий запрос SQL:

SELECT
hostname,
timezone('utc', mtime::TIMESTAMPTZ) as mtime,
timezone('utc', stime::TIMESTAMPTZ) as stime
FROM public.agent_config_mod
В настройках столбцов задать описания столбцов на русском языке и тип данных DateTime для столбцов mtime и stime:

После сохранения и открытия представления будет выполняться автоматическое преобразование времен во временную зону браузера, появится более дружественная возможность фильтрации по колонкам mtime и ctime:
