Управління некерованим і моніторинг критичного

В чужий монастир зі своїм статутом не ходять. На черговому місці роботи в мої завдання входить створення і подальша підтримка документообігу на платформі Alfresco, попутно ведення інших систем. Заклад із запропонованими правилами, усталеними звичаями і порядками. Багатьох звичних IT речей в інфраструктурі немає, але все працює надійно і всіх влаштовує. Як людина володіє інтелектом і зачатками виховання не буду намагатися порушити чужі традиції і глобально що-небудь міняти. Враховуючи over 500 робочих місць, деякі зауважу не завжди поруч і критичність створюваного сервісу для організації, деякі речі зроблю на свій лад. До них відносяться моніторинг і оркестрация.

Більшість робочих місць розташовується в будівлі на 6 поверхах. Є віддалені робочі місця. Парк адмініструється різними співробітниками, деякі місця ставляться до іншим організаціям та можуть взагалі не мати відповідального за IT співробітника. Глобальна мережа та безпеку в зоні відповідальності спеціально навчених людей. DHCP, DNS, AD якщо і є то не скрізь. ITIL/ITSM просто імпортні літери. Операційні системи WindowsXP, windows vista, Windows7. Робочі місця можуть мігрувати в різні частини будинку або за його межі з обов'язковою зміною IP адреси. Користувачі працюють на комп'ютерах зазвичай з правами адміністратора отже, можуть змінювати все, включаючи %COMPUTERNAME%. Зміну останнього бажано допускати т. к. використовується для загальних принтерів.

Вихідні дані та цілі

Цілі проекту у моніторингу — це перевірка на доступність web додатків, зняття параметрів з побудовою графіків java & postgresql & OS, оповіщення за допомогою rss, sms і голосового дзвінка в критичних випадках.

Основна мета оркестрации — це виключити спілкування з over 500 користувачами. Мати можливість оперативного масового зміни параметрів, встановлення пакетів, сертифікатів і «м'які політики — like GPO».

З урахуванням стратегічних пріоритетів держави, орієнтованість на повне імпортозаміщення, завтра на робочих місцях у користувачів документообігу можуть виявитися МСВСфера або ROSA, відповідно інструменти управління конфігурацією і моніторингу краще мати кросплатформені з відкритим вихідним кодом, веб-інтерфейсом управління та нульовою вартістю впровадження&володіння.

Динамічний DNS

IP адреси ведуться за правилом: 10.будівля.кабін.етрозетка. При зміні дислокації робочого місця, змінюється і IP адресу. Змінюється вручну т. к. DHCP немає, отже option 82 не застосуємо. В інвентарних номерах системних блоків можуть зустрічатися дублікати. Єдине, що щодо незмінно це MAC адресу. До нього і зробимо прив'язку. Визначимо шаблон імені робочого місця як РС-{макбезразделителей}. Якщо на комп'ютері кілька мережевих підключень будемо вважати, що Ethernet буде першим, відразу після інсталяції операційної системи. Його адреса будемо використовувати як константу для %COMPUTERNAME%.

Для роботи з сертифікатами необхідно мати ім'я FQDN (Fully Qualified Domain Name), а з умов випливає, що DNS відсутня. Зручне рішення в даній ситуації динамічний DNS, він зручний для зіставлення %COMPUTERNAME% з IP-адресою і відповідно визначенням поточного місцезнаходження робочого місця, якщо виникне необхідність особистого спілкування з користувачем.

Перше з рішень, для динамічного оновлення DNS зон клієнтом, бачилася утиліта Nsupdate з пакету Bind для Windows, але в цьому випадку клієнти мали спільний ключ і, отже, могли змінювати не тільки свої записи в зоні. Більш безпечним бачилося рішення, коли клієнт відправляє HTTP запит, а сервер за своїми правилами вносить зміни. Спосіб зберігання зон в цьому варіанті очевидний — це SQL база. За замовчуванням налаштований на обслуговування запитів з БД сервер PowerDNS. Він використовується в багатьох великих проектах і представляється досить стабільним. Його і будемо використовувати.

