ΠΠ΄ΡΠ°Π²ΠΎ Π½Π° ΡΠΈΡΠ΅
ΠΠ°Ρ ΡΡΠΌ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡ Π½Π° ΠΠΈΠ½ΡΠΊΡ, ΡΠ΅ ΠΏΡΠ΅ΡΠ΅Π»ΠΈΠ² ΠΎΠ΄ Π ΡΡΠΈΡΠ° Π²ΠΎ ΠΠ²ΡΡΡΠ°Π»ΠΈΡΠ° ΡΠΎ Π½Π΅Π·Π°Π²ΠΈΡΠ½Π° ΠΏΡΠΎΡΠ΅ΡΠΈΠΎΠ½Π°Π»Π½Π° Π²ΠΈΠ·Π° Π²ΠΎ 2015 Π³ΠΎΠ΄ΠΈΠ½Π°, Π½ΠΎ ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π΅ΠΌΠ° Π΄Π° Π±ΠΈΠ΄Π΅ Π·Π° ΡΠΎΠ° ΠΊΠ°ΠΊΠΎ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ ΡΡΠ°ΠΊΡΠΎΡ Π·Π° ΡΠ²ΠΈΡΠ°. ΠΠ΅ΡΠ΅ ΠΈΠΌΠ° Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ ΡΠ°ΠΊΠ²ΠΈ Π½Π°ΠΏΠΈΡΠΈ (ΡΠ΅ΠΏΠ°ΠΊ, Π°ΠΊΠΎ ΠΈΠΌΠ° ΠΈΠ½ΡΠ΅ΡΠ΅Ρ, ΡΠ΅ ΠΏΠΈΡΡΠ²Π°ΠΌ ΠΈ Π·Π° ΠΎΠ²Π°), ΠΏΠ° Π±ΠΈ ΡΠ°ΠΊΠ°Π» Π΄Π° Π·Π±ΠΎΡΡΠ²Π°ΠΌ Π·Π° ΡΠΎΠ° ΠΊΠ°ΠΊΠΎ, Π½Π° ΠΌΠΎΡΠ°ΡΠ° ΡΠ°Π±ΠΎΡΠ° Π²ΠΎ ΠΠ²ΡΡΡΠ°Π»ΠΈΡΠ° ΠΊΠ°ΠΊΠΎ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ Π·Π° Linux-ops, ΠΈΠ½ΠΈΡΠΈΡΠ°Π² ΠΌΠΈΠ³ΡΠ°ΡΠΈΡΠ° ΠΎΠ΄ Π΅Π΄Π΅Π½ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Π½Π° Π΄ΡΡΠ³. ΠΠΎΡΠΎΡΠ½ΠΎ - Nagios => Icinga2.
Π‘ΡΠ°ΡΠΈΡΠ°ΡΠ° Π΅ Π΄Π΅Π»ΡΠΌΠ½ΠΎ ΡΠ΅Ρ Π½ΠΈΡΠΊΠ°, Π° Π΄Π΅Π»ΡΠΌΠ½ΠΎ Π·Π° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡΠ° ΡΠΎ Π»ΡΡΠ΅ ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΠΏΠΎΠ²ΡΠ·Π°Π½ΠΈ ΡΠΎ ΡΠ°Π·Π»ΠΈΠΊΠΈΡΠ΅ Π²ΠΎ ΠΊΡΠ»ΡΡΡΠ°ΡΠ° ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ Π½Π° ΡΠ°Π±ΠΎΡΠ°.
ΠΠ° ΠΆΠ°Π», ΠΎΠ·Π½Π°ΠΊΠ°ΡΠ° βΠΊΠΎΠ΄β Π½Π΅ Π³ΠΈ ΠΈΡΡΠ°ΠΊΠ½ΡΠ²Π° ΠΊΠΎΠ΄ΠΎΠ²ΠΈΡΠ΅ Π·Π° ΠΊΡΠΊΠ»ΠΈ ΠΈ ΡΠ°ΠΌΠ», ΠΏΠ° ΠΌΠΎΡΠ°Π² Π΄Π° ΠΊΠΎΡΠΈΡΡΠ°ΠΌ βΠΎΠ±ΠΈΡΠ΅Π½ ΡΠ΅ΠΊΡΡβ.
ΠΠ΅ΠΌΠ°ΡΠ΅ Π·Π½Π°ΡΠΈ Π½Π° Π½Π΅Π²ΠΎΠ»ΡΠ° ΡΡΡΠΎΡΠΎ Π½Π° 21 Π΄Π΅ΠΊΠ΅ΠΌΠ²ΡΠΈ 2016 Π³ΠΎΠ΄ΠΈΠ½Π°. ΠΠ°ΠΊΠΎ ΠΈ ΠΎΠ±ΠΈΡΠ½ΠΎ, ΡΠΈΡΠ°Π² Π₯Π°Π±Ρ ΠΎΠ΄ Π½Π΅ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½ Π°Π½ΠΎΠ½ΠΈΠΌΠ΅Π½ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ Π²ΠΎ ΠΏΡΠ²ΠΈΠΎΡ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° ΡΠ°Ρ ΠΎΠ΄ ΡΠ°Π±ΠΎΡΠ½ΠΈΠΎΡ Π΄Π΅Π½, Π΄ΠΎΠ΄Π΅ΠΊΠ° ΠΏΠΈΠ΅Π² ΠΊΠ°ΡΠ΅ ΠΈ Π½Π°ΠΈΠ΄ΠΎΠ² .
ΠΠΈΠ΄Π΅ΡΡΠΈ ΠΌΠΎΡΠ°ΡΠ° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΠ° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Nagios, Π±Π΅Π· ΡΠ°Π·ΠΌΠΈΡΠ»ΡΠ²Π°ΡΠ΅ Π΄Π²Π°ΠΏΠ°ΡΠΈ, ΠΊΡΠ΅ΠΈΡΠ°Π² ΡΠΈΠΊΠ΅Ρ Π²ΠΎ Redmine ΠΈ Π³ΠΎ ΠΈΡΠΏΡΠ°ΡΠΈΠ² Π»ΠΈΠ½ΠΊΠΎΡ Π΄ΠΎ Π³Π΅Π½Π΅ΡΠ°Π»Π½ΠΈΠΎΡ ΡΠ°Π·Π³ΠΎΠ²ΠΎΡ, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΡΠΌΠ΅ΡΠ°Π² Π΄Π΅ΠΊΠ° Π΅ Π²Π°ΠΆΠ΅Π½. ΠΠ½ΠΈΡΠΈΡΠ°ΡΠΈΠ²Π°ΡΠ° Π΅ ΠΊΠ°Π·Π½ΠΈΠ²Π° Π΄ΡΡΠΈ ΠΈ Π²ΠΎ ΠΠ²ΡΡΡΠ°Π»ΠΈΡΠ°, ΠΏΠ° Π³Π»Π°Π²Π½ΠΈΠΎΡ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ ΠΌΠΈ Π³ΠΎ Π·Π°ΠΊΠ°ΡΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΡ ΠΎΡΠΊΠ°ΠΊΠΎ Π³ΠΎ ΠΎΡΠΊΡΠΈΠ².
Π‘Π»ΠΈΠΊΠ° ΠΎΠ΄ Π΅ΠΊΡΠ°Π½ΠΎΡ ΠΎΠ΄ Redmine
ΠΠΎ Π½Π°ΡΠΈΠΎΡ ΠΎΠ΄Π΄Π΅Π», ΠΏΡΠ΅Π΄ Π΄Π° Π³ΠΎ ΠΈΠ·ΡΠ°Π·ΠΈΡΠ΅ Π²Π°ΡΠ΅ΡΠΎ ΠΌΠΈΡΠ»Π΅ΡΠ΅, Π²ΠΎΠΎΠ±ΠΈΡΠ°Π΅Π½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΏΠΎΠ½ΡΠ΄ΠΈ Π±Π°ΡΠ΅ΠΌ Π΅Π΄Π½Π° Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π°, Π΄ΡΡΠΈ ΠΈ Π°ΠΊΠΎ ΠΈΠ·Π±ΠΎΡΠΎΡ Π΅ ΠΎΡΠΈΠ³Π»Π΅Π΄Π΅Π½, ΠΏΠ° Π·Π°ΡΠΎΠ° ΠΏΠΎΡΠ½Π°Π² ΡΠΎ Π³ΡΠ³Π»Π°ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΡΠ»Π΅Π΄Π΅ΡΠ΅ ΡΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ ΡΠ΅Π»Π΅Π²Π°Π½ΡΠ½ΠΈ, Π±ΠΈΠ΄Π΅ΡΡΠΈ Π²ΠΎ Π ΡΡΠΈΡΠ° Π½Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΎΡΠΎ ΠΌΠ΅ΡΡΠΎ Π½Π° ΡΠ°Π±ΠΎΡΠ° ΡΠ°Ρ ΠΈΠΌΠ°ΡΠ΅ ΠΌΠΎΡ ΡΠ°ΠΌΠΎ-Π½Π°ΠΏΠΈΡΠ°Π½ ΡΠΈΡΡΠ΅ΠΌ, ΠΌΠ½ΠΎΠ³Ρ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π΅Π½, Π½ΠΎ ΡΠ΅ΠΏΠ°ΠΊ Π΄ΠΎΡΡΠ° ΡΠ°Π±ΠΎΡΠ΅Π½ ΠΈ Π³ΠΈ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ ΡΠΈΡΠ΅ Π·Π°Π΄Π°ΡΠΈ ΡΡΠΎ ΠΌΡ Π±Π΅Π° Π΄ΠΎΠ΄Π΅Π»Π΅Π½ΠΈ. ΠΠ°ΡΡΠΎΠ½, ΠΠΎΠ»ΠΈΡΠ΅Ρ Π½ΠΈΠΊΠ°ΡΠ° Π²ΠΎ Π‘Π°Π½ΠΊΡ ΠΠ΅ΡΠ΅ΡΠ±ΡΡΠ³ ΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΠΎΡΠΎ Π½Π° ΠΌΠ΅ΡΡΠΎΡΠΎ. ΠΠ΅, ΠΌΠ΅ΡΡΠΎΡΠΎ Π΅ ΡΠΌΡΠ΄Π»ΠΈΠ²ΠΎ. ΠΠ²Π° Π΅ Π»ΠΈΡΠ½ΠΎ (11 Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΡΠ°Π±ΠΎΡΠ°) ΠΈ Π΄ΠΎΡΡΠΎΡΠ½ΠΎ Π·Π° ΠΏΠΎΡΠ΅Π±Π½Π° ΡΡΠ°ΡΠΈΡΠ°, Π½ΠΎ Π½Π΅ ΡΠ΅Π³Π°.
ΠΠ°Π»ΠΊΡ Π·Π° ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π·Π° ΠΏΡΠ°Π²Π΅ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° ΠΌΠΎΠ΅ΡΠΎ ΡΠ΅Π³Π°ΡΠ½ΠΎ ΠΌΠ΅ΡΡΠΎ. ΠΠΈΠ΅ Π³ΠΈ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ Puppet, Gitlab ΠΈ Infrastructure ΠΊΠ°ΠΊΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏ Π½Π° ΠΊΠΎΠ΄, ΡΠ°ΠΊΠ° ΡΡΠΎ:
- ΠΠ΅ΠΌΠ° ΡΠ°ΡΠ½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΠΏΡΠ΅ΠΊΡ SSH ΡΠΎ ΡΠ°ΡΠ½ΠΎ ΠΌΠ΅Π½ΡΠ²Π°ΡΠ΅ Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈΡΠ΅ Π½Π° Π²ΠΈΡΡΡΠ΅Π»Π½ΠΈΡΠ΅ ΠΌΠ°ΡΠΈΠ½ΠΈ. ΠΠΎ ΡΠ΅ΠΊΠΎΡ Π½Π° ΡΡΠΈΡΠ΅ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΡΠ°Π±ΠΎΡΠ°, ΠΌΠ½ΠΎΠ³Ρ ΠΏΠ°ΡΠΈ ΠΌΠ΅ ΡΠ΄ΠΈΡΠ°Π° ΡΠΎ ΠΊΠ°ΠΏΠ° Π·Π° ΠΎΠ²Π°, ΠΏΠΎΡΠ»Π΅Π΄Π΅Π½ ΠΏΠ°Ρ Π±Π΅ΡΠ΅ ΠΏΡΠ΅Π΄ Π΅Π΄Π½Π° Π½Π΅Π΄Π΅Π»Π° ΠΈ ΠΌΠΈΡΠ»Π°ΠΌ Π΄Π΅ΠΊΠ° Π½Π΅ Π±Π΅ΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π΅Π½ ΠΏΠ°Ρ. ΠΠ°, Π½Π°Π²ΠΈΡΡΠΈΠ½Π° - ΠΏΠΎΠΏΡΠ°Π²Π΅ΡΠ΅ Π΅Π΄Π½Π° Π»ΠΈΠ½ΠΈΡΠ° Π²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ°, ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΡΡΠ΅ ΡΠ° ΡΡΠ»ΡΠ³Π°ΡΠ° ΠΈ Π²ΠΈΠ΄Π΅ΡΠ΅ Π΄Π°Π»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΡ Π΅ ΡΠ΅ΡΠ΅Π½ - 10 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ. ΠΠ°ΠΏΡΠ°Π²Π΅ΡΠ΅ Π½ΠΎΠ²Π° ΡΠΈΠ»ΠΈΡΠ°Π»Π° Π²ΠΎ Gitlab, ΠΏΡΠΈΡΠΈΡΠ½Π΅ΡΠ΅ Π³ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅, ΠΏΠΎΡΠ΅ΠΊΠ°ΡΡΠ΅ r10k Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Π½Π° Puppetmaster, ΡΡΠ°ΡΡΡΠ²Π°ΡΡΠ΅ Puppet -environment=mybranch ΠΈ ΠΏΠΎΡΠ΅ΠΊΠ°ΡΡΠ΅ ΡΡΡΠ΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΌΠΈΠ½ΡΡΠΈ Π΄ΠΎΠ΄Π΅ΠΊΠ° ΡΠ΅ΡΠΎ ΡΠΎΠ° Π½Π΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ° - ΠΌΠΈΠ½ΠΈΠΌΡΠΌ 5 ΠΌΠΈΠ½ΡΡΠΈ.
- Π‘ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΡΠ΅ ΠΏΡΠ°Π²Π°Ρ ΡΠΎ ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ Π½Π° Π±Π°ΡΠ°ΡΠ΅ Π·Π° ΡΠΏΠΎΡΡΠ²Π°ΡΠ΅ Π²ΠΎ Gitlab ΠΈ ΠΌΠΎΡΠ° Π΄Π° Π±ΠΈΠ΄Π°Ρ ΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈ ΠΎΠ΄ Π½Π°ΡΠΌΠ°Π»ΠΊΡ Π΅Π΄Π΅Π½ ΡΠ»Π΅Π½ Π½Π° ΡΠΈΠΌΠΎΡ. ΠΠ° Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π·Π° ΠΊΠΎΠΈ ΠΎΠ΄Π»ΡΡΡΠ²Π° ΡΠ°ΠΊΠΎΠ²ΠΎΠ΄ΠΈΡΠ΅Π»ΠΎΡ Π½Π° ΡΠΈΠΌΠΎΡ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ ΡΠ΅ Π΄Π²Π΅ ΠΈΠ»ΠΈ ΡΡΠΈ ΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΡΠ°.
- Π‘ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΡΠ΅ ΡΠ΅ΠΊΡΡΡΠ°Π»Π½ΠΈ Π½Π° Π΅Π΄Π΅Π½ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ Π½Π°ΡΠΈΠ½ (Π±ΠΈΠ΄Π΅ΡΡΠΈ Puppet ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠΈΡΠ°, ΡΠΊΡΠΈΠΏΡΠΈΡΠ΅ ΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ Π½Π° Hiera ΡΠ΅ ΡΠ΅ΠΊΡΡ), Π±ΠΈΠ½Π°ΡΠ½ΠΈΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ ΡΠ΅ ΠΌΠ½ΠΎΠ³Ρ ΠΎΠ±Π΅ΡΡ ΡΠ°Π±ΡΠ΅Π½ΠΈ ΠΈ ΡΡΠ΅Π±Π° Π΄Π° ΠΈΠΌΠ° ΡΠ±Π΅Π΄Π»ΠΈΠ²Π° ΠΏΡΠΈΡΠΈΠ½Π° Π΄Π° ΡΠ΅ ΠΎΠ΄ΠΎΠ±ΡΠ°Ρ ΡΠ°ΠΊΠ²ΠΈΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ.
ΠΠ½Π°ΡΠΈ, ΠΎΠΏΡΠΈΠΈΡΠ΅ ΡΡΠΎ Π³ΠΈ ΡΠ°Π·Π³Π»Π΅Π΄Π°Π²:
- Munin - Π°ΠΊΠΎ ΠΈΠΌΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΠ΄ 10 ΡΠ΅ΡΠ²Π΅ΡΠΈ Π²ΠΎ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°, Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΈΡΠ°ΡΠ° ΡΠ΅ ΠΏΡΠ΅ΡΠ²ΠΎΡΠ° Π²ΠΎ ΠΏΠ΅ΠΊΠΎΠ» (ΠΎΠ΄ . ΠΠ΅ΠΌΠ°Π² ΠΎΡΠΎΠ±Π΅Π½Π° ΠΆΠ΅Π»Π±Π° Π΄Π° Π³ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠ°ΠΌ ΠΎΠ²Π°, ΠΏΠ° Π³ΠΎ ΠΏΡΠΈΡΠ°ΡΠΈΠ² Π½Π΅Π³ΠΎΠ²ΠΈΠΎΡ Π·Π±ΠΎΡ).
- ΠΠ°Π±ΠΈΠΊΡ - ΠΠΎ Π³Π»Π΅Π΄Π°Π² Π΄ΠΎΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅, Π½Π°Π·Π°Π΄ Π²ΠΎ Π ΡΡΠΈΡΠ°, Π½ΠΎ ΡΠΎΠ³Π°Ρ Π±Π΅ΡΠ΅ Π²ΠΈΡΠΎΠΊ Π·Π° ΠΌΠΎΠΈΡΠ΅ Π·Π°Π΄Π°ΡΠΈ. Π’ΡΠΊΠ° - ΠΌΠΎΡΠ°ΡΠ΅ Π΄Π° ΡΠ΅ ΠΎΡΡΡΠ»ΠΈ ΠΏΠΎΡΠ°Π΄ΠΈ ΡΠΏΠΎΡΡΠ΅Π±Π°ΡΠ° Π½Π° Puppet ΠΊΠ°ΠΊΠΎ ΠΌΠ΅Π½Π°ΡΠ΅Ρ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° ΠΈ Gitlab ΠΊΠ°ΠΊΠΎ ΡΠΈΡΡΠ΅ΠΌ Π·Π° ΠΊΠΎΠ½ΡΡΠΎΠ»Π° Π½Π° Π²Π΅ΡΠ·ΠΈΡΠ°ΡΠ°. ΠΠΎ ΡΠΎΠ° Π²ΡΠ΅ΠΌΠ΅, ΠΊΠΎΠ»ΠΊΡ ΡΡΠΎ ΡΠ°Π·Π±ΡΠ°Π², Zabbix ΡΠ° ΡΠΊΠ»Π°Π΄ΠΈΡΠ° ΡΠ΅Π»Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π²ΠΎ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΈ Π·Π°ΡΠΎΠ° Π½Π΅ Π±Π΅ΡΠ΅ ΡΠ°ΡΠ½ΠΎ ΠΊΠ°ΠΊΠΎ Π΄Π° ΡΠ΅ ΡΠΏΡΠ°Π²ΡΠ²Π° ΡΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π²ΠΎ ΡΠ΅Π³Π°ΡΠ½ΠΈ ΡΡΠ»ΠΎΠ²ΠΈ ΠΈ ΠΊΠ°ΠΊΠΎ Π΄Π° ΡΠ΅ ΡΠ»Π΅Π΄Π°Ρ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅.
- ΠΡΠΎΠΌΠ΅ΡΠ΅Ρ Π΅ ΠΎΠ½Π° Π΄ΠΎ ΡΡΠΎ ΡΠ΅ Π΄ΠΎΡΠ΄Π΅ΠΌΠ΅ Π½Π° ΠΊΡΠ°ΡΠΎΡ, ΡΡΠ΄Π΅ΡΡΠΈ ΡΠΏΠΎΡΠ΅Π΄ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π²ΠΎ ΠΎΠ΄Π΄Π΅Π»ΠΎΡ, Π½ΠΎ Π²ΠΎ ΡΠΎΠ° Π²ΡΠ΅ΠΌΠ΅ Π½Π΅ Π³ΠΎ ΡΠΎΠ²Π»Π°Π΄Π°Π² ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Π² Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ°ΠΌ Π½Π°Π²ΠΈΡΡΠΈΠ½Π° ΡΠ°Π±ΠΎΡΠ΅Π½ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΊ (ΠΠΎΠΊΠ°Π· Π·Π° ΠΊΠΎΠ½ΡΠ΅ΠΏΡ), ΠΏΠ° ΠΌΠΎΡΠ°Π² Π΄Π° ΠΎΠ΄Π±ΠΈΡΠ°ΠΌ.
- ΠΠΌΠ°ΡΠ΅ ΠΈ Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π΄ΡΡΠ³ΠΈ ΠΎΠΏΡΠΈΠΈ ΠΊΠΎΠΈ ΠΈΠ»ΠΈ Π±Π°ΡΠ°Π° ΡΠ΅Π»ΠΎΡΠ½Π° ΠΏΡΠ΅ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ, ΠΈΠ»ΠΈ Π±Π΅Π° Π²ΠΎ ΠΏΠΎΠ²ΠΎΡ / Π½Π°ΠΏΡΡΡΠ΅Π½ΠΈ ΠΈ Π±Π΅Π° ΠΎΠ΄Π±ΠΈΠ΅Π½ΠΈ ΠΏΠΎΡΠ°Π΄ΠΈ ΠΈΡΡΠ°ΡΠ° ΠΏΡΠΈΡΠΈΠ½Π°.
ΠΠ° ΠΊΡΠ°ΡΠΎΡ, ΡΠ΅ ΡΠ΅ΡΠΈΠ² Π½Π° Icinga2 ΠΎΠ΄ ΡΡΠΈ ΠΏΡΠΈΡΠΈΠ½ΠΈ:
1 - ΠΊΠΎΠΌΠΏΠ°ΡΠΈΠ±ΠΈΠ»Π½ΠΎΡΡ ΡΠΎ Nrpe (ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠ° ΡΡΠ»ΡΠ³Π° ΠΊΠΎΡΠ° ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΎΠ΄ Nagios). ΠΠ²Π° Π±Π΅ΡΠ΅ ΠΌΠ½ΠΎΠ³Ρ Π²Π°ΠΆΠ½ΠΎ, Π±ΠΈΠ΄Π΅ΡΡΠΈ Π²ΠΎ ΡΠΎΠ° Π²ΡΠ΅ΠΌΠ΅ ΠΈΠΌΠ°Π²ΠΌΠ΅ 135 (ΡΠ΅Π³Π° ΠΈΠΌΠ° 2019 Π²ΠΎ 165 Π³ΠΎΠ΄ΠΈΠ½Π°) Π²ΠΈΡΡΡΠ΅Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ ΡΠΎ Π΅Π΄Π΅Π½ ΠΊΡΠΏ Π½Π°ΠΌΠ΅Π½ΡΠΊΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ ΡΡΠ»ΡΠ³ΠΈ/ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ, ΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΡΠΎ ΠΏΡΠ°Π²Π΅ΡΠ΅ Π½Π° ΡΠ΅ΡΠΎ ΡΠΎΠ° ΡΠ΅ Π±Π΅ΡΠ΅ Π²ΠΈΡΡΠΈΠ½ΡΠΊΠ° Π±ΠΎΠ»ΠΊΠ°.
2 - ΡΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΊΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ ΡΠ΅ ΡΠ΅ΠΊΡΡ, ΡΡΠΎ Π³ΠΎ ΠΎΠ»Π΅ΡΠ½ΡΠ²Π° ΡΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΎΠ²Π° ΠΏΡΠ°ΡΠ°ΡΠ΅, ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ΡΠΎ Π±Π°ΡΠ°ΡΠ° Π·Π° ΡΠΏΠΎΡΡΠ²Π°ΡΠ΅ ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈ ΡΡΠΎ Π΅ Π΄ΠΎΠ΄Π°Π΄Π΅Π½ΠΎ ΠΈΠ»ΠΈ ΠΈΠ·Π±ΡΠΈΡΠ°Π½ΠΎ.
3 Π΅ ΠΆΠΈΠ² ΠΈ ΡΠ°Π·Π²ΠΎΡ Π½Π° OpenSource ΠΏΡΠΎΠ΅ΠΊΡ. ΠΠ°Π²ΠΈΡΡΠΈΠ½Π° Π³ΠΎ ΡΠ°ΠΊΠ°ΠΌΠ΅ OpenSource ΠΈ Π³ΠΎ Π΄Π°Π²Π°ΠΌΠ΅ ΡΠ΅ΠΊΠΎΡ ΠΌΠΎΠΆΠ΅Π½ ΠΏΡΠΈΠ΄ΠΎΠ½Π΅Ρ ΠΊΠΎΠ½ Π½Π΅Π³ΠΎ ΡΠΎ ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ Π½Π° Π±Π°ΡΠ°ΡΠ° Π·Π° ΠΏΠΎΠ²Π»Π΅ΠΊΡΠ²Π°ΡΠ΅ ΠΈ ΠΏΡΠ°ΡΠ°ΡΠ° Π·Π° ΡΠ΅ΡΠ°Π²Π°ΡΠ΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅.
ΠΠ½Π°ΡΠΈ, Π°ΡΠ΄Π΅ Π΄Π° ΠΎΠ΄ΠΈΠΌΠ΅, Icinga2.
ΠΡΠ²ΠΎΡΠΎ Π½Π΅ΡΡΠΎ ΡΠΎ ΠΊΠΎΠ΅ ΠΌΠΎΡΠ°Π² Π΄Π° ΡΠ΅ ΡΠΎΠΎΡΠ°ΠΌ Π±Π΅ΡΠ΅ ΠΈΠ½Π΅ΡΡΠ½ΠΎΡΡΠ° Π½Π° ΠΌΠΎΠΈΡΠ΅ ΠΊΠΎΠ»Π΅Π³ΠΈ. Π‘ΠΈΡΠ΅ ΡΠ΅ Π½Π°Π²ΠΈΠΊΠ½Π°ΡΠΈ Π½Π° Nagios/Naggios (ΠΈΠ°ΠΊΠΎ ΠΈ ΠΎΠ²Π΄Π΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Π° Π΄Π° Π΄ΠΎΡΠ΄Π°Ρ Π΄ΠΎ ΠΊΠΎΠΌΠΏΡΠΎΠΌΠΈΡ Π·Π° ΡΠΎΠ° ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ ΠΈΠ·Π³ΠΎΠ²ΠΎΡΠ°Ρ) ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡΠΎΡ CheckMK. ΠΠ½ΡΠ΅ΡΡΠ΅ΡΡΠΎΡ Π½Π° icinga ΠΈΠ·Π³Π»Π΅Π΄Π° ΡΠΎΡΠ΅ΠΌΠ° ΠΏΠΎΠΈΠ½Π°ΠΊΡ (ΠΎΠ²Π° Π±Π΅ΡΠ΅ ΠΌΠΈΠ½ΡΡ), Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΅ ΡΠ»Π΅ΠΊΡΠΈΠ±ΠΈΠ»Π½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³ΠΎΠ΄ΠΈ ΠΎΠ½Π° ΡΡΠΎ ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΎ Π³Π»Π΅Π΄Π°ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠΈΠ»ΡΡΠΈ Π·Π° Π±ΡΠΊΠ²Π°Π»Π½ΠΎ ΡΠ΅ΠΊΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΠ°Ρ (ΠΎΠ²Π° Π±Π΅ΡΠ΅ ΠΏΠ»ΡΡ, Π½ΠΎ ΡΠ΅ Π±ΠΎΡΠ΅Π² ΠΌΠ½ΠΎΠ³Ρ Π·Π° ΡΠΎΠ°).
Π€ΠΈΠ»ΡΡΠΈ
ΠΡΠΎΡΠ΅Π½Π΅ΡΠ΅ Π³ΠΎ ΡΠΎΠΎΠ΄Π½ΠΎΡΠΎΡ Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π°ΡΠ° Π½Π° Π»Π΅Π½ΡΠ°ΡΠ° Π·Π° Π»ΠΈΠ·Π³Π°ΡΠ΅ ΡΠΎ Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π°ΡΠ° Π½Π° ΠΏΠΎΠ»Π΅ΡΠΎ Π·Π° Π»ΠΈΠ·Π³Π°ΡΠ΅.
ΠΡΠΎΡΠΎ, ΡΠΈΡΠ΅ ΡΠ΅ Π½Π°Π²ΠΈΠΊΠ½Π°ΡΠΈ Π΄Π° ΡΠ° Π³Π»Π΅Π΄Π°Π°Ρ ΡΠ΅Π»Π°ΡΠ° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° Π½Π° Π΅Π΄Π΅Π½ ΠΌΠΎΠ½ΠΈΡΠΎΡ, Π±ΠΈΠ΄Π΅ΡΡΠΈ CheckMk Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ ΡΠΎ Π½Π΅ΠΊΠΎΠ»ΠΊΡ Nagios Ρ ΠΎΡΡΠΎΠ²ΠΈ, Π½ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡΠΎΡ Icinga Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ ΡΡΠΎΡΠΈ ΡΠΎΠ° (Π²ΡΡΡΠ½ΠΎΡΡ, ΠΌΠΎΠΆΠ΅ΡΠ΅, Π½ΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ Π·Π° ΡΠΎΠ° ΠΏΠΎΠ΄ΠΎΠ»Ρ). ΠΠ»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π°ΡΠ° Π±Π΅ΡΠ΅ Π½Π΅ΡΡΠΎ Π½Π°ΡΠ΅ΡΠ΅Π½ΠΎ Thruk, Π½ΠΎ Π½Π΅Π³ΠΎΠ²ΠΈΠΎΡ Π΄ΠΈΠ·Π°ΡΠ½ Π³ΠΈ Π½Π°ΡΠ΅ΡΠ° ΡΠΈΡΠ΅ Π²ΠΎ ΡΠΈΠΌΠΎΡ Π΄Π° ΡΠ΅ Π·Π°ΠΌΠΎΠ»ΠΊΠ½Π°Ρ ΠΎΡΠ²Π΅Π½ Π΅Π΄Π΅Π½ - ΠΎΠ½ΠΎΡ ΡΡΠΎ Π³ΠΎ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈ (Π½Π΅ ΡΠ°Ρ).
ΠΠΎ ΠΏΠ΅ΡΠΊΠ°ΡΠ° Thruk - Π΅Π΄Π½ΠΎΠ³Π»Π°ΡΠ½Π° ΠΎΠ΄Π»ΡΠΊΠ° Π½Π° ΡΠΈΠΌΠΎΡ
ΠΠΎ Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π΄Π΅Π½Π° Π±ΡΠ΅ΠΈΠ½ΡΡΠΎΡΠΌΠΈΠ½Π³, ΡΠ° ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΠ² ΠΈΠ΄Π΅ΡΠ°ΡΠ° Π·Π° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Π½Π° ΠΊΠ»Π°ΡΡΠ΅ΡΠΈ, ΠΊΠΎΠ³Π° ΠΈΠΌΠ° Π΅Π΄Π΅Π½ Π³Π»Π°Π²Π΅Π½ Ρ ΠΎΡΡ Π²ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½Π°ΡΠ° Π·ΠΎΠ½Π° ΠΈ Π΄Π²Π° ΡΠΎΠ±ΠΎΠ²ΠΈ - Π΅Π΄Π΅Π½ Π²ΠΎ dev/ΡΠ΅ΡΡ ΠΈ Π΅Π΄Π΅Π½ Π½Π°Π΄Π²ΠΎΡΠ΅ΡΠ΅Π½ Ρ ΠΎΡΡ Π»ΠΎΡΠΈΡΠ°Π½ ΠΊΠ°Ρ Π΄ΡΡΠ³ ΠΏΡΠΎΠ²Π°ΡΠ΄Π΅Ρ ΡΠΎ ΡΠ΅Π» Π΄Π° ΡΠ΅ ΡΠ»Π΅Π΄ΠΈ Π½Π°ΡΠΈΠΎΡ ΡΡΠ»ΡΠ³ΠΈ ΠΎΠ΄ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΈΠ»ΠΈ Π½Π°Π΄Π²ΠΎΡΠ΅ΡΠ΅Π½ Π½Π°Π±ΡΡΠ΄ΡΠ²Π°Ρ. ΠΠ²Π°Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ Π΄Π° ΡΠ΅ Π²ΠΈΠ΄Π°Ρ ΡΠΈΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Π²ΠΎ Π΅Π΄Π΅Π½ Π²Π΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡ ΠΈ ΡΠ°Π±ΠΎΡΠ΅ΡΠ΅ Π΄ΠΎΡΡΠ° Π΄ΠΎΠ±ΡΠΎ, Π½ΠΎ Puppet... ΠΡΠΎΠ±Π»Π΅ΠΌΠΎΡ ΡΠΎ Puppet Π±Π΅ΡΠ΅ ΡΡΠΎ Π³Π»Π°Π²Π½ΠΈΠΎΡ Ρ ΠΎΡΡ ΡΠ΅Π³Π° ΠΌΠΎΡΠ°ΡΠ΅ Π΄Π° Π·Π½Π°Π΅ Π·Π° ΡΠΈΡΠ΅ Ρ ΠΎΡΡΠΎΠ²ΠΈ ΠΈ ΡΡΠ»ΡΠ³ΠΈ/ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²ΠΎ ΡΠΈΡΡΠ΅ΠΌΠΎΡ ΠΈ ΠΈΠΌΠ°ΡΠ΅ Π΄Π° Π³ΠΈ Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°ΡΠ΅ ΠΏΠΎΠΌΠ΅ΡΡ Π·ΠΎΠ½ΠΈ (dev-test, staging-prod, ext), Π½ΠΎ ΠΈΡΠΏΡΠ°ΡΠ°ΡΠ΅ΡΠΎ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΠΏΡΠ΅ΠΊΡ Icinga API ΡΡΠ°Π΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΡΠ΅ΠΊΡΠ½Π΄ΠΈ, Π½ΠΎ ΡΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΎΡ Puppet Π½Π° ΡΠΈΡΠ΅ ΡΡΠ»ΡΠ³ΠΈ Π·Π° ΡΠΈΡΠ΅ Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΈ ΡΡΠ°Π΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΌΠΈΠ½ΡΡΠΈ. ΠΠ° ΠΎΠ²Π° ΡΓ¨ ΡΡΡΠ΅ ΠΌΠΈ ΡΠ΅ ΠΎΠ±Π²ΠΈΠ½ΡΠ²Π°, ΠΈΠ°ΠΊΠΎ Π²Π΅ΡΠ΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΏΠ°ΡΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΈΠ² ΠΊΠ°ΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ° ΡΠ΅ ΠΈ Π·ΠΎΡΡΠΎ ΡΠ΅ΡΠΎ ΡΠΎΠ° ΡΡΠ°Π΅ ΡΠΎΠ»ΠΊΡ Π΄ΠΎΠ»Π³ΠΎ.
Π’ΡΠ΅ΡΠΎ, ΠΈΠΌΠ° Π΅Π΄Π΅Π½ ΠΊΡΠΏ Π‘Π½Π΅Π³ΡΠ»ΠΊΠΈ - ΡΠ°Π±ΠΎΡΠΈ ΠΊΠΎΠΈ ΡΠ΅ ΠΈΠ·Π΄Π²ΠΎΡΡΠ²Π°Π°Ρ ΠΎΠ΄ ΠΎΠΏΡΡΠΈΠΎΡ ΡΠΈΡΡΠ΅ΠΌ Π±ΠΈΠ΄Π΅ΡΡΠΈ ΠΈΠΌΠ°Π°Ρ Π½Π΅ΡΡΠΎ ΠΏΠΎΡΠ΅Π±Π½ΠΎ, ΠΏΠ° Π·Π°ΡΠΎΠ° ΠΎΠΏΡΡΠΈΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Π½Π΅ Π²Π°ΠΆΠ°Ρ Π·Π° Π½ΠΈΠ². Π’ΠΎΠ° Π±Π΅ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΎ ΡΠΎ ΡΡΠΎΠ½ΡΠ°Π»Π΅Π½ Π½Π°ΠΏΠ°Π΄ - Π°ΠΊΠΎ ΠΈΠΌΠ° Π°Π»Π°ΡΠΌΠΈ, Π½ΠΎ Π²ΡΡΡΠ½ΠΎΡΡ ΡΓ¨ Π΅ Π²ΠΎ ΡΠ΅Π΄, ΡΠΎΠ³Π°Ρ ΡΡΠ΅Π±Π° Π΄Π° ΠΊΠΎΠΏΠ°ΠΌ ΠΏΠΎΠ΄Π»Π°Π±ΠΎΠΊΠΎ ΠΈ Π΄Π° Π΄ΠΎΠ·Π½Π°Π°ΠΌ Π·ΠΎΡΡΠΎ ΠΌΠ΅ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅Π΄ΡΠ²Π°, ΠΈΠ°ΠΊΠΎ Π½Π΅ ΡΡΠ΅Π±Π°. ΠΠ»ΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ - Π·ΠΎΡΡΠΎ ΠΠ°Π³ΠΈΠΎΡ ΠΏΠ°Π½ΠΈΡΠΈ, Π° ΠΡΠΈΠ½Π³Π° Π½Π΅.
Π§Π΅ΡΠ²ΡΡΠΎ, ΠΠ°Π³ΠΈΠΎΡ ΡΠ°Π±ΠΎΡΠ΅ΡΠ΅ ΡΡΠΊΠ° ΠΏΡΠ΅Π΄ ΠΌΠ΅Π½Π΅ ΡΡΠΈ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΈ Π½Π° ΠΏΠΎΡΠ΅ΡΠΎΠΊΠΎΡ ΠΈΠΌΠ°ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ Π΄ΠΎΠ²Π΅ΡΠ±Π° Π²ΠΎ Π½Π΅Π³ΠΎ ΠΎΡΠΊΠΎΠ»ΠΊΡ Π²ΠΎ ΠΌΠΎΡΠΎΡ Π½ΠΎΠ²ΠΎΡΠΎΡΠΌΠΈΡΠ°Π½ Ρ ΠΈΠΏΡΡΠ΅ΡΡΠΊΠΈ ΡΠΈΡΡΠ΅ΠΌ, ΡΠ°ΠΊΠ° ΡΡΠΎ ΡΠ΅ΠΊΠΎΡ ΠΏΠ°Ρ ΠΊΠΎΠ³Π° ΠΡΠΈΠ½Π³Π° ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΡΠ²Π°ΡΠ΅ ΠΏΠ°Π½ΠΈΠΊΠ°, Π½ΠΈΠΊΠΎΡ Π½Π΅ ΠΏΡΠ°Π²Π΅ΡΠ΅ Π½ΠΈΡΡΠΎ Π΄ΠΎΠ΄Π΅ΠΊΠ° ΠΠ°Π³ΠΈΠΎΡ Π½Π΅ ΡΠ΅ Π²ΠΎΠ·Π±ΡΠ΄ΠΈ Π·Π° ΠΈΡΡΠΎΡΠΎ ΠΏΡΠ°ΡΠ°ΡΠ΅. ΠΠΎ, ΠΌΠ½ΠΎΠ³Ρ ΡΠ΅ΡΠΊΠΎ Icinga Π³Π΅Π½Π΅ΡΠΈΡΠ° Π²ΠΈΡΡΠΈΠ½ΡΠΊΠΈ Π°Π»Π°ΡΠΌΠΈ ΠΏΠΎΡΠ°Π½ΠΎ ΠΎΠ΄ Nagios ΠΈ ΡΠΌΠ΅ΡΠ°ΠΌ Π΄Π΅ΠΊΠ° ΠΎΠ²Π° Π΅ ΡΠ΅ΡΠΈΠΎΠ·Π΅Π½ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, Π·Π° ΠΊΠΎΡ ΡΠ΅ Π·Π±ΠΎΡΡΠ²Π°ΠΌ Π²ΠΎ Π΄Π΅Π»ΠΎΡ βΠΠ°ΠΊΠ»ΡΡΠΎΡΠΈβ.
ΠΠ°ΠΊΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ°, ΠΏΡΡΡΠ°ΡΠ΅ΡΠΎ Π²ΠΎ ΡΠ°Π±ΠΎΡΠ° Π±Π΅ΡΠ΅ ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½ΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΠ΄ 5 ΠΌΠ΅ΡΠ΅ΡΠΈ (ΠΏΠ»Π°Π½ΠΈΡΠ°Π½ΠΎ Π·Π° 28 ΡΡΠ½ΠΈ 2018 Π³ΠΎΠ΄ΠΈΠ½Π°, Π²ΡΡΡΠ½ΠΎΡΡ - 3 Π΄Π΅ΠΊΠ΅ΠΌΠ²ΡΠΈ 2018 Π³ΠΎΠ΄ΠΈΠ½Π°), Π³Π»Π°Π²Π½ΠΎ ΠΏΠΎΡΠ°Π΄ΠΈ βΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΏΠ°ΡΠΈΡΠ΅Ρβ - ΡΠΎΠ° ΡΡΠ°ΡΠ΅ ΠΊΠΎΠ³Π° ΠΈΠΌΠ° Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΡΡΠ»ΡΠ³ΠΈ Π²ΠΎ ΠΠ°Π³ΠΈΠΎΡ ΡΡΠΎ Π½ΠΈΠΊΠΎΡ Π½Π΅ Π³ΠΈ Π·Π½Π°Π΅ Π·Π° Π½Π΅ ΡΠ»ΡΡΠ½Π°Π² Π½ΠΈΡΡΠΎ Π²ΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π³ΠΎΠ΄ΠΈΠ½ΠΈ, Π½ΠΎ Π’ΠΠ§ΠΠ Π‘ΠΠΠ ΠΈΠ·Π΄Π°Π΄ΠΎΠ° ΠΊΡΠΈΡΠΈΠΊΠΈ Π±Π΅Π· ΠΏΡΠΈΡΠΈΠ½Π° ΠΈ ΠΌΠΎΡΠ°Π² Π΄Π° ΠΎΠ±ΡΠ°ΡΠ½Π°ΠΌ Π·ΠΎΡΡΠΎ Π½Π΅ Π±Π΅Π° Π½Π° ΠΌΠΎΡΠΎΡ ΠΏΠ°Π½Π΅Π» ΠΈ ΠΌΠΎΡΠ°Π² Π΄Π° Π³ΠΈ Π΄ΠΎΠ΄Π°Π΄Π°ΠΌ Π²ΠΎ Icinga Π·Π° Π΄Π° βΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° Π½Π° ΠΏΠ°ΡΠΈΡΠ΅Ρ Π΅ ΠΊΠΎΠΌΠΏΠ»Π΅ΡΠ½ΠΎβ (Π‘ΠΈΡΠ΅ ΡΡΠ»ΡΠ³ΠΈ/ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²ΠΎ ΠΠ°Π³ΠΈΠΎΡ ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ°Π°Ρ Π½Π° ΡΡΠ»ΡΠ³ΠΈΡΠ΅/ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈΡΠ΅ Π²ΠΎ ΠΡΠΈΠ½Π³Π°)
ΠΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°:
ΠΡΠ²Π°ΡΠ° Π΅ Π²ΠΎΡΠ½Π°ΡΠ° Code vs Data, ΠΊΠ°ΠΊΠΎ ΡΡΠΎ Π΅ ΠΊΡΠΊΠ»Π΅Π½ ΡΡΠΈΠ». Π‘ΠΈΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, Π°ΠΏΡΠΎΠ»ΡΡΠ½ΠΎ ΡΓ¨, ΠΌΠΎΡΠ° Π΄Π° Π±ΠΈΠ΄Π°Ρ Π²ΠΎ Π₯ΠΈΠ΅ΡΠ° ΠΈ Π½ΠΈΡΡΠΎ Π΄ΡΡΠ³ΠΎ. Π¦Π΅Π»ΠΈΠΎΡ ΠΊΠΎΠ΄ Π΅ Π²ΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈΡΠ΅ .pp. ΠΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, Π°ΠΏΡΡΡΠ°ΠΊΡΠΈΠΈ, ΡΡΠ½ΠΊΡΠΈΠΈ - ΡΓ¨ ΠΎΠ΄ΠΈ Π²ΠΎ ΡΡΡ.
ΠΠ°ΠΊΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ°, ΠΈΠΌΠ°ΠΌΠ΅ Π΅Π΄Π΅Π½ ΠΊΡΠΏ Π²ΠΈΡΡΡΠ΅Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ (165 Π²ΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΡ Π½Π° ΠΏΠΈΡΡΠ²Π°ΡΠ΅) ΠΈ 68 Π²Π΅Π±-Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΊΠΎΠΈ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΡΠ»Π΅Π΄Π°Ρ Π·Π° ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠΈΡΠ΅ ΠΈ Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡΠ° Π½Π° SSL ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ΅. ΠΠΎ, ΠΏΠΎΡΠ°Π΄ΠΈ ΠΈΡΡΠΎΡΠΈΡΠΊΠΈΡΠ΅ Ρ
Π΅ΠΌΠΎΡΠΎΠΈΠ΄ΠΈ, ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈΡΠ΅ Π·Π° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈΡΠ΅ ΡΠ΅ Π·Π΅ΠΌΠ΅Π½ΠΈ ΠΎΠ΄ ΠΏΠΎΡΠ΅Π±Π½ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ Π½Π° gitlab ΠΈ ΡΠΎΡΠΌΠ°ΡΠΎΡ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ Π½Π΅ Π΅ ΠΏΡΠΎΠΌΠ΅Π½Π΅Ρ ΠΎΠ΄ Puppet 3, ΡΡΠΎ ΡΠΎΠ·Π΄Π°Π²Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΡΠ»ΠΎΠΆΠ΅Π½ΠΎΡΡ Π²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ°.
ΠΡΠΊΠ»Π°-ΠΊΠΎΠ΄ Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ, Π·Π°ΡΡΠΈΡΠ΅ΡΠ΅ Π³ΠΈ ΠΎΡΠΈΡΠ΅
define profiles::services::monitoring::docker_apps(
Hash $app_list,
Hash $apps_accessible_from,
Hash $apps_access_list,
Hash $webhost_defaults,
Hash $webcheck_defaults,
Hash $service_overrides,
Hash $targets,
Hash $app_checks,
)
{
#### APPS ####
$zone = $name
$app_list.each | String $app_name, Hash $app_data |
{
$notify_group = { 'notify_group' => ($webcheck_defaults[$zone]['notify_group'] + pick($app_data['notify_group'], {} )) } # adds notifications for default group (systems) + any group defined in int/pm_docker_apps.eyaml
$data = merge($webhost_defaults, $apps_accessible_from, $app_data)
$site_domain = $app_data['site_domain']
$regexp = pick($app_data['check_regex'], 'html') # Pick a regex to check
$check_url = $app_data['check_url'] ? {
undef => { 'http_uri' => '/' },
default => { 'http_uri' => $app_data['check_url'] }
}
$check_regex = $regexp ?{
'absent' => {},
default => {'http_expect_body_regex' => $regexp}
}
$site_domain.each | String $vhost, Hash $vdata | { # Split an app by domains if there are two or more
$vhost_name = {'http_vhost' => $vhost}
$vars = $data['vars'] + $vhost_name + $check_regex + $check_url
$web_ipaddress = is_array($vdata['web_ipaddress']) ? { # Make IP-address an array if it's not, because askizzy has 2 ips and it's an array
true => $vdata['web_ipaddress'],
false => [$vdata['web_ipaddress']],
}
$access_from_zones = [$zone] + $apps_access_list[$data['accessible_from']] # Merge default zone (where the app is defined) and extra zones if they exist
$web_ipaddress.each | String $ip_address | { # For each IP (if we have multiple)
$suffix = length($web_ipaddress) ? { # If we have more than one - add IP as a suffix to this hostname to avoid duplicating resources
1 => '',
default => "_${ip_address}"
}
$octets = split($ip_address, '.')
$ip_tag = "${octets[2]}.${octets[3]}" # Using last octet only causes a collision between nginx-vip 203.15.70.94 and ext. ip 49.255.194.94
$access_from_zones.each | $zone_prefix |{
$zone_target = $targets[$zone_prefix]
$nginx_vip_name = "${zone_prefix}_nginx-vip-${ip_tag}" # If it's a host for ext - prefix becomes 'ext_' (ext_nginx-vip...)
$nginx_host_vip = {
$nginx_vip_name => {
ensure => present,
target => $zone_target,
address => $ip_address,
check_command => 'hostalive',
groups => ['nginx_vip',],
}
}
$ssl_vars = $app_checks['ssl']
$regex_vars = $app_checks['http'] + $vars + $webcheck_defaults[$zone] + $notify_group
if !defined( Profiles::Services::Monitoring::Host[$nginx_vip_name] ) {
ensure_resources('profiles::services::monitoring::host', $nginx_host_vip)
}
if !defined( Icinga2::Object::Service["${nginx_vip_name}_ssl"] ) {
icinga2::object::service {"${nginx_vip_name}_ssl":
ensure => $data['ensure'],
assign => ["host.name == $nginx_vip_name",],
groups => ['webchecks',],
check_command => 'ssl',
check_interval => $service_overrides['ssl']['check_interval'],
target => $targets['services'],
apply => true,
vars => $ssl_vars
}
}
if $regexp != 'absent'{
if !defined(Icinga2::Object::Service["${vhost}${$suffix} regex"]){
icinga2::object::service {"${vhost}${$suffix} regex":
ensure => $data['ensure'],
assign => ["match(*_nginx-vip-${ip_tag}, host.name)",],
groups => ['webchecks',],
check_command => 'http',
check_interval => $service_overrides['regex']['check_interval'],
target => $targets['services'],
enable_flapping => true,
apply => true,
vars => $regex_vars
}
}
}
}
}
}
}
}ΠΠΎΠ΄ΠΎΡ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π·Π° Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΈΡΠ΅ ΠΈ ΡΡΠ»ΡΠ³ΠΈΡΠ΅ ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΠΈΠ·Π³Π»Π΅Π΄Π° ΡΡΡΠ°ΡΠ½ΠΎ:
monitoring/config.pp
class profiles::services::monitoring::config(
Array $default_config,
Array $hostgroups,
Hash $hosts = {},
Hash $host_defaults,
Hash $services,
Hash $service_defaults,
Hash $service_overrides,
Hash $webcheck_defaults,
Hash $servicegroups,
String $servicegroup_target,
Hash $user_defaults,
Hash $users,
Hash $oncall,
Hash $usergroup_defaults,
Hash $usergroups,
Hash $notifications,
Hash $notification_defaults,
Hash $notification_commands,
Hash $timeperiods,
Hash $webhost_defaults,
Hash $apps_access_list,
Hash $check_commands,
Hash $hosts_api = {},
Hash $targets = {},
Hash $host_api_defaults = {},
)
{
# Profiles::Services::Monitoring::Hostgroup <<| |>> # will be enabled when we move to icinga completely
#### APPS ####
case $location {
'int', 'ext': {
$apps_by_zone = {}
}
'pm': {
$int_apps = hiera('int_docker_apps')
$int_app_defaults = hiera('int_docker_app_common')
$st_apps = hiera('staging_docker_apps')
$srs_apps = hiera('pm_docker_apps_srs')
$pm_apps = hiera('pm_docker_apps') + $st_apps + $srs_apps
$pm_app_defaults = hiera('pm_docker_app_common')
$apps_by_zone = {
'int' => $int_apps,
'pm' => $pm_apps,
}
$app_access_by_zone = {
'int' => {'accessible_from' => $int_app_defaults['accessible_from']},
'pm' => {'accessible_from' => $pm_app_defaults['accessible_from']},
}
}
default: {
fail('Please ensure the node has $location fact set (int, pm, ext)')
}
}
file { '/etc/icinga2/conf.d/':
ensure => directory,
recurse => true,
purge => true,
owner => 'icinga',
group => 'icinga',
mode => '0750',
notify => Service['icinga2'],
}
$default_config.each | String $file_name |{
file {"/etc/icinga2/conf.d/${file_name}":
ensure => present,
source => "puppet:///modules/profiles/services/monitoring/default_config/${file_name}",
owner => 'icinga',
group => 'icinga',
mode => '0640',
}
}
$app_checks = {
'ssl' => $services['webchecks']['checks']['ssl']['vars'],
'http' => $services['webchecks']['checks']['http_regexp']['vars']
}
$apps_by_zone.each | String $zone, Hash $app_list | {
profiles::services::monitoring::docker_apps{$zone:
app_list => $app_list,
apps_accessible_from => $app_access_by_zone[$zone],
apps_access_list => $apps_access_list,
webhost_defaults => $webhost_defaults,
webcheck_defaults => $webcheck_defaults,
service_overrides => $service_overrides,
targets => $targets,
app_checks => $app_checks,
}
}
#### HOSTS ####
# Profiles::Services::Monitoring::Host <<| |>> # This is for spaceship invasion when it's ready.
$hosts_has_large_disks = query_nodes('mountpoints.*.size_bytes >= 1099511627776')
$hosts.each | String $hostgroup, Hash $list_of_hosts_with_settings | { # Splitting site lists by hostgroups - docker_host/gluster_host/etc
$list_of_hosts_in_group = $list_of_hosts_with_settings['hosts']
$hostgroup_settings = $list_of_hosts_with_settings['settings']
$merged_hostgroup_settings = deep_merge($host_defaults, $list_of_hosts_with_settings['settings'])
$list_of_hosts_in_group.each | String $host_name, Hash $host_settings |{ # Splitting grouplists by hosts
# Is this host in the array $hosts_has_large_disks ? If so set host.vars.has_large_disks
if ( $hosts_has_large_disks.reduce(false) | $found, $value| { ( $value =~ "^${host_name}" ) or $found } ) {
$vars_has_large_disks = { 'has_large_disks' => true }
} else {
$vars_has_large_disks = {}
}
$host_data = deep_merge($merged_hostgroup_settings, $host_settings)
$hostgroup_settings_vars = pick($hostgroup_settings['vars'], {})
$host_settings_vars = pick($host_settings['vars'], {})
$host_notify_group = delete_undef_values($host_defaults['vars']['notify_group'] + $hostgroup_settings_vars['notify_group'] + $host_settings_vars['notify_group'])
$host_data_vars = delete_undef_values(deep_merge($host_data['vars'] , {'notify_group' => $host_notify_group}, $vars_has_large_disks)) # Merging vars separately
$hostgroups = delete_undef_values([$hostgroup] + $host_data['groups'])
profiles::services::monitoring::host{$host_name:
ensure => $host_data['ensure'],
display_name => $host_data['display_name'],
address => $host_data['address'],
groups => $hostgroups,
target => $host_data['target'],
check_command => $host_data['check_command'],
check_interval => $host_data['check_interval'],
max_check_attempts => $host_data['max_check_attempts'],
vars => $host_data_vars,
template => $host_data['template'],
}
}
}
if !empty($hosts_api){ # All hosts managed by API
$hosts_api.each | String $zone, Hash $hosts_api_zone | { # Split api hosts by zones
$hosts_api_zone.each | String $hostgroup, Hash $list_of_hosts_with_settings | { # Splitting site lists by hostgroups - docker_host/gluster_host/etc
$list_of_hosts_in_group = $list_of_hosts_with_settings['hosts']
$hostgroup_settings = $list_of_hosts_with_settings['settings']
$merged_hostgroup_settings = deep_merge($host_api_defaults, $list_of_hosts_with_settings['settings'])
$list_of_hosts_in_group.each | String $host_name, Hash $host_settings |{ # Splitting grouplists by hosts
# Is this host in the array $hosts_has_large_disks ? If so set host.vars.has_large_disks
if ( $hosts_has_large_disks.reduce(false) | $found, $value| { ( $value =~ "^${host_name}" ) or $found } ) {
$vars_has_large_disks = { 'has_large_disks' => true }
} else {
$vars_has_large_disks = {}
}
$host_data = deep_merge($merged_hostgroup_settings, $host_settings)
$hostgroup_settings_vars = pick($hostgroup_settings['vars'], {})
$host_settings_vars = pick($host_settings['vars'], {})
$host_api_notify_group = delete_undef_values($host_defaults['vars']['notify_group'] + $hostgroup_settings_vars['notify_group'] + $host_settings_vars['notify_group'])
$host_data_vars = delete_undef_values(deep_merge($host_data['vars'] , {'notify_group' => $host_api_notify_group}, $vars_has_large_disks))
$hostgroups = delete_undef_values([$hostgroup] + $host_data['groups'])
if defined(Profiles::Services::Monitoring::Host[$host_name]){
$hostname = "${host_name}_from_${zone}"
}
else
{
$hostname = $host_name
}
profiles::services::monitoring::host{$hostname:
ensure => $host_data['ensure'],
display_name => $host_data['display_name'],
address => $host_data['address'],
groups => $hostgroups,
target => "${host_data['target_base']}/${zone}/hosts.conf",
check_command => $host_data['check_command'],
check_interval => $host_data['check_interval'],
max_check_attempts => $host_data['max_check_attempts'],
vars => $host_data_vars,
template => $host_data['template'],
}
}
}
}
}
#### END OF HOSTS ####
#### SERVICES ####
$services.each | String $service_group, Hash $s_list |{ # Service_group and list of services in that group
$service_list = $s_list['checks'] # List of actual checks, separately from SG settings
$service_list.each | String $service_name, Hash $data |{
$merged_defaults = merge($service_defaults, $s_list['settings']) # global service defaults + service group defaults
$merged_data = merge($merged_defaults, $data)
$settings_vars = pick($s_list['settings']['vars'], {})
$this_service_vars = pick($data['vars'], {})
$all_service_vars = delete_undef_values($service_defaults['vars'] + $settings_vars + $this_service_vars)
# If we override default check_timeout, but not nrpe_timeout, make nrpe_timeout the same as check_timeout
if ( $merged_data['check_timeout'] and ! $this_service_vars['nrpe_timeout'] ) {
# NB: Icinga will convert 1m to 60 automatically!
$nrpe = { 'nrpe_timeout' => $merged_data['check_timeout'] }
} else {
$nrpe = {}
}
# By default we use nrpe and all commands are run via nrpe. So vars.nrpe_command = $service_name is a default value
# If it's server-side Icinga command - we don't need 'nrpe_command'
# but there is no harm to have that var and the code is shorter
if $merged_data['check_command'] == 'nrpe'{
$check_command = $merged_data['vars']['nrpe_command'] ? {
undef => { 'nrpe_command' => $service_name },
default => { 'nrpe_command' => $merged_data['vars']['nrpe_command'] }
}
}else{
$check_command = {}
}
# Assembling $vars from Global Default service settings, servicegroup settings, this particular check settings and let's not forget nrpe settings.
if $all_service_vars['graphite_template'] {
$graphite_template = {'check_command' => $all_service_vars['graphite_template']}
}else{
$graphite_template = {'check_command' => $service_name}
}
$service_notify = [] + pick($settings_vars['notify_group'], []) + pick($this_service_vars['notify_group'], []) # pick is required everywhere, otherwise becomes "The value '' cannot be converted to Numeric"
$service_notify_group = $service_notify ? {
[] => $service_defaults['vars']['notify_group'],
default => $service_notify
} # Assing default group (systems) if no other groups are defined
$vars = $all_service_vars + $nrpe + $check_command + $graphite_template + {'notify_group' => $service_notify_group}
# This needs to be merged separately, because merging it as part of MERGED_DATA overwrites arrays instead of merging them, so we lose some "assign" and "ignore" values
$assign = delete_undef_values($service_defaults['assign'] + $s_list['settings']['assign'] + $data['assign'])
$ignore = delete_undef_values($service_defaults['ignore'] + $s_list['settings']['ignore'] + $data['ignore'])
icinga2::object::service {$service_name:
ensure => $merged_data['ensure'],
apply => $merged_data['apply'],
enable_flapping => $merged_data['enable_flapping'],
assign => $assign,
ignore => $ignore,
groups => [$service_group],
check_command => $merged_data['check_command'],
check_interval => $merged_data['check_interval'],
check_timeout => $merged_data['check_timeout'],
check_period => $merged_data['check_period'],
display_name => $merged_data['display_name'],
event_command => $merged_data['event_command'],
retry_interval => $merged_data['retry_interval'],
max_check_attempts => $merged_data['max_check_attempts'],
target => $merged_data['target'],
vars => $vars,
template => $merged_data['template'],
}
}
}
#### END OF SERVICES ####
#### OTHER BORING STUFF ####
$servicegroups.each | $servicegroup, $description |{
icinga2::object::servicegroup{ $servicegroup:
target => $servicegroup_target,
display_name => $description
}
}
$hostgroups.each| String $hostgroup |{
profiles::services::monitoring::hostgroup { $hostgroup:}
}
$notifications.each | String $name, Hash $settings |{
$assign = pick($notification_defaults['assign'], []) + $settings['assign']
$ignore = pick($notification_defaults['ignore'], []) + $settings['ignore']
$merged_settings = $settings + $notification_defaults
icinga2::object::notification{$name:
target => $merged_settings['target'],
apply => $merged_settings['apply'],
apply_target => $merged_settings['apply_target'],
command => $merged_settings['command'],
interval => $merged_settings['interval'],
states => $merged_settings['states'],
types => $merged_settings['types'],
assign => delete_undef_values($assign),
ignore => delete_undef_values($ignore),
user_groups => $merged_settings['user_groups'],
period => $merged_settings['period'],
vars => $merged_settings['vars'],
}
}
# Merging notification settings for users with other settings
$users_oncall = deep_merge($users, $oncall)
# Magic. Do not touch.
create_resources('icinga2::object::user', $users_oncall, $user_defaults)
create_resources('icinga2::object::usergroup', $usergroups, $usergroup_defaults)
create_resources('icinga2::object::timeperiod',$timeperiods)
create_resources('icinga2::object::checkcommand', $check_commands)
create_resources('icinga2::object::notificationcommand', $notification_commands)
profiles::services::sudoers { 'icinga_runs_ping_l2':
ensure => present,
sudoersd_template => 'profiles/os/redhat/centos7/sudoers/icinga.erb',
}
}Π‘Γ¨ ΡΡΡΠ΅ ΡΠ°Π±ΠΎΡΠ°ΠΌ Π½Π° ΠΎΠ²ΠΈΠ΅ ΡΠ΅ΡΡΠ΅Π½ΠΈΠ½ΠΈ ΠΈ Π³ΠΈ ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°ΠΌ Π½Π°ΡΠ΄ΠΎΠ±ΡΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ°ΠΌ. Π‘Π΅ΠΏΠ°ΠΊ, ΡΠΎΠΊΠΌΡ ΠΎΠ²ΠΎΡ ΠΊΠΎΠ΄ Π½ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½Π° ΠΈ ΡΠ°Π·Π±ΠΈΡΠ»ΠΈΠ²Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠ° Π²ΠΎ Hiera:
ΠΠΎΠ΄Π°ΡΠΎΡΠΈ
profiles::services::monitoring::config::services:
perf_checks:
settings:
check_interval: '2m'
assign:
- 'host.vars.type == linux'
checks:
procs: {}
load: {}
memory: {}
disk:
check_interval: '5m'
vars:
notification_period: '24x7'
disk_iops:
vars:
notifications:
- 'silent'
cpu:
vars:
notifications:
- 'silent'
dns_fqdn:
check_interval: '15m'
ignore:
- 'xenserver in host.groups'
vars:
notifications:
- 'silent'
iftraffic_nrpe:
vars:
notifications:
- 'silent'
logging:
settings:
assign:
- 'logserver in host.groups'
checks:
rsyslog: {}
nginx_limit_req_other: {}
nginx_limit_req_s2s: {}
nginx_limit_req_s2x: {}
nginx_limit_req_srs: {}
logstash: {}
logstash_api:
vars:
notifications:
- 'silent'Π‘ΠΈΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ΅ ΠΏΠΎΠ΄Π΅Π»Π΅Π½ΠΈ Π²ΠΎ Π³ΡΡΠΏΠΈ, ΡΠ΅ΠΊΠΎΡΠ° Π³ΡΡΠΏΠ° ΠΈΠΌΠ° ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΈ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈ ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅ ΠΊΠ°Π΄Π΅ ΠΈ ΠΊΠΎΠ»ΠΊΡ ΡΠ΅ΡΡΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°Π°Ρ ΠΎΠ²ΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ, ΠΊΠ°ΠΊΠ²ΠΈ ΠΈΠ·Π²Π΅ΡΡΡΠ²Π°ΡΠ° Π΄Π° ΡΠ΅ ΠΈΡΠΏΡΠ°ΡΠ°Π°Ρ ΠΈ Π½Π° ΠΊΠΎΠ³ΠΎ.
ΠΠΎ ΡΠ΅ΠΊΠΎΡΠ° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ° ΠΎΡΡΡΠ»ΠΈΡΠ΅ ΡΠ΅ΠΊΠΎΡΠ° ΠΎΠΏΡΠΈΡΠ°, ΠΈ ΡΠ΅ΡΠΎ ΠΎΠ²Π° Π½Π° ΠΊΡΠ°ΡΠΎΡ ΡΠ΅ ΡΠΎΠ±ΠΈΡΠ° Π΄ΠΎ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΈΡΠ΅ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈ Π½Π° ΡΠΈΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΊΠ°ΠΊΠΎ ΡΠ΅Π»ΠΈΠ½Π°. ΠΠ°ΡΠΎΠ° ΡΠ°ΠΊΠ²ΠΈΡΠ΅ Π³Π»ΡΠΏΠΎΡΡΠΈ ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ Π²ΠΎ config.pp - Π³ΠΈ ΡΠΏΠΎΡΡΠ²Π° ΡΠΈΡΠ΅ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΈ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈ ΡΠΎ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈΡΠ΅ Π½Π° Π³ΡΡΠΏΠ°ΡΠ°, Π° ΠΏΠΎΡΠΎΠ° ΡΠΎ ΡΠ΅ΠΊΠΎΡΠ° ΠΏΠΎΠ΅Π΄ΠΈΠ½Π΅ΡΠ½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°.
ΠΡΡΠ³Π° ΠΌΠ½ΠΎΠ³Ρ Π²Π°ΠΆΠ½Π° ΠΏΡΠΎΠΌΠ΅Π½Π° Π±Π΅ΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎΡΡΠ° Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΠΎ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈΡΠ΅, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° Π·Π° Π·Π°ΠΌΠ΅Π½Π° Π½Π° ΠΏΠΎΡΡΠ°ΡΠ°, Π°Π΄ΡΠ΅ΡΠ°ΡΠ° ΠΈ URL-ΡΠΎ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° http_regex.
http_regexp:
assign:
- 'host.vars.http_regex'
- 'static_sites in host.groups'
check_command: 'http'
check_interval: '1m'
retry_interval: '20s'
max_check_attempts: 6
http_port: '{{ if(host.vars.http_port) { return host.vars.http_port } else { return 443 } }}'
vars:
notification_period: 'host.vars.notification_period'
http_vhost: '{{ if(host.vars.http_vhost) { return host.vars.http_vhost } else { return host.name } }}'
http_ssl: '{{ if(host.vars.http_ssl) { return false } else { return true } }}'
http_expect_body_regex: 'host.vars.http_regex'
http_uri: '{{ if(host.vars.http_uri) { return host.vars.http_uri } else { return "/" } }}'
http_onredirect: 'follow'
http_warn_time: 8
http_critical_time: 15
http_timeout: 30
http_sni: trueΠΠ²Π° Π·Π½Π°ΡΠΈ - Π°ΠΊΠΎ ΠΈΠΌΠ° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π²ΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠΈΡΠ°ΡΠ° Π½Π° Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΎΡ http_port β ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π³ΠΎ, ΠΈΠ½Π°ΠΊΡ 443. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, Π²Π΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡΠΎΡ jabber Π²ΠΈΡΠΈ Π½Π° 9090, Π° Unifi Π²ΠΈΡΠΈ Π½Π° 7443.
http_vhost Π·Π½Π°ΡΠΈ ΠΈΠ³Π½ΠΎΡΠΈΡΠ°ΡΡΠ΅ Π³ΠΎ DNS ΠΈ Π·Π΅ΠΌΠ΅ΡΠ΅ ΡΠ° ΠΎΠ²Π°Π° Π°Π΄ΡΠ΅ΡΠ°.
ΠΠΊΠΎ ΡΡΠΈ Π΅ Π½Π°Π²Π΅Π΄Π΅Π½ Π²ΠΎ Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΎΡ, ΡΠΎΠ³Π°Ρ ΡΠ»Π΅Π΄Π΅ΡΠ΅ Π³ΠΎ, ΠΈΠ½Π°ΠΊΡ Π·Π΅ΠΌΠ΅ΡΠ΅ β/β.
ΠΠ·Π»Π΅Π·Π΅ ΡΠΌΠ΅ΡΠ½Π° ΠΏΡΠΈΠΊΠ°Π·Π½Π° ΡΠΎ http_ssl - ΠΎΠ²Π°Π° ΠΈΠ½ΡΠ΅ΠΊΡΠΈΡΠ° Π½Π΅ ΡΠ°ΠΊΠ°ΡΠ΅ Π΄Π° ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠΈ Π½Π° Π±Π°ΡΠ°ΡΠ΅. ΠΠ΅Π² Π·Π±ΡΠ½Π΅Ρ ΠΎΠΊΠΎΠ»Ρ ΠΎΠ²Π°Π° Π»ΠΈΠ½ΠΈΡΠ° Π΄ΠΎΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½Π΅ ΠΌΠΈ ΠΏΠ°Π΄Π½Π° Π½Π° ΠΏΠ°ΠΌΠ΅Ρ Π΄Π΅ΠΊΠ° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° Π²ΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠΈΡΠ°ΡΠ° Π½Π° Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΎΡ Π΅:
http_ssl: falseΠΠ°ΠΌΠ΅Π½Π΅Ρ Π²ΠΎ ΠΈΠ·ΡΠ°Π·ΡΠ²Π°ΡΠ΅
if(host.vars.http_ssl) { return false } else { return true }ΠΊΠ°ΠΊΠΎ Π»Π°ΠΆΠ½ΠΈ ΠΈ Π½Π° ΠΊΡΠ°ΡΠΎΡ ΠΈΡΠΏΠ°ΡΠ°
if(false) { return false } else { return true }ΠΎΠ΄Π½ΠΎΡΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° ssl Π΅ ΡΠ΅ΠΊΠΎΠ³Π°Ρ Π°ΠΊΡΠΈΠ²Π½Π°. ΠΠΎ ΡΠ΅ΡΠΈΠ² ΡΠΎ Π·Π°ΠΌΠ΅Π½Π° Π½Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠ°ΡΠ°:
http_ssl: noΠΠ°ΠΎΠ΄ΠΈ:
ΠΠΎΠ·ΠΈΡΠΈΠ²Π½ΠΈ:
- Π‘Π΅Π³Π° ΠΈΠΌΠ°ΠΌΠ΅ Π΅Π΄Π΅Π½ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΡΠΈΡΡΠ΅ΠΌ, Π° Π½Π΅ Π΄Π²Π°, ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΠΈΠΌΠ°Π²ΠΌΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ 7-8 ΠΌΠ΅ΡΠ΅ΡΠΈ, ΠΈΠ»ΠΈ Π΅Π΄Π΅Π½ ΠΊΠΎΡ Π΅ Π·Π°ΡΡΠ°ΡΠ΅Π½ ΠΈ ΡΠ°Π½Π»ΠΈΠ².
- Π‘ΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π·Π° Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΈ/ΡΡΠ»ΡΠ³ΠΈ (ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ) ΡΠ΅Π³Π° Π΅ (ΡΠΏΠΎΡΠ΅Π΄ ΠΌΠΎΠ΅ ΠΌΠΈΡΠ»Π΅ΡΠ΅) ΠΌΠ½ΠΎΠ³Ρ ΠΏΠΎΡΠΈΡΠ»ΠΈΠ²Π° ΠΈ ΡΠ°Π·Π±ΠΈΡΠ»ΠΈΠ²Π°. ΠΠ° Π΄ΡΡΠ³ΠΈ, ΠΎΠ²Π° ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ° Π΄Π΅ΠΊΠ° Π½Π΅ Π΅ ΡΠΎΠ»ΠΊΡ ΠΎΡΠΈΠ³Π»Π΅Π΄Π½ΠΎ, ΠΏΠ° ΠΌΠΎΡΠ°Π² Π΄Π° ΠΎΠ±ΡΠ°Π²Π°ΠΌ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΡΡΡΠ°Π½ΠΈΡΠΈ Π½Π° Π»ΠΎΠΊΠ°Π»Π½ΠΎΡΠΎ Π²ΠΈΠΊΠΈ Π·Π° Π΄Π° ΠΎΠ±ΡΠ°ΡΠ½Π°ΠΌ ΠΊΠ°ΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ° ΡΠ΅ΡΠΎ ΡΠΎΠ° ΠΈ ΡΡΠΎ Π΄Π° ΡΡΠ΅Π΄ΡΠ²Π°ΠΌ ΠΊΠ°Π΄Π΅.
- ΠΠΎΠΆΠ½ΠΎ Π΅ ΡΠ»Π΅ΠΊΡΠΈΠ±ΠΈΠ»Π½ΠΎ Π΄Π° ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈ http_regexp, ΡΠ°ΠΊΠ°Π½ΠΈΠΎΡ ΠΎΠ±ΡΠ°Π·Π΅Ρ, ΠΊΠΎΠ΄ΠΎΡ Π·Π° Π²ΡΠ°ΡΠ°ΡΠ΅, URL-ΡΠΎ ΠΈ ΠΏΠΎΡΡΠ°ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠ°Π²Π°Ρ Π²ΠΎ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈΡΠ΅ Π½Π° Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΎΡ.
- ΠΠΎΡΡΠΎΡΠ°Ρ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Π½ΠΈ ΡΠ°Π±Π»ΠΈ, Π·Π° ΡΠ΅ΠΊΠΎΡΠ° ΠΎΠ΄ Π½ΠΈΠ² ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΡΠ΅ ΡΠ²ΠΎΡΠ° ΡΠΎΠΏΡΡΠ²Π΅Π½Π° Π»ΠΈΡΡΠ° Π½Π° ΠΏΡΠΈΠΊΠ°ΠΆΠ°Π½ΠΈ Π°Π»Π°ΡΠΌΠΈ ΠΈ Π΄Π° ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΡΠΎ ΡΠ΅ΡΠΎ ΡΠΎΠ° ΠΏΡΠ΅ΠΊΡ ΠΊΡΠΊΠ»ΠΈ ΠΈ Π±Π°ΡΠ°ΡΠ° Π·Π° ΡΠΏΠΎΡΡΠ²Π°ΡΠ΅.
ΠΠΎΠ½Ρ:
- ΠΠ½Π΅ΡΡΠΈΡΠ° Π½Π° ΡΠ»Π΅Π½ΠΎΠ²ΠΈΡΠ΅ Π½Π° ΡΠΈΠΌΠΎΡ - ΠΠ°Π³ΠΈΠΎΡ ΡΠ°Π±ΠΎΡΠ΅ΡΠ΅, ΡΠ°Π±ΠΎΡΠ΅ΡΠ΅ ΠΈ ΡΠ°Π±ΠΎΡΠ΅ΡΠ΅, Π° ΠΎΠ²Π°Π° ΡΠ²ΠΎΡΠ° ΠΡΠΈΠ½Π³Π° Π΅ ΠΏΠΎΡΡΠΎΡΠ°Π½ΠΎ ΠΊΠ°Π±ΡΠΈΠΎΠ»Π΅Ρ ΠΈ Π±Π°Π²Π½Π°. ΠΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΈΡΡΠΎΡΠΈΡΠ°ΡΠ° ΠΎΠ²Π΄Π΅? Π, ΠΏΠΎ ΡΠ°Π²ΠΎΠ»ΠΈΡΠ΅, Π½Π΅ Π΅ Π°ΠΆΡΡΠΈΡΠ°Π½... (ΠΠΈΡΡΠΈΠ½ΡΠΊΠΈΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π΅ ΡΡΠΎ ΠΈΡΡΠΎΡΠΈΡΠ°ΡΠ° Π½Π° Π°Π»Π°ΡΠΌΠΎΡ Π½Π΅ ΡΠ΅ Π°ΠΆΡΡΠΈΡΠ° Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΈ, ΡΠ°ΠΌΠΎ ΡΠΎ F5)
- ΠΠ½Π΅ΡΡΠΈΡΠ°ΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ - ΠΊΠΎΠ³Π° ΡΠ΅ ΠΊΠ»ΠΈΠΊΠ½Π°ΠΌ Π½Π° βΠ°ΠΆΡΡΠΈΡΠ°Ρβ (ΠΏΡΠΎΠ²Π΅ΡΠ΅ΡΠ΅ ΡΠ΅Π³Π°) Π²ΠΎ Π²Π΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡΠΎΡ - ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΎΡ ΠΎΠ΄ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ Π·Π°Π²ΠΈΡΠΈ ΠΎΠ΄ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΠΠ°ΡΡ, ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΠΎΠ΄ ΡΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠ΅ ΡΡΠ»ΡΠ³ΠΈ Π·Π° ΠΊΠΎΠΈ ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ Π΄Π΅ΡΠ΅ΡΠΈΡΠΈ ΡΠ΅ΠΊΡΠ½Π΄ΠΈ Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅. Π’Π°ΠΊΠΎΠ² ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π΅ Π½ΠΎΡΠΌΠ°Π»Π΅Π½.

- ΠΠ΅Π½Π΅ΡΠ°Π»Π½ΠΎ, ΡΠΏΠΎΡΠ΅Π΄ ΡΠ΅ΡΡΠΌΠ΅ΡΠ΅ΡΠ½Π°ΡΠ° ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° Π΄Π²Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ°ΠΌΠΎ Π΄ΠΎ ΡΠ°ΠΌΠΎ, ΠΠ°Π³ΠΈΠΎΡ ΡΠ΅ΠΊΠΎΠ³Π°Ρ ΡΠ°Π±ΠΎΡΠ΅ΡΠ΅ ΠΏΠΎΠ±ΡΠ·ΠΎ ΠΎΠ΄ ΠΡΠΈΠ½Π³Π° ΠΈ ΡΠΎΠ° Π½Π°Π²ΠΈΡΡΠΈΠ½Π° ΠΌΠ΅ Π½Π΅ΡΠ²ΠΈΡΠ°ΡΠ΅. ΠΠΈ ΡΠ΅ ΡΠΈΠ½ΠΈ Π΄Π΅ΠΊΠ° Π·Π±ΡΠΊΠ°Π»Π΅ Π½Π΅ΡΡΠΎ ΡΠΎ ΡΠ°ΡΠΌΠ΅ΡΠΈΡΠ΅ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° ΡΠ΅ ΠΏΡΠ°Π²ΠΈ Π½Π° ΡΠ΅ΠΊΠΎΠΈ ΠΏΠ΅Ρ ΠΌΠΈΠ½ΡΡΠΈ, Π²ΡΡΡΠ½ΠΎΡΡ ΡΠΎΠ° ΡΠ΅ ΡΠ»ΡΡΡΠ²Π° Π½Π° ΡΠ΅ΠΊΠΎΠΈ 5:30 ΠΈΠ»ΠΈ Π½Π΅ΡΡΠΎ ΡΠ»ΠΈΡΠ½ΠΎ.
- ΠΠΊΠΎ ΡΠ° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΡΡΠ»ΡΠ³Π°ΡΠ° Π²ΠΎ ΡΠ΅ΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΠ΅ (systemctl ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΡΡΠ΅ icinga2) - ΡΠΈΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΡΠΎ Π±Π΅Π° Π²ΠΎ ΡΠ΅ΠΊ Π²ΠΎ ΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π°Ρ ΠΊΡΠΈΡΠΈΡΠ΅Π½ Π°Π»Π°ΡΠΌ Π½Π° Π΅ΠΊΡΠ°Π½ΠΎΡ ΠΈ ΠΎΠ΄Π½Π°Π΄Π²ΠΎΡ ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΊΠ°ΠΊΠΎ ΡΓ¨ Π΄Π° ΠΏΠ°Π΄Π½Π°Π»ΠΎ ().
ΠΠΎ, Π³Π΅Π½Π΅ΡΠ°Π»Π½ΠΎ, ΡΠΎΠ° ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ°.
ΠΠ·Π²ΠΎΡ: www.habr.com

