ΠœΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Π° ΠΎΠ΄ Нагиос Π²ΠΎ Π˜Ρ†ΠΈΠ½Π³Π°2 Π²ΠΎ ΠΠ²ΡΡ‚Ρ€Π°Π»ΠΈΡ˜Π°

Π—Π΄Ρ€Π°Π²ΠΎ Π½Π° ситС

Јас сум систСмски администратор Π½Π° Линукс, сС прСсСлив ΠΎΠ΄ Π ΡƒΡΠΈΡ˜Π° Π²ΠΎ ΠΠ²ΡΡ‚Ρ€Π°Π»ΠΈΡ˜Π° со нСзависна профСсионална Π²ΠΈΠ·Π° Π²ΠΎ 2015 Π³ΠΎΠ΄ΠΈΠ½Π°, Π½ΠΎ ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°Ρ‚Π° Π½Π΅ΠΌΠ° Π΄Π° Π±ΠΈΠ΄Π΅ Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΡ€ Π·Π° свиња. Π’Π΅ΡœΠ΅ ΠΈΠΌΠ° Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ Ρ‚Π°ΠΊΠ²ΠΈ написи (сСпак, Π°ΠΊΠΎ ΠΈΠΌΠ° интСрСс, ќС ΠΏΠΈΡˆΡƒΠ²Π°ΠΌ ΠΈ Π·Π° ΠΎΠ²Π°), ΠΏΠ° Π±ΠΈ сакал Π΄Π° Π·Π±ΠΎΡ€ΡƒΠ²Π°ΠΌ Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ, Π½Π° ΠΌΠΎΡ˜Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π° Π²ΠΎ ΠΠ²ΡΡ‚Ρ€Π°Π»ΠΈΡ˜Π° ΠΊΠ°ΠΊΠΎ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ Π·Π° Linux-ops, ΠΈΠ½ΠΈΡ†ΠΈΡ€Π°Π² ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Π° ΠΎΠ΄ Π΅Π΄Π΅Π½ систСмски ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Π½Π° Π΄Ρ€ΡƒΠ³. ΠŸΠΎΡ‚ΠΎΡ‡Π½ΠΎ - Nagios => Icinga2.

Π‘Ρ‚Π°Ρ‚ΠΈΡ˜Π°Ρ‚Π° Π΅ Π΄Π΅Π»ΡƒΠΌΠ½ΠΎ Ρ‚Π΅Ρ…Π½ΠΈΡ‡ΠΊΠ°, Π° Π΄Π΅Π»ΡƒΠΌΠ½ΠΎ Π·Π° ΠΊΠΎΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° со Π»ΡƒΡ“Π΅ ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ ΠΏΠΎΠ²Ρ€Π·Π°Π½ΠΈ со Ρ€Π°Π·Π»ΠΈΠΊΠΈΡ‚Π΅ Π²ΠΎ ΠΊΡƒΠ»Ρ‚ΡƒΡ€Π°Ρ‚Π° ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‚Π΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°.

Π—Π° ΠΆΠ°Π», ΠΎΠ·Π½Π°ΠΊΠ°Ρ‚Π° β€žΠΊΠΎΠ΄β€œ Π½Π΅ Π³ΠΈ истакнува ΠΊΠΎΠ΄ΠΎΠ²ΠΈΡ‚Π΅ Π·Π° ΠΊΡƒΠΊΠ»ΠΈ ΠΈ јамл, ΠΏΠ° ΠΌΠΎΡ€Π°Π² Π΄Π° користам β€žΠΎΠ±ΠΈΡ‡Π΅Π½ Ρ‚Π΅ΠΊΡΡ‚β€œ.

НСмашС Π·Π½Π°Ρ†ΠΈ Π½Π° нСволја ΡƒΡ‚Ρ€ΠΎΡ‚ΠΎ Π½Π° 21 Π΄Π΅ΠΊΠ΅ΠΌΠ²Ρ€ΠΈ 2016 Π³ΠΎΠ΄ΠΈΠ½Π°. Како ΠΈ ΠΎΠ±ΠΈΡ‡Π½ΠΎ, Ρ‡ΠΈΡ‚Π°Π² Π₯Π°Π±Ρ€ ΠΎΠ΄ нСрСгистриран Π°Π½ΠΎΠ½ΠΈΠΌΠ΅Π½ корисник Π²ΠΎ ΠΏΡ€Π²ΠΈΠΎΡ‚ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° час ΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΎΡ‚ Π΄Π΅Π½, Π΄ΠΎΠ΄Π΅ΠΊΠ° ΠΏΠΈΠ΅Π² ΠΊΠ°Ρ„Π΅ ΠΈ Π½Π°ΠΈΠ΄ΠΎΠ² овој Ρ‡Π»Π΅Π½,.

Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ ΠΌΠΎΡ˜Π°Ρ‚Π° компанија ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡˆΠ΅ Nagios, Π±Π΅Π· Ρ€Π°Π·ΠΌΠΈΡΠ»ΡƒΠ²Π°ΡšΠ΅ Π΄Π²Π°ΠΏΠ°Ρ‚ΠΈ, ΠΊΡ€Π΅ΠΈΡ€Π°Π² Ρ‚ΠΈΠΊΠ΅Ρ‚ Π²ΠΎ Redmine ΠΈ Π³ΠΎ испратив Π»ΠΈΠ½ΠΊΠΎΡ‚ Π΄ΠΎ Π³Π΅Π½Π΅Ρ€Π°Π»Π½ΠΈΠΎΡ‚ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€, бидСјќи смСтав Π΄Π΅ΠΊΠ° Π΅ Π²Π°ΠΆΠ΅Π½. Π˜Π½ΠΈΡ†ΠΈΡ˜Π°Ρ‚ΠΈΠ²Π°Ρ‚Π° Π΅ ΠΊΠ°Π·Π½ΠΈΠ²Π° Π΄ΡƒΡ€ΠΈ ΠΈ Π²ΠΎ ΠΠ²ΡΡ‚Ρ€Π°Π»ΠΈΡ˜Π°, ΠΏΠ° Π³Π»Π°Π²Π½ΠΈΠΎΡ‚ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ ΠΌΠΈ Π³ΠΎ Π·Π°ΠΊΠ°Ρ‡ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚ ΠΎΡ‚ΠΊΠ°ΠΊΠΎ Π³ΠΎ ΠΎΡ‚ΠΊΡ€ΠΈΠ².

Π‘Π»ΠΈΠΊΠ° ΠΎΠ΄ Π΅ΠΊΡ€Π°Π½ΠΎΡ‚ ΠΎΠ΄ RedmineΠœΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Π° ΠΎΠ΄ Нагиос Π²ΠΎ Π˜Ρ†ΠΈΠ½Π³Π°2 Π²ΠΎ ΠΠ²ΡΡ‚Ρ€Π°Π»ΠΈΡ˜Π°

Π’ΠΎ Π½Π°ΡˆΠΈΠΎΡ‚ ΠΎΠ΄Π΄Π΅Π», ΠΏΡ€Π΅Π΄ Π΄Π° Π³ΠΎ ΠΈΠ·Ρ€Π°Π·ΠΈΡ‚Π΅ Π²Π°ΡˆΠ΅Ρ‚ΠΎ мислСњС, Π²ΠΎΠΎΠ±ΠΈΡ‡Π°Π΅Π½ΠΎ Π΅ Π΄Π° сС ΠΏΠΎΠ½ΡƒΠ΄ΠΈ Π±Π°Ρ€Π΅ΠΌ Π΅Π΄Π½Π° Π°Π»Ρ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π°, Π΄ΡƒΡ€ΠΈ ΠΈ Π°ΠΊΠΎ ΠΈΠ·Π±ΠΎΡ€ΠΎΡ‚ Π΅ ΠΎΡ‡ΠΈΠ³Π»Π΅Π΄Π΅Π½, ΠΏΠ° Π·Π°Ρ‚ΠΎΠ° ΠΏΠΎΡ‡Π½Π°Π² со Π³ΡƒΠ³Π»Π°ΡšΠ΅ ΠΊΠ°ΠΊΠ²ΠΈ систСми Π·Π° слСдСњС сС ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Π»Π½ΠΎ Ρ€Π΅Π»Π΅Π²Π°Π½Ρ‚Π½ΠΈ, бидСјќи Π²ΠΎ Π ΡƒΡΠΈΡ˜Π° Π½Π° послСдното мСсто Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° јас имашС мој само-напишан систСм, ΠΌΠ½ΠΎΠ³Ρƒ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π΅Π½, Π½ΠΎ сСпак доста Ρ€Π°Π±ΠΎΡ‚Π΅Π½ ΠΈ Π³ΠΈ ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡˆΠ΅ ситС Π·Π°Π΄Π°Ρ‡ΠΈ ΡˆΡ‚ΠΎ ΠΌΡƒ Π±Π΅Π° Π΄ΠΎΠ΄Π΅Π»Π΅Π½ΠΈ. ΠŸΠ°Ρ˜Ρ‚ΠΎΠ½, ΠŸΠΎΠ»ΠΈΡ‚Π΅Ρ…Π½ΠΈΠΊΠ°Ρ‚Π° Π²ΠΎ Π‘Π°Π½ΠΊΡ‚ ΠŸΠ΅Ρ‚Π΅Ρ€Π±ΡƒΡ€Π³ ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΡ‚ΠΎ Π½Π° ΠΌΠ΅Ρ‚Ρ€ΠΎΡ‚ΠΎ. НС, ΠΌΠ΅Ρ‚Ρ€ΠΎΡ‚ΠΎ Π΅ смрдливо. Ова Π΅ Π»ΠΈΡ‡Π½ΠΎ (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 ΠΈΠ·Π³Π»Π΅Π΄Π° сосСма ΠΏΠΎΠΈΠ½Π°ΠΊΡƒ (ΠΎΠ²Π° бСшС минус), Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΅ флСксибилно Π΄Π° сС ΠΏΡ€ΠΈΠ»Π°Π³ΠΎΠ΄ΠΈ ΠΎΠ½Π° ΡˆΡ‚ΠΎ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΎ Π³Π»Π΅Π΄Π°Ρ‚Π΅ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ Π·Π° Π±ΡƒΠΊΠ²Π°Π»Π½ΠΎ сСкој ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Π°Ρ€ (ΠΎΠ²Π° бСшС плус, Π½ΠΎ сС Π±ΠΎΡ€Π΅Π² ΠΌΠ½ΠΎΠ³Ρƒ Π·Π° Ρ‚ΠΎΠ°).

Π€ΠΈΠ»Ρ‚Ρ€ΠΈΠœΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Π° ΠΎΠ΄ Нагиос Π²ΠΎ Π˜Ρ†ΠΈΠ½Π³Π°2 Π²ΠΎ ΠΠ²ΡΡ‚Ρ€Π°Π»ΠΈΡ˜Π°

ΠŸΡ€ΠΎΡ†Π΅Π½Π΅Ρ‚Π΅ Π³ΠΎ соодносот Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π°Ρ‚Π° Π½Π° Π»Π΅Π½Ρ‚Π°Ρ‚Π° Π·Π° лизгањС со Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ»Π΅Ρ‚ΠΎ Π·Π° лизгањС.

Π’Ρ‚ΠΎΡ€ΠΎ, ситС сС Π½Π°Π²ΠΈΠΊΠ½Π°Ρ‚ΠΈ Π΄Π° ја Π³Π»Π΅Π΄Π°Π°Ρ‚ Ρ†Π΅Π»Π°Ρ‚Π° инфраструктура Π½Π° Π΅Π΄Π΅Π½ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€, бидСјќи CheckMk Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ со Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Nagios хостови, Π½ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜ΡΠΎΡ‚ Icinga Π½Π΅ моТСшС Π΄Π° Π³ΠΎ стори Ρ‚ΠΎΠ° (Π²ΡΡƒΡˆΠ½ΠΎΡΡ‚, моТСшС, Π½ΠΎ повСќС Π·Π° Ρ‚ΠΎΠ° ΠΏΠΎΠ΄ΠΎΠ»Ρƒ). АлтСрнативата бСшС Π½Π΅ΡˆΡ‚ΠΎ Π½Π°Ρ€Π΅Ρ‡Π΅Π½ΠΎ Thruk, Π½ΠΎ Π½Π΅Π³ΠΎΠ²ΠΈΠΎΡ‚ дизајн Π³ΠΈ Π½Π°Ρ‚Π΅Ρ€Π° ситС Π²ΠΎ Ρ‚ΠΈΠΌΠΎΡ‚ Π΄Π° сС Π·Π°ΠΌΠΎΠ»ΠΊΠ½Π°Ρ‚ освСн Π΅Π΄Π΅Π½ - оној ΡˆΡ‚ΠΎ Π³ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈ (Π½Π΅ јас).

Π’ΠΎ ΠΏΠ΅Ρ‡ΠΊΠ°Ρ‚Π° Thruk - Сдногласна ΠΎΠ΄Π»ΡƒΠΊΠ° Π½Π° Ρ‚ΠΈΠΌΠΎΡ‚ΠœΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Π° ΠΎΠ΄ Нагиос Π²ΠΎ Π˜Ρ†ΠΈΠ½Π³Π°2 Π²ΠΎ ΠΠ²ΡΡ‚Ρ€Π°Π»ΠΈΡ˜Π°

По Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Π΄Π΅Π½Π° брСинсторминг, ја ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ² ΠΈΠ΄Π΅Ρ˜Π°Ρ‚Π° Π·Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Π½Π° кластСри, ΠΊΠΎΠ³Π° ΠΈΠΌΠ° Π΅Π΄Π΅Π½ Π³Π»Π°Π²Π΅Π½ хост Π²ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Π°Ρ‚Π° Π·ΠΎΠ½Π° ΠΈ Π΄Π²Π° Ρ€ΠΎΠ±ΠΎΠ²ΠΈ - Π΅Π΄Π΅Π½ Π²ΠΎ 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)
  • Π˜Π½Π΅Ρ€Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° систСмот - ΠΊΠΎΠ³Π° ќС ΠΊΠ»ΠΈΠΊΠ½Π°ΠΌ Π½Π° β€žΠ°ΠΆΡƒΡ€ΠΈΡ€Π°Ρ˜β€œ (ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ сСга) Π²ΠΎ Π²Π΅Π±-ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜ΡΠΎΡ‚ - Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΎΡ‚ ΠΎΠ΄ ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ зависи ΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠœΠ°Ρ€Ρ, особСно ΠΎΠ΄ слоТСнитС услуги Π·Π° ΠΊΠΎΠΈ сС ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ дСсСтици сСкунди Π·Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅. Π’Π°ΠΊΠΎΠ² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π΅ Π½ΠΎΡ€ΠΌΠ°Π»Π΅Π½. ΠœΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Π° ΠΎΠ΄ Нагиос Π²ΠΎ Π˜Ρ†ΠΈΠ½Π³Π°2 Π²ΠΎ ΠΠ²ΡΡ‚Ρ€Π°Π»ΠΈΡ˜Π°
  • Π“Π΅Π½Π΅Ρ€Π°Π»Π½ΠΎ, спорСд ΡˆΠ΅ΡΡ‚ΠΌΠ΅ΡΠ΅Ρ‡Π½Π°Ρ‚Π° статистика Π·Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° Π΄Π²Π°Ρ‚Π° систСма Ρ€Π°ΠΌΠΎ Π΄ΠΎ Ρ€Π°ΠΌΠΎ, Нагиос сСкогаш Ρ€Π°Π±ΠΎΡ‚Π΅ΡˆΠ΅ ΠΏΠΎΠ±Ρ€Π·ΠΎ ΠΎΠ΄ Π˜Ρ†ΠΈΠ½Π³Π° ΠΈ Ρ‚ΠΎΠ° навистина ΠΌΠ΅ Π½Π΅Ρ€Π²ΠΈΡ€Π°ΡˆΠ΅. Ми сС Ρ‡ΠΈΠ½ΠΈ Π΄Π΅ΠΊΠ° Π·Π±Ρ€ΠΊΠ°Π»Π΅ Π½Π΅ΡˆΡ‚ΠΎ со Ρ‚Π°Ρ˜ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°Ρ‚Π° сС ΠΏΡ€Π°Π²ΠΈ Π½Π° сСкои ΠΏΠ΅Ρ‚ ΠΌΠΈΠ½ΡƒΡ‚ΠΈ, Π²ΡΡƒΡˆΠ½ΠΎΡΡ‚ Ρ‚ΠΎΠ° сС случува Π½Π° сСкои 5:30 ΠΈΠ»ΠΈ Π½Π΅ΡˆΡ‚ΠΎ слично.
  • Ако ја рСстартиратС услугата Π²ΠΎ сСкоС Π²Ρ€Π΅ΠΌΠ΅ (systemctl Ρ€Π΅ΡΡ‚Π°Ρ€Ρ‚ΠΈΡ€Π°Ρ˜Ρ‚Π΅ icinga2) - ситС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΡˆΡ‚ΠΎ Π±Π΅Π° Π²ΠΎ Ρ‚Π΅ΠΊ Π²ΠΎ Ρ‚ΠΎΡ˜ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ќС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π°Ρ‚ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅Π½ Π°Π»Π°Ρ€ΠΌ Π½Π° Π΅ΠΊΡ€Π°Π½ΠΎΡ‚ ΠΈ ΠΎΠ΄Π½Π°Π΄Π²ΠΎΡ€ ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΊΠ°ΠΊΠΎ сè Π΄Π° ΠΏΠ°Π΄Π½Π°Π»ΠΎ (ΠΏΠΎΡ‚Π²Ρ€Π΄Π΅Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ°).

Но, Π³Π΅Π½Π΅Ρ€Π°Π»Π½ΠΎ, Ρ‚ΠΎΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°.

Π˜Π·Π²ΠΎΡ€: www.habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π΄ΠΎΠ²Π΅Ρ€Π»ΠΈΠ² хостинг Π·Π° ΡΠ°Ρ˜Ρ‚ΠΎΠ²ΠΈ со DDoS Π·Π°ΡˆΡ‚ΠΈΡ‚Π°, VPS VDS сСрвСри πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ сигурСн Π²Π΅Π±-хостинг со DDoS Π·Π°ΡˆΡ‚ΠΈΡ‚Π°, VPS VDS сСрвСри | ProHoster