แแแฃแแแ แฏแแก แงแแแแแก.
แแ Linux-แแก แกแแกแขแแแฃแ แ แแแแแแแกแขแ แแขแแ แ แแแ , แ แฃแกแแแแแแ แแแกแขแ แแแแแจแ แแแแแฃแแแแแแแแ แแ แแคแแกแแฃแแ แแแแแ 2015 แฌแแแก แแแแแแแแ แกแแชแฎแแแ แแแแแ, แแแแ แแ แแก แกแขแแขแแ แแ แแฎแแแ แแแแก, แแฃ แ แแแแ แจแแฃแซแแแ แฆแแ แก แขแ แแฅแขแแ แแก แแแฅแแฅแแ. แฃแแแ แกแแแแแ แแกแ แแกแแแ แกแขแแขแแ แแ แกแแแแแก (แแฃแแชแ, แแฃ แแแขแแ แแกแ แแฅแแแแ, แแแแแแช แแแแฌแแ ), แแแแขแแ แแแแแ แแแแแงแแแ, แแฃ แ แแแแ แแแแแฌแงแ แแแกแขแ แแแแแจแ Linux-ops แแแแแแ แแ แแฃแจแแแแแกแแก แแ แแ แแแแแขแแ แแแแแก แกแแกแขแแแแแแ แแแแ แแแ แแแแ แแชแแ. แแแ แซแแ - Nagios => Icinga2.
แกแขแแขแแ แแแฌแแแแแ แแ แขแแฅแแแแฃแ แ แฎแแกแแแแแกแแ แแ แแแฌแแแแแ แแ แแฎแแแ แแแแแแแแแแแแ แแแแฃแแแแแชแแแก แแ แแฃแแขแฃแ แแกแ แแ แกแแแฃแจแแ แแแแแแแแจแ แแ แกแแแฃแ แแแแกแฎแแแแแแแแแแ แแแแแแจแแ แแแฃแ แแ แแแแแแแแก.
แกแแแฌแฃแฎแแ แแ, โcodeโ แขแแแ แแ แฎแแแก แฃแกแแแแก Puppet-แกแ แแ yaml แแแแก, แแแแขแแ แแแแแฌแแ โplaintextโ-แแก แแแแแงแแแแแ.
21 แฌแแแก 2016 แแแแแแแ แแก แแแแแ แแ แแแแแ แ แแ แแแแแแ แแ แจแแแแแจแแแแแแ. แ แแแแ แช แงแแแแแแแแก, แกแแแฃแจแแ แแฆแแก แแแ แแแแ แแแฎแแแแ แ แกแแแแแก แแแแแแแแแแแจแ แแแแแฎแฃแแแแแ Habr-แก, แ แแแแ แช แแ แแ แแแแกแขแ แแ แแแฃแแ แแแแแแแฃแ แ แแแแฎแแแ แแแแแ, แงแแแแก แแกแแแแแ แแ แฌแแแแฌแงแแ... .
แ แแแแแ แฉแแแ แแแแแแแแ แจแแแแฎแแแแแ แแงแแแแแแ Nagios-แก, Redmine-แจแ แแแแแแแก แจแแฅแแแแกแ แแ แแแฃแแแก แแแแแ แฉแแขแจแ แแแแแแแแแแ แแ แฏแแ แแ แแแคแแฅแ แแ, แ แแแแแ แแแแจแแแแแแแแแ แแแแแฉแแแ. แแแแชแแแขแแแ แแแกแฏแแแแ แแแกแขแ แแแแแจแแช แแ, แแแแขแแ แฌแแแงแแแแแ แแแแแแแ แแ แแ แแแแแแ แแ แแแแแแ แแแ, แ แแแแแ แแ แแฆแแแแแฉแแแ.
แแแ แแแแก แแแแแแญแแ Redmine-แแแ
แฉแแแแก แแแแงแแคแแแแแแจแ, แกแแแแ แแฅแแแแก แแแ แก แแแแแแฅแแแแ, แฉแแแฃแแแแ แแ, แแ แแ แแแขแแ แแแขแแแแก แจแแแแแแแแแแ, แแฃแแแแช แแ แฉแแแแแ แแจแแแ แ แแงแแก, แแแแขแแ แแแแแฌแงแ Google-แจแ แแแแ, แแฃ แ แแแแแ แแแแแขแแ แแแแแก แกแแกแขแแแแแแ แแแแแแแ แแฅแขแฃแแแฃแ แ, แ แแแแแ แ แฃแกแแแจแ, แฉแแแก แแแแ แกแแแฃแจแแ แแแแแแแ, แแฅแแแแ แฉแแแแแ แฎแแแแแแแแ แกแแกแขแแแ, แซแแแแแ แแ แแแแขแแฃแแ, แแแแ แแ แแแฃแฎแแแแแแ แแแแกแ, แกแแแแแแ แคแฃแแฅแชแแแแแแฃแ แ แแ แแกแ แฃแแแแแ แแแกแแแแก แแแแแกแ แแแฃแ แงแแแแ แแแแแแแแแก. Python, แกแแแฅแข-แแแขแแ แแฃแ แแแก แแแแแขแแฅแแแแฃแ แ แฃแแแแแ แกแแขแแขแ แแ แแแขแ แ แแแ แแแแแ. แแ แ, แแแขแ แ แกแแจแแแแแแแแ. แแก แแแ แแแแ (11 แฌแแแแแ แแฃแจแแแแ) แแ แชแแแแ แกแขแแขแแแก แฆแแ แกแแ, แแแแ แแ แแฎแแ แแ แ.
แชแแขแ แ แแ แฉแแแก แแแแแแแแแแ แแแแแแแก แแแคแ แแกแขแ แฃแฅแขแฃแ แแก แแแแคแแแฃแ แแชแแแจแ แชแแแแแแแแแแก แจแแขแแแแก แฌแแกแแแแก แจแแกแแฎแแ. แแแแแก แแ แแแชแแแแ Puppet-แก, Gitlab-แกแ แแ แแแคแ แแกแขแ แฃแฅแขแฃแ แแก แแแงแแแแแ, แแแแขแแ:
- แแแ แขแฃแแแฃแ แแแแฅแแแแแแ แคแแแแแแแก แฎแแแแ แจแแชแแแแ SSH-แแก แกแแจแฃแแแแแแ แฎแแแแ แชแแแแแแแแแแก แจแแขแแแ แจแแฃแซแแแแแแแ. แกแแแ แฌแแแก แแแแแแแแแแแจแ แแแแแแ แแแแแแ แแขแแแแก, แแแแ แแ แแ แแแแ แแก แฌแแ แแงแ แแ แแ แแแแแแแ แแแแ แจแแแแฎแแแแ แงแแคแแแแงแ. แกแแ แแแแฃแแแ, แแแแคแแแฃแ แแชแแแจแ แแ แแ แฎแแแแก แจแแชแแแแก, แกแแ แแแกแแก แแแแแขแแแ แแแแก แแ แแ แแแแแแแก แแแแแญแ แแก 10 แฌแแแ แกแญแแ แแแแ. แจแแฅแแแแแ แแฎแแแ แคแแแแแแ Gitlab-แจแ, แแแแญแแ แแ แชแแแแแแแแแแก แจแแขแแแแก, แแแแแแแแ r10k-แแก แแแจแแแแแก Puppetmaster-แแ, แแแฃแจแแแ Puppet --environment=mybranch แแ แแแแแแแแ แแแแแ แ แแแแแแแแ แฌแฃแแ, แกแแแแ แงแแแแแคแแ แ แแแจแแแแฃแแ แแฅแแแแ - แแแแแแฃแ 5 แฌแฃแแ.
- แแแแแกแแแแ แ แชแแแแแแแ แฎแแ แชแแแแแแแ Gitlab-แจแ แจแแ แฌแงแแแก แแแแฎแแแแแก แจแแฅแแแแ แแ แฃแแแ แแแแขแแแชแแแก แแฃแแแแก แกแฃแ แแชแแ แ แแ แแ แฌแแแ แแก แแแแ . แแฃแแแแก แฎแแแแซแฆแแแแแแแก แแแแ แแแแแฌแงแแแขแแแ แแแแจแแแแแแแแแ แชแแแแแแแแแแกแแแแก แกแแญแแ แแ แแ แ แแ แกแแแ แแแแขแแแชแแแ.
- แงแแแแ แชแแแแแแแ แแแ แแฃ แแ แแแแ แขแแฅแกแขแฃแ แแ (แ แแแแแ Puppet-แแก แแแแแคแแกแขแแแ, แกแแ แแแขแแแ แแ Hiera แแแแแชแแแแแ แขแแฅแกแขแฃแ แแ), แแแแแ แฃแแ แคแแแแแแแก แแแแแงแแแแแ แแแแชแ แแ แแแ แซแแแฃแแแ แแ แแแแ แแแกแแแขแแแชแแแแแ แแงแแ แ แแแแแแแ แกแแญแแ แ.
แแกแ แ แแ, แฉแแแก แแแแ แแแแฎแแแฃแแ แแแ แแแแขแแแ แแงแ:
- แแฃแแแแ - แแฃ แแแคแ แแกแขแ แฃแฅแขแฃแ แแจแ 10-แแ แแแขแ แกแแ แแแ แแ, แแแแแแแกแขแ แแ แแแ แฏแแฏแแฎแแแแ แแฅแชแแแ (แแแ . แแแแก แแแแแชแแแก แแแแกแแแฃแแ แแแฃแแ แกแฃแ แแแแ แแ แแฅแแแแ, แแแแขแแ แแแก แกแแขแงแแแก แแแแฃแฏแแ แ).
- Zabbix โ แแแแ แฎแแแแ, แ แฃแกแแแจแ แงแแคแแแกแแก แแคแแฅแ แแแแ แแแกแแ, แแแแ แแ แฉแแแ แแแแชแแแแแแกแแแแก แแแแแแขแ แแฆแแแฉแแแ. แแฅ โ แแแแแฌแแ แแแกแ แแแฃแฅแแแแ, แ แแแแแ Puppet-แก แแแแคแแแฃแ แแชแแแก แแแแแฏแแ แแ แแ Gitlab-แก แแแ แกแแแแแก แแแแขแ แแแแก แกแแกแขแแแแ แแแงแแแแแแ. แแ แแ แแก, แ แแแแแแแแแช แแ แแแแแแ, Zabbix แแแแ แแแแคแแแฃแ แแชแแแก แแแแแชแแแแ แแแแแจแ แแแแฎแแแก, โโแแแแขแแ แแแฃแแแแแ แ แแงแ, แแฃ แ แแแแ แฃแแแ แแแแแ แแ แแแแคแแแฃแ แแชแแ แแแแแแแแ แ แแแ แแแแแจแ แแ แ แแแแ แฃแแแ แแแแแงแฃแ แ แแแแแแแแฃแแแงแ แชแแแแแแแแแก.
- แแ แแแแแแก แจแแกแแฎแแ แกแแแแแแแ แแแแกแฏแแแแแ, แแแแงแแคแแแแแแจแ แแ แกแแแฃแแ แแแแฌแงแแแแ, แแแแ แแ แแ แแ แแก แแ แแก แแ แแแแแฃแคแแ แแ แแแ แแแฉแแแแ แ แแแแฃแ แ แกแแแฃแจแแ แแแแฃแจแ (แแแแชแแคแชแแแก แแแแขแแแชแแแ), แแแแขแแ แแแกแ แแแขแแแแแ แแแแแฌแแ.
- แแกแแแ แแ แกแแแแแแ แ แแแแแแแแ แกแฎแแ แแแ แแแแขแ, แ แแแแแแแช แแ แกแแกแขแแแแก แกแ แฃแ แ แแแแแแแแก แแแแแฎแแแแ, แแ แกแแฌแงแแก/แแแขแแแแแฃแ แแแแแแแ แแแแแจแ แแงแ แแ แแแแแ แแแแแแแ แฃแแ แงแแคแแ แแฅแแ.
แกแแแแแแแ, Icinga2-แแ แจแแแฉแแ แแ แกแแแ แแแแแแแก แแแแ:
1 โ แแแแกแแแแแแแ Nrpe-แกแแแ (แแแแแแขแแก แกแแ แแแกแ, แ แแแแแแช แแแแฌแแแแก Nagios-แแก แแ แซแแแแแแแก). แแก แซแแแแแ แแแแจแแแแแแแแแ แแงแ, แ แแแแแ แแ แแ แแก แฉแแแ แแแฅแแแแ 135 (แแฎแแ 2019 แฌแแแก แแ แแก 165) แแแ แขแฃแแแฃแ แ แแแแฅแแแ แฃแแแ แแแ แแแ แแแแฃแแ แกแแ แแแกแแ/แจแแแแฌแแแแแ แแ แแ แงแแแแแคแ แแก แฎแแแแฎแแ แแแแแแแแ แแแแแแแแ แขแแแแแแ แแฅแแแแแแ.
2 - แงแแแแ แแแแคแแแฃแ แแชแแแก แคแแแแ แขแแฅแกแขแแ, แ แแช แแแแ แขแแแแแก แแ แกแแแแแฎแแก แ แแแแฅแขแแ แแแแก, แฅแแแแก แจแแ แฌแงแแแก แแแแฎแแแแแแก แแแแก แกแแแแฎแแแแ, แแฃ แ แ แแแแแแขแ แแ แฌแแแจแแแ.
3 แแ แแก แชแแชแฎแแแ แแ แแแแ แแ OpenSource แแ แแแฅแขแ. แฉแแแ แแแแงแแแ แก OpenSource แแ แฌแแแแแ แจแแแแขแแแแ แแแกแจแ แแ แแแแแแแแแก แแแแแกแแญแ แแแแ Pull Requests-แแกแ แแ Issues-แแก แจแแฅแแแแ.
แแแจ แแกแ, แแแแแฌแงแแ, Icinga2.
แแแ แแแแ, แ แแกแแช แจแแแแฏแแฎแ, แฉแแแ แแแแแแแแแก แแแแ แชแแ แแงแ. แงแแแแ แแแฉแแแฃแแ แแงแ Nagios/Nadzhios-แก (แแฃแแชแ แแฅแแช แแ แแแ แจแแแแแฎแแแแแ แแแก แฌแแ แแแแฅแแแแ) แแ CheckMK แแแขแแ แคแแแกแก. Icinga-แก แแแขแแ แคแแแกแ แกแ แฃแแแแ แแแแกแฎแแแแแแฃแแแ แแแแแแงแฃแ แแแ (แแก แแแแฃแกแ แแงแ), แแแแ แแ แจแแกแแซแแแแแแแ แแแฅแแแแแ แแแแ แแแ แแก, แ แแช แแญแแ แแแแแ แคแแแขแ แแแแก แแแแแงแแแแแแ, แคแแฅแขแแฃแ แแ แแแแแกแแแแ แ แแแ แแแแขแ แแกแแแแก (แแก แแแแฃแกแ แแงแ, แแแแ แแ แแ แแแแกแแแแก แแแแ แแ แซแแแ แแแแฌแแ).
แคแแแขแ แแแ
แจแแแคแแกแแ แแแแแฎแแแแแก แแแแแก แแแแแกแ แแ แแแแแฎแแแแแก แแแแแก แแแแแก แแแแแคแแ แแแแ.
แแแแ แแช, แงแแแแ แแแฉแแแฃแแ แแงแ แแแแแ แแแคแ แแกแขแ แฃแฅแขแฃแ แแก แแ แ แแแแแขแแ แแ แแแฎแแแก, แ แแแแแ CheckMk แกแแจแฃแแแแแแก แแซแแแแแ แแแฃแจแแแก แ แแแแแแแแ Nagios แฐแแกแขแแแ, แแแแ แแ Icinga-แก แแแขแแ แคแแแกแก แแแแก แแแแแแแแ แแ แจแแแซแแ (แกแแแแแแแแแแจแ, แจแแแซแแ, แแแแ แแ แแแแแ แฅแแแแแ แแแแแงแแแแแ). แแแขแแ แแแขแแแ แแงแ Thruk-แแก แกแแฎแแแแ แชแแแแแแ แ แแ, แแแแ แแ แแแกแแ แแแแแแแแ แแฃแแแแก แงแแแแ แฌแแแ แ แแแแแแแ, แแแ แแ แแ แแแกแ - แแแกแ แจแแแแแแแแแแแแก (แแ แ แแ).
แแ แฃแแแก แชแแชแฎแแจแ แฉแแแแแแ - แแฃแแแแก แแ แแกแฃแแแแแแ แแแแแฌแงแแแขแแแแแ
แ แแแแแแแแแแฆแแแแ แแแแแแแก แแแแแ แแ แแแแก แจแแแแแ, แแแแแฉแแแ แแแแกแขแแ แฃแแ แแแแแขแแ แแแแแก แแแแ, แกแแแแช แฌแแ แแแแแแก แแแแแจแ แแฅแแแแ แแ แแ แแแแแแ แ แฐแแกแขแ แแ แแ แ แแแแ - แแ แแ dev/test-แจแ แแ แแ แแ แแแ แ แฐแแกแขแ, แ แแแแแแช แแแแแแ แแแแก แกแฎแแ แแ แแแแแแแ แแแ, แฉแแแแ แกแแ แแแกแแแแก แแแแแขแแ แแแแแก แแแแแแ แแแแแแขแแก แแ แแแ แ แแแแแแแ แแแแแแก แแแแแกแแแ แแกแแ. แแ แแแแคแแแฃแ แแชแแแ แกแแจแฃแแแแแ แแแแแชแ, แงแแแแ แแ แแแแแแ แแ แ แแแ แแแขแแ แคแแแกแจแ แแแแแแฎแ แแ แกแแแแแแ แแแ แแแ แแฃแจแแแแแ, แแแแ แแ Puppet... Puppet-แแก แแ แแแแแแ แแก แแงแ, แ แแ แแแแแแ แ แฐแแกแขแ แแฎแแ แกแแกแขแแแแจแ แแ แกแแแฃแแ แงแแแแ แฐแแกแขแแกแ แแ แกแแ แแแกแแก/แจแแแแฌแแแแแก แจแแกแแฎแแ แฃแแแ แกแชแแแแแแ แแ แแแแ แแแแแแก แจแแ แแก แแแแแฌแแแแแ แฃแฌแแแแ (dev-test, staging-prod, ext), แแแแ แแ แชแแแแแแแแแแก แแแแแแแแแก Icinga API-แแก แกแแจแฃแแแแแแ แ แแแแแแแแ แฌแแแ แกแญแแ แแแแ, แฎแแแ Puppet-แแก แแแขแแแแแแก แงแแแแ แกแแ แแแกแแก แจแแแแแแแก แงแแแแ แฐแแกแขแแกแแแแก แ แแแแแแแแ แฌแฃแแ แกแญแแ แแแแ. แแแแจแ แแกแแ แแ แแแแแแแจแแฃแแแแแ, แแฃแแชแ แฃแแแ แ แแแแแแฏแแ แแ แแแฎแกแแแ, แ แแแแ แแฃแจแแแแก แแก แงแแแแแคแแ แ แแ แ แแขแแ แกแญแแ แแแแ แแแแแ แฎแแแก.
แแแกแแแ - แคแแคแฅแแแแก แแแแแฃแแ - แแกแแแ แ แแ, แ แแช แแแแแแ แกแแกแขแแแแแแ แแแแแแ แฉแแแ, แ แแแแแ แแแ แ แแฆแแช แแแแกแแแฃแแ แแแฃแแ แแฅแแ, แแแแขแแ แแแแแแ แฌแแกแแแ แแแแแ แแ แแ แชแแแแแแ. แแก แแ แแแแแแ แคแ แแแขแแแฃแ แ แจแแขแแแแ แแแแแแ แแ - แแฃ แกแแแแแแแแแชแแแ, แแแแ แแ แกแแแแแแแแแแจแ แงแแแแแคแแ แ แแแ แแแแแ, แแแจแแ แแฅ แฃแคแ แ แฆแ แแแ แฃแแแ แฉแแฃแฆแ แแแแแแ แแ แแแแ แแแแแ, แ แแขแแ แแแคแ แแฎแแแแแก, แแฃแแชแ แแ แฃแแแ แแแคแ แแฎแแแแก. แแ แแแ แแฅแแ - แ แแขแแ แแแ แแแแ แแแแแแแจแ แแแแแแกแ แแ แ แแขแแ แแ แ แแฉแแแแ.
แแแแแฎแ, Nagios แแฅ แฉแแแแ แกแแแ แฌแแแ แแแ แ แแฃแจแแแแแ แแ แแแแแแแแ แแแแแ แฃแคแ แ แแแขแแ แแแแแแแแแแ, แแแแ แ แฉแแแก แแฎแแแแจแแฅแแแแ แฐแแแกแขแแ แฃแ แกแแกแขแแแแก, แแแแขแแ แงแแแแ แฏแแ แแ, แ แแชแ Icinga แแแแแแแก แแฌแแแแแ, แแ แแแแ แแ แแคแแ แก แแแแแแแแ, แกแแแแ Nagios แแแแแ แกแแแแแฎแแ แแ แแฆแคแ แแแแแแแแแแแ. แแฃแแชแ, Icinga แซแแแแแ แแจแแแแแแ แแแ แชแแแแแแ แ แแแแฃแ แแแแแแจแก Nagios-แแแ แแ แแแแก แกแแ แแแแฃแ แแแแแแแแแแแแ แแแแแฉแแแ, แ แแแแแกแแช โแแแกแแแแแแแกโ แแแแงแแคแแแแแแจแ แแแแแแฎแแแแ.
แกแแแแแแแ, แแฅแกแแแฃแแขแแชแแแจแ แแแจแแแแ 5 แแแแแ แแแขแ แฎแแแ แแแแแแแ (แกแแแแแแแแแแจแ, แแแแแแแแแ แแงแ 28 แฌแแแก 2018 แแแแแกแก - 3 แฌแแแก 2018 แแแแแแแแ แก), แซแแ แแแแแแ โแแแ แแขแแขแแก แจแแแแฌแแแแแกโ แแแแ - แแก แกแแกแฃแแแแแ, แ แแชแ Nagios-แจแ แ แแแแแแแแ แกแแ แแแกแแ, แ แแแแแแ แจแแกแแฎแแแแช แแแแ แ แแแแแแแแ แฌแแแก แแแแแแแแแแแจแ แแ แแแแก แแ แแคแแ แ แกแแแแแ, แแแแ แแ แแฎแแ, แฏแแแแแแ, แฃแแแแแแแ แแแแแกแชแแก แแ แแขแแแ แแ แแแแแฌแแ แแฎแกแแ, แแฃ แ แแขแแ แแ แแ แแแ แแกแแแ แฉแแแก แแแแแแจแ แแ แแแแแฌแแ แแแแ Icinga-แจแ แแแแแขแแแ, แ แแแ โแแแ แแขแแขแแก แจแแแแฌแแแแ แแแกแ แฃแแแแฃแแแงแโ (Nagios-แจแ แงแแแแ แกแแ แแแกแ/แจแแแแฌแแแแ แจแแแกแแแแแแแ Icinga-แจแ แแ แกแแแฃแ แกแแ แแแกแแแก/แจแแแแฌแแแแแแก).
แแแแฎแแ แชแแแแแแ:
แแแ แแแแ แแ แแก แแแแแกแ แแ แแแแแชแแแแแแก แแแ, แแแแแแแแแ, Puppet Style-แจแ. แงแแแแ แแแแแชแแแ, แแแกแแแฃแขแฃแ แแ แงแแแแแคแแ แ, แฃแแแ แแงแแก Hiera-แจแ แแ แกแฎแแ แแ แแคแแ แ. แงแแแแ แแแแ .pp แคแแแแแแจแแ. แชแแแแแแแ, แแแกแขแ แแฅแชแแแแ, แคแฃแแฅแชแแแแ - แงแแแแแคแแ แ 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
}
}
}
}
}
}
}
}แแแกแแแแซแแแกแ แแ แกแแ แแแกแแก แแแแคแแแฃแ แแชแแแก แแแแแช แกแแจแแแแแ แแแแแแงแฃแ แแแ:
แแแแแขแแ แแแแ/แแแแคแแแฃแ แแชแแ.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 แคแแแแจแ - แฎแแแแ แงแแแแ แแแแฃแแแกแฎแแแแ แแแ แแแแขแ แแก แจแแ แฌแงแแ แฏแแฃแคแฃแ แแแ แแแแขแ แแแแแ แแ แจแแแแแ แแแแแแฃแ แแแแแแแแฃแแแฃแ แจแแแแฌแแแแแกแแแ.
แแแแแ แแ แแ แซแแแแแ แแแแจแแแแแแแแแ แชแแแแแแแ แแงแ แแแ แแแแขแ แแแจแ แคแฃแแฅแชแแแแแก แแแแแงแแแแแแก แจแแกแแซแแแแแแแ, แแแแแแแแแ, http_regex-แแก แจแแกแแแแฌแแแแแแ แแแ แขแแก, แแแกแแแแ แแแกแ แแ URL-แแก แจแแชแแแแก แคแฃแแฅแชแแ.
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_แแแ แขแ โ แแแแแแงแแแแ แแแ, แกแฎแแ แจแแแแฎแแแแแจแ 443. แแแแแแแแแ, jabber-แแก แแแ แแแขแแ แคแแแกแ 9090-แแแ แแแแแจแฃแแ, แฎแแแ Unifi โ 7443-แแ.
http_vhost แแแจแแแแก DNS-แแก แแแแแ แแ แแแแก แแ แแ แแแกแแแแ แแแก แแฆแแแแก.
แแฃ แแแกแแแแซแแแ แแแฃแแแแแแก uri-แก, แแแจแแ แแแฐแงแแแแ แแแก, แฌแแแแแฆแแแแ แจแแแแฎแแแแแจแ แแแแแแงแแแแ "/".
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 แแแแก แแแแแแแแแแแจแ แแแฅแแแแ, แแ แแ แแ, แแแซแแแแแแฃแแ แแ แแแฃแชแแแแ.
- hosts/services(checks) แแแแแชแแแแ แกแขแ แฃแฅแขแฃแ แ แแฎแแ (แฉแแแ แแแ แแ) แแแแ แแ แฃแคแ แ แแแแแฎแแแ แแ แแแกแแแแแแ. แกแฎแแแแแกแแแแก แแก แแกแ แแจแแแ แ แแ แแงแ, แแแแขแแ แแแแแแแแ แแ แแแแแจแ แ แแแแแแแแ แแแแ แแแก แแแแแแแแ แแแแแฌแแ, แ แแแ แแแแฎแกแแ, แแฃ แ แแแแ แแฃแจแแแแก แแก แงแแแแแคแแ แ แแ แ แ แกแแ แฃแแแ แจแแแแกแฌแแ แแแแแ.
- แแ แกแแแแแก แจแแแแฌแแแแแแแก แแแฅแแแแ แแแแคแแแฃแ แแชแแแก แจแแกแแซแแแแแแแ แชแแแแแแแแกแ แแ แคแฃแแฅแชแแแแแก แแแแแงแแแแแแ, แแแแแแแแแ, http_regexp แจแแแแฌแแแแแกแแแแก, แแแกแแแแซแแแก แแแ แแแแขแ แแแจแ แจแแแซแแแแ แแแแแแแแฃแแ แแงแแก แกแแซแแแแ แแแแฃแจแ, แแแแ แฃแแแแแก แแแแ, URL แแ แแแ แขแ.
- แแ แกแแแแแก แ แแแแแแแแ แแแคแ, แ แแแแแแแแแ แแแแแแฃแแแกแแแแก แจแแแแซแแแแ แแแแกแแแฆแแ แแ แแแฉแแแแแแ แกแแแแแแแแแชแแแก แกแแแฃแแแ แ แกแแ แแ แแแ แแแ แแก แงแแแแแคแแ แ Puppet-แแกแ แแ แจแแ แฌแงแแแก แแแแฎแแแแแแแก แกแแจแฃแแแแแแ.
Cons:
- แแฃแแแแก แฌแแแ แแแแก แแแแ แชแแ - Nagios แแฃแจแแแแแ, แแฃแจแแแแแ แแ แแฃแจแแแแแ, แแฅแแแแ แแก Isinga แแ แแแแฃแแแแแแ แฎแแ แแแแแแแ แแฃแจแแแแก แแ แแแแแแแก. แแ แ แแแแ แจแแแแซแแแ แแฅ แแกแขแแ แแแก แแแฎแแ? แฏแแแแแแ, แแก แแ แแแแแฎแแแแแ... (แแแแแแแแ แแ แแแแแแ แแก แแ แแก, แ แแ แกแแแแแแแแแชแแแก แแกแขแแ แแ แแแขแแแแขแฃแ แแ แแ แแแแแฎแแแแแ, แแฎแแแแ F5-แแ)
- แกแแกแขแแแแก แแแแ แชแแ - แ แแแแกแแช แแแ แแแขแแ แคแแแกแจแ แแแฌแแแแฃแแแ โแแแแแฎแแแแแแโ (แจแแแแแฌแแ แแฎแแ) - แจแแกแ แฃแแแแแก แจแแแแแ แแแแแแแแแแฃแแแ แแแ แกแแ แแ แกแแแฃแ แแแแแแแ, แแแแกแแแฃแแ แแแแ แ แแฃแ แกแแ แแแกแแแแ, แ แแแแแแ แจแแกแ แฃแแแแแก แแแแแแ แฌแแแ แกแญแแ แแแแ. แแกแแแ แจแแแแแ แแแ แแแแฃแ แแ.

- แแแแแแแ, แแ แ แกแแกแขแแแแก แแแแ แแแแแแ แ แแฃแจแแแแแก แแแฎแแแแ แฌแแแฃแ แ แกแขแแขแแกแขแแแแก แแแฎแแแแแ, Nagios แงแแแแแแแแก แฃแคแ แ แกแฌแ แแคแแ แแฃแจแแแแแ, แแแแ แ Icinga แแ แแก แซแแแแแ แแแฆแแแแแแแแแ. แแแฉแแแแแแ, แ แแ แขแแแแแ แแแแแ แแแแแแจแแ แแแแ แ แแฆแแช แแฃแ แแแก แแ แจแแแแฌแแแแ แงแแแแ แฎแฃแ แฌแฃแแจแ แแ แแฎแแ แฎแแแแ แกแแแแแแแแแแจแ แงแแแแ 5:30-แแ แแ แ แแฆแแช แแกแแแแกแจแ.
- แแฃ แกแแ แแแกแก แแแแแกแแแแ แแ แแก แแแแแขแแแ แแแแ (systemctl restart icinga2) - แงแแแแ แจแแแแฌแแแแ, แ แแแแแแช แแ แแ แแก แแแแแแแแ แแแแแ, แแ แแขแแแฃแ แกแแแแแแแแแชแแแก แแแแแแแฃแจแแแแแก. แแแ แแแแ แแ แแแแ แแแแแ แแกแ แฉแแแก, แแแแฅแแก แงแแแแแคแแ แ แฉแแแแแแแ แ ().
แแแแ แแ แกแแแ แแ แฏแแแจแ, แแก แแฃแจแแแแก.
แฌแงแแ แ: www.habr.com