Як встановити на UbuntuВстановлюємо PowerDNS:
$ sudo apt-get install-y pdns-server pdns-backend-mysql

Тестуємо PowerDNS:
Перевіримо, що PowerDNS запущено:
$ sudo netstat-tap | grep pdns
Має видати:
roto@salt:~# netstat-tap | grep pdns

tcp 0 0 *:- *:* LISTEN 891/pdns_server-ins

Перевіримо, що PowerDNS відповідає:
$ sudo dig 127.0.0.1
Має видати:
roto@salt:~# dig 127.0.0.1

; <<>> DiG 9.9.5-3ubuntu0.1-Ubuntu <<>> @127.0.0.1
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21529

;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 2800
;; QUESTION SECTION:
;. IN NS

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Feb 13 11:29:05 KRAT 2015
;; MSG SIZE rcvd: 239



Для комфортного керування зонами написано багато різних інтерфейсів до PowerDNS. Ми затвердили в роботу powerdns-webinterface
Як це виглядає

Як встановити на UbuntuВстановлюємо LAMP і необхідний модуль:
$ sudo apt-get install gettext

Викачуємо скрипти панелі:
$ cd /tmp
$ wget powerdns-webinterface.googlecode.com/files/powerdns-webinterface-1.5.3.tar.gz
$ tar xvfz webinterface-1.5.3.tar.gz
$ sudo mv webinterface-1.5.3 /var/www/powerdns


Дозволяємо запис в робочу папку:
$ sudo chown-R www-data:www-data /var/www/powerdns/ tmp/templates_c

Виконуємо імпорт бази:
$ sudo mysql-u user-name-p pdns db < /path-to/ install.sql

Правимо configs/db.php на правильні реквізити підключення до бази pdns db

Заходимо браузером за посиланням <IP_или_имя.нашего.сервера>/powerdns з ім'ям/паролем admin: admin і змінюємо пароль.


Інструменти управління конфігурацією для автоматизації Windows ПК



Спочатку для централізованого розповсюдження програмного забезпечення розглядалися системи інвентаризації. Існуючі перевірені рішення ocsinventory-ng і Mandriva Pulse мають у своєму функціоналі можливість установки пакетів. Обидва включають можливість інтеграції з таким елемент ом ITIL/ITSM як Service Desk (зокрема GLPI) зручно, але невнедримо в поточній ситуації. Зміна параметрів реєстру Windows і деплой сертифікатів представляється не інакше як виготовленням інсталяційних пакетів. А ці пакети користувач з правами адміністратора може видалити з машини. Виходячи з цього став розглядати системи управління конфігурацією.

Puppet вважається найбільш поширеним. Він має безліч модулів і користувальницьких інтерфейсів. Зміни в конфігураційних файлах(маніфестах) для клієнтів, останні отримують їх при черговому зверненні до головного сервера, або через запит від сервера для негайного виконання за коштами функції push.
Є модулі для роботи з Windows системами. Підтримка систем WindowsXP припинена після версії puppet-3.1.1.msi, а поточну puppet-3.7.3.msi запустити не вдалося т. к. зав'язана на виклику системних функцій. В старших версіях відсутні `факти` як то `system32` і в маніфестах необхідно описувати різні сценарії в залежності від операційної системи. Це все ускладнює використання системи і вирішено було відмовитися на користь інших інструментів.
SaltStack схожий з Puppet в тому, що використовує метод push для зв'язку з клієнтами(minion). Міпіоп не відкриває жодних портів, а сам підключається до сервера і чекає від нього команд, таким чином підвищується безпека сервісу. Якщо у Puppet є маніфести для описи конфігурацій, то SaltStack введено поняття `стан`(state). Зміни вироблені на майстрі будуть виконані на всіх minion'ах. Варто звернути увагу, що виконання state'ів ініціюється з майстра, а не самими клієнтами як це реалізовано в Puppet. Для підтримки актуального стану в разі тривалого відключення minion'а у файлі конфігурації доданий параметр:
startup_states: 'highstate' (C:\salt\conf\minion)
Стану — це конфігураційні файли у форматі YAML з розширенням sls.
Як це виглядаєsls tree

Зчитування state'ів починається з файлу top.sls, якщо не визначено інше. Він містить список файлів .sls для певних груп.
roto@salt:/etc/salt/files# top cat.sls
base:
# '*':
# Для всіх ПК з Windows
'all_pc':
- match: nodegroup
- gr_inventory
- gr_7z
- gr_chrome
- gr_libreoffice
- gr_klitecodec
- gr_essentials
# Гарант
'gr_garant':
- match: nodegroup
- gr_garant
# Консультант+
'gr_consultant':
- match: nodegroup
- gr_consultant


Групи визначаються в конфігураційному файлі master'а (/etc/salt/master)і дозволяють задавати їх досить гнучко. Детальніше читайте в документації
У прикладах з документації групи визначені змінними. Для динамічних типу паролів до баз, токенів, хешей це `підпори` (pillar) і статичних `зерна` (grain). Крім того змінні можна використовувати в описі state'ів та командному рядку salt.
roto@salt:/etc/salt/files# salt-G 'cpuarch:AMD64' test.ping

В якості прикладу лістинг `стан ` антивіруса від Microsoft:
roto@salt:/etc/salt/files# cat gr_essentials.sls
{% if grains['cpuarch'] == 'AMD64' %}
w64_essentials:
pkg:
- installed
{% elif grains['osrelease'] == '7' %}
w32_essentials:
pkg:
- installed
{% elif grains['osrelease'] == 'XP' %}
w32xp_essentials:
pkg:
- installed
{% endif %}


* у парку немає інших х64 систем, крім Windows7

Установка пакетів проводиться з репозитарію заданого в конфігураційному файлі master'а (/etc/salt/master). Опис пакета у файлі init.sls, його лістинг:
roto@salt:/etc/salt/files/win/repo/w32xp_essentials# cat init.sls
w32xp_essentials:
4.4.304.0:
installer: 'salt://win/repo/w32xp_essentials/mseinstall.exe'
full_name: Microsoft Security Essentials
locale: uk_ua
reboot: False
install_flags: '/q /s /runwgacheck '
uninstaller: '%ProgramFiles(x86)%\Microsoft Security Client\Setup.exe'
uninstall_flags: '/U /S'


Salt master має вбудований файловий сервер і може віддавати будь-які файли minion'ам. Порти ТСР:
  • 4505 #для управління
  • 4506 #для передачі файлів


Для SaltStack існує веб-інтерфейси SaltPad і Halite. Перший завести не вдалося, а за допомогою другого можна переглядати системні журнал повідомлень, статус minion'ів, а також посилати їм команди.
Як це виглядає


Під час тестів він показав себе як вкрай ненадійна, не повне рішення, помітно уступає користувача інтерфейсів інших систем, зокрема Puppet-Dashboard.
Як це виглядає


Для уникнення проблем встановив SHELLINABOX.
Як це виглядаєSHELLINABOX

Як встановити на UbuntuИнсталируем Shell In A Box для доступу ssh через будь html5 браузер:
$ sudo apt-get install openssl shellinabox
Правимо дефолтні конфіги:
$ sudo vi /etc/default/shellinabox
# TCP порт shellinboxd'а на якому відповідати
SHELLINABOX_PORT=443 
# IP адреса або ім'я сервера SSH
SHELLINABOX_ARGS="--o-beep-s /:SSH:localhost --localhost-only" 

Перезапускаємо сервіс:
$ sudo service shellinabox restart
Перевіряємо порт:
$ sudo netstat-nap | grep shellinabox
Відкриваємо в html 5 сумісному браузері <IP_или_имя.нашего.сервера>. Користуємося.


Підсумковий скрипт для встановлення вийшов таким:
install.cmd
@Echo Off

rem/*************************************
rem * Install for SaltStack *
rem*-----------------------------------*
rem * © 2015 by Aleksey Ovchinnikov *
rem * Ліцензія: GPL *
rem * Feel free to customize on your *
rem * needs as long this copyright *
rem * remains intact *
rem*************************************/

SetLocal EnableExtensions

rem /// Перевіряємо, що скрипт запущено від Адміністратора

AT > NUL
If %ERRORLEVEL% EQU 1 (
echo Please use "Run as Administrator"!
pause
exit /b 
)

rem /// Отримуємо mac першого адаптера

%SYSTEMROOT%\System32\getmac.exe /NH /FO csv > %TEMP%\all_mac.tmp
type %TEMP%\all_mac.tmp | findstr /r /c:"-" > %TEMP%\all_mac.txt
del %TEMP%\all_mac.tmp

for /f "usebackq delims=" %%i in (`find /n /v "" %TEMP%\all_mac.txt ^| find "[1]"`) do (
set mac=%%i

)

For /f "delims=, tokens=1" %%i in ("%mac%") do ( set mac=%%i )

set mac=%mac:~4,17%

For /f "delims=^- tokens=*" %%i in ("%mac%") do ( set mac=%%i )

set mac=%mac:-=%
set mac=%mac:~0,12%


rem /// Змінюємо ім'я комп'ютера

If not "%ComputerName%"=="PC-%mac%" (
rem wmic.exe /interactive:off ComputerSystem Where "name = '%computername%'" call rename Name='PC-%mac%'
rem wmic os where Primary='TRUE' reboot

REG ADD HKLM\SYSTEM\ControlSet001\Control\ім'я комп'ютера\ім'я комп'ютера /v ComputerName /t REG_SZ /d "PC-%mac%" /f
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\ім'я комп'ютера\ім'я комп'ютера /v ComputerName /t REG_SZ /d "PC-%mac%" /f
REG ADD HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v "NV Hostname" /t REG_SZ /d "PC-%mac%" /f
REG ADD HKLM\SYSTEM\ControlSet001\Services\Tcpip\Parameters /v "NV Hostname" /t REG_SZ /d "PC-%mac%" /f
shutdown-t 0-r-f 
exit /b

)
echo ...get NAME ^> %ComputerName%



rem /// Отримуємо IP комп'ютера

FOR /F "usebackq tokens=2 delims=[]" %%i IN (`ping %Computername% -n 1 -4`) DO if not "%%i"=="" Set ip=%%i

echo ...get IP ^> %ip%




rem /// Отримуємо версію системи

set key=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion

For /F "delims=" %%a in ('reg query "%key%" /v "ProductName" ^| find /i "ProductName"') do ( set OSName=%%a )

set OSName=%OSName:ProductName=%
set OSName=%OSName:REG_SZ=%

For /F "tokens=* delims= " %%a in ("%OSName%") do ( set OSName=%%a )

echo ...get OS ^> %OSName%




rem /// Отримуємо розрядність системи

Set xOS=x64

If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x86

echo ...get TYPE ^> %xOS%




rem /// Передаємо для запису в DNS

set data=%ip%:%COMPUTERNAME%:%COMPUTERNAME%_%OSName%_%xOS%
set data=%data: =_%

echo ...add DNS ^> 

c:\saltstack\curl.exe -s http://10.44.160.22/dns/update.php?data=%data%"




rem /// Встановлюємо SaltStack враховуючи розрядність Windows

If %xOS%==(x86 c:\saltstack\Salt-Minion-3.1.5-win32-Setup.exe /S /master=salt.admnkz.info /minion-name=%COMPUTERNAME%) Else (c:\saltstack\Salt-Minion-3.1.5-AMD64-Setup.exe /S /master=salt.admnkz.info /minion-name=%COMPUTERNAME%)




rem /// Додаємо запису для автооновлення стэйтов призапуске системи

echo.startup_states: 'highstate' >>"C:\salt\conf\minion"
echo ...auto state ^> Done!
attrib +H +S c:\salt
echo ...hide folder ^> Done!
cd c:\
rmdir /s /q c:\saltstack



Система моніторингу Zabbix

Існує множество систем моніторингу. З Zabbix знайомий давно, його і вибрав.

Як це виглядає


Як встановити на UbuntuВстановлюємо необхідні пакети:
$ sudo apt-get install zabbix-server-mysql zabbix-frontend-php ca-certificates-java libslf4j-java jarwrapper libandroid-json-org-java liblogback-java

У файлі конфігурації сервера /etc/zabbix/zabbix_server.conf налаштовуємо з'єднання з базою даних:
$ sudo mcedit /etc/zabbix/zabbix_server.conf
### Option: DBHost
# Database host name.
# If set to localhost, socket is used for MySQL.
# If set to empty string, socket is used for PostgreSQL.
#
# Mandatory: no
# Default:
# DBHost=localhost

### Option: DBName
# Database name.
# For SQLite3 path to database file must be provided. DBUser and DBPassword are ignored.
# Sample SQLite3 DBName:
# DBName=/var/lib/zabbix/zabbix.sqlite3
#
# Mandatory: yes
# Default:
# DBName=
DBName=zabbix

### Option: DBUser
# Database user. Ignored for SQLite.
#
# Mandatory: no
# Default:
# DBUser=

DBUser=zabbix

### Option: DBPassword
# Database password. Ignored for SQLite.
# Comment this line if no password is used.
#
# Mandatory: no
# Default:
# DBPassword=
DBPassword=zabbix

Готуємо базу даних:
mysql-uuser-name-p
mysql> create database zabbix character set utf8 collate utf8_unicode_ci;
mysql> grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';
mysql> exit;


Завантажуємо структуру і значення в базу даних:
$ sudo cd /usr/share/zabbix-server-mysql
$ sudo gunzip *.gz
$ sudo mysql-uuser-name zabbix-p < schema.sql
$ sudo mysql-uuser-name zabbix-p < images.sql
$ sudo mysql-uuser-name zabbix-p < data.sql


Перезапускаємо zabbix:
$ sudo service zabbix-server start

І перевіряємо, що всі без помилок:
$ tail-n 100 /var/log/zabbix-server/zabbix_server.log

Скопіюємо необхідний файл:
$ sudo cp /usr/share/doc/zabbix-frontend-php/examples/apache.conf /etc/apache2/conf-available/zabbix.conf

Налаштуємо параметри php для веб інтерфейсу:
$ sudo mcedit /etc/apache2/conf-available/zabbix.conf
php_value max_execution_time 300
php_value memory_limit 128M
php_value post_max_size 16M
php_value upload_max_filesize 2M
php_value max_input_time 300
php_value date.timezone Asia/Krasnoyarsk


Додамо файл конфігурації web інтерфейсу zabbix до apache:
$ sudo a2enconf zabbix.conf

І перезапустим web сервер:
$ sudo service apache2 reload

Відкрийте URL вашwebсервер/zabbix і виконайте всі кроки:




На останньому кроці буде запропоновано увійти:


Логін/пароль за замовчуванням: Admin/zabbix. Змінити пароль входу.


Моніторинг JMX

Починаючи з версії 2.0 в zabbix додано нативна підтримка для моніторингу JMX. Взаємодія відбувається через API управління JMX додатків через демона, званого Zabbix Java gateway. Він написаний на мові Java.
Як встановити на UbuntuВстановлюємо необхідні пакети:
$ sudo apt-get install --no-install-recommends zabbix-java-gateway

У файлі конфігурації сервера /etc/zabbix/zabbix_java_gateway.conf налаштовуємо з'єднання і опції запуску Java-gateway:
$ sudo mcedit /etc/zabbix/zabbix_java_gateway.conf

# адреса нашого Java-gateway
JavaGateway=127.0.0.1
# порт для Java Gateway
JavaGatewayPort=10052
# кількість Java Gateway процесів, які будуть обробляти інформацію StartJavaPollers=5


У файлі конфігурації сервера /etc/zabbix/zabbix_server.conf налаштовуємо з'єднання з Java-gateway:
$ sudo mcedit /etc/zabbix/zabbix_server.conf
### Option: JavaGateway
#<----->IP address (hostname or) of Zabbix Java gateway.
#<----->Only if required Java pollers are started.
#
# Mandatory: no
# Default:
# JavaGateway=
JavaGateway=127.0.0.1

### Option: JavaGatewayPort
#<----->Port that Zabbix Java gateway listens on.
#
# Mandatory: no
# Range: 1024-32767
# Default:
# JavaGatewayPort=10052
JavaGatewayPort=10052

### Option: StartJavaPollers
#<----->Number of pre-forked instances of Java pollers.
#
# Mandatory: no
# Range: 0-1000
# Default:
# StartJavaPollers=0
StartJavaPollers=5


Дозволяємо запуск:
$ sudo mcedit /etc/default/zabbix-server
START=yes


Запускаємо сервіс:
$ sudo service zabbix-java-gateway restart

Наступна настройка проводиться на машині де буде проводиться моніторинг. Додайте в скрипт запуску сервера додатків або контейнер сервелетов:
-Djava.rmi.server.hostname=192.168.3.14 \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \

Закрийте доступ до цього порту всім, крім IP-адрес сервера zabbix і машини адміністратора з допомогою firewall.

З машини адміністратора запустіть JConsole з jdk та підключіться до машини де буде проводиться моніторинг.
Як це виглядає


При успішному з'єднанні потрібно зайти в web інтерфейс zabbix і настроїти параметри для моніторингу. Переходимо в Налаштування > Вузли мережі, натискаємо Створити вузол мережі і вводимо потрібне значення.
Як це виглядає


Через деякий час з'являться дані і можна будувати графік.
Як це виглядає



Моніторинг PostgreSQL

Согластно wiki PostgreSQL, рішень для моніторингу написано не мало. Я зупинився на libzbxpgsql (Lib-Zabbix-PostgreSQL). Це спочатку скомпільований модуль написаний на C для zabbix агента і xml шаблон для сервера. Перевага перед скриптами очевидно, це один процес і відсутність зовнішніх залежностей.
Як встановити на UbuntuПропонується компілювати модуль самостійно, бінарний пакет є тільки в rpm. Його і візьмемо.

Встановлюємо необхідні пакети на машину з базою даних, яку будемо моніторити:
$ sudo apt-get install alien zabbix-agent

Завантажуємо модуль:
$ sudo wget downloads.sourceforge.net/project/libzbxpgsl/rpms/libzbxpgsql-0.1.1-1.el7.centos.x86_64.rpm

Конвертуємо в deb пакет:
$ sudo alien libzbxpgsql-0.1.1-1.el7.centos.x86_64.rpm

Встановлюємо пакет:
$ sudo dpkg-i libzbxpgsql_0.1.1-2_amd64.deb

У файлі конфігурації агента /etc/zabbix/zabbix_agentd.conf налаштовуємо з'єднання з сервером і опції:
$ sudo mcedit /etc/zabbix/zabbix_agentd.conf
Server=адрессервера
ServerActive=адрессервера:порт
Hostname=doc.домен.ру


І перезапустим агента:
$ sudo service zabbix-agent restart

Зберігаємо template_postgresql_server.xml
Відкриваємо web інтерфейс zabbix і переходимо в Налаштування > Шаблони, клікаєм Імпорт конфігурації. Імпортуємо наш xml файл.

Налаштовуємо параметри для цього вузла мережі. Додаємо потрібні шаблони і Template PostgreSQL Server. У вкладці Макроси вписуємо параметри з'єднання з базою даних, яку будемо моніторити.
Як це виглядає


Через деякий час з'являться дані і можна будувати графік.
Як це виглядає



Дана стаття складена документація для мого поточного роботодавця. Коментарі, зауваження та вказівки на неточності вітаються.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.