ํ˜ธ์ฃผ Nagios์—์„œ Icinga2๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

์•ˆ๋…• ๋ชจ๋‘

์ €๋Š” Linux ์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž์ด๊ณ  2015๋…„์— ๋…๋ฆฝ ์ „๋ฌธ ๋น„์ž๋กœ ๋Ÿฌ์‹œ์•„์—์„œ ํ˜ธ์ฃผ๋กœ ์ด์ฃผํ–ˆ์ง€๋งŒ ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ๋ผ์ง€์šฉ ํŠธ๋ž™ํ„ฐ๋ฅผ ์‹œ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๊ธฐ์‚ฌ๋Š” ์ด๋ฏธ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ์ด๊ฒƒ์— ๋Œ€ํ•ด์„œ๋„ ์“ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ ํ˜ธ์ฃผ์—์„œ Linux-ops ์—”์ง€๋‹ˆ์–ด๋กœ ์ผํ•˜๋ฉด์„œ ๋‹จ์ผ ์‹œ์Šคํ…œ ๋ชจ๋‹ˆํ„ฐ๋ง์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‹œ์ž‘ํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ. ๊ตฌ์ฒด์ ์œผ๋กœ - Nagios => Icinga2.

์ด ๊ธฐ์‚ฌ๋Š” ๋ถ€๋ถ„์ ์œผ๋กœ ๊ธฐ์ˆ ์ ์ด๊ณ  ๋ถ€๋ถ„์ ์œผ๋กœ ์‚ฌ๋žŒ๋“ค๊ณผ์˜ ์˜์‚ฌ์†Œํ†ต๊ณผ ๋ฌธํ™” ๋ฐ ์ž‘์—… ๋ฐฉ์‹์˜ ์ฐจ์ด์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ "code" ํƒœ๊ทธ๋Š” Puppet ๋ฐ yaml ์ฝ”๋“œ๋ฅผ ๊ฐ•์กฐ ํ‘œ์‹œํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ "plaintext"๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

21๋…„ 2016์›” XNUMX์ผ ์˜ค์ „์—๋Š” ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ์˜ ์ง•ํ›„๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋Š˜ ๊ทธ๋ ‡๋“ฏ์ด ๊ทผ๋ฌด์ผ ์ฒซ XNUMX๋ถ„ ๋™์•ˆ ์ปคํ”ผ๋ฅผ ๋งˆ์‹œ๋ฉฐ ๋“ฑ๋ก๋˜์ง€ ์•Š์€ ์ต๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ Habr์„ ์ฝ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ.

์šฐ๋ฆฌ ํšŒ์‚ฌ๋Š” Nagios๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ๋ฒˆ ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ  Redmine์—์„œ ํ‹ฐ์ผ“์„ ์ƒ์„ฑํ•˜๊ณ  ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ์ผ๋ฐ˜ ์ฑ„ํŒ… ๋งํฌ๋ฅผ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ์ด ์ด๋‹ˆ์…”ํ‹ฐ๋ธŒ๋Š” ํ˜ธ์ฃผ์—์„œ๋„ ์ฒ˜๋ฒŒ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ˆ˜์„ ์—”์ง€๋‹ˆ์–ด๋Š” ์ œ๊ฐ€ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•œ ์ดํ›„๋กœ ์ €์—๊ฒŒ ๋ฌธ์ œ๋ฅผ ์ง€์ ํ–ˆ์Šต๋‹ˆ๋‹ค.

Redmine์˜ ์Šคํฌ๋ฆฐ์ƒทํ˜ธ์ฃผ Nagios์—์„œ Icinga2๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

์šฐ๋ฆฌ ๋ถ€์„œ์—์„œ๋Š” ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์ „์— ์„ ํƒ์ด ๋ถ„๋ช…ํ•˜๋”๋ผ๋„ ์ ์–ด๋„ ํ•˜๋‚˜์˜ ๋Œ€์•ˆ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๊ด€๋ก€์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ๋งˆ์ง€๋ง‰ ์ง์žฅ์ธ ๋Ÿฌ์‹œ์•„์—์„œ ํ˜„์žฌ ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์ด ๊ด€๋ จ๋˜์–ด ์žˆ๋Š”์ง€ ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰์œผ๋กœ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ์›์‹œ์ ์ธ ์ž์ฒด ์ž‘์„ฑ ์‹œ์Šคํ…œ์ด ์žˆ์—ˆ์ง€๋งŒ ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ• ๋‹น๋œ ๋ชจ๋“  ์ž‘์—…์„ ๊ฝค ์ž˜ ์ž‘๋™ํ•˜๊ณ  ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. Python, St.Petersburg Polytechnic ๋ฐ ์ง€ํ•˜์ฒ  ๊ทœ์น™. ์•„๋‹ˆ, ์ง€ํ•˜์ฒ ์€ ์งœ์ฆ๋‚˜. ์ด๊ฒƒ์€ ๊ฐœ์ธ์ ์ธ ์ผ์ด๊ณ (11๋…„๊ฐ„์˜ ์ž‘์—…) ๋ณ„๋„์˜ ๊ธฐ์‚ฌ๋ฅผ ์“ธ ๊ฐ€์น˜๊ฐ€ ์žˆ์ง€๋งŒ ์ง€๊ธˆ์€ ์•„๋‹™๋‹ˆ๋‹ค.

ํ˜„์žฌ ์œ„์น˜์—์„œ ์ธํ”„๋ผ ๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ทœ์น™์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Puppet, Gitlab ๋ฐ ์ธํ”„๋ผ๋ฅผ ์ฝ”๋“œ ์›์น™์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐ€์ƒ ๋จธ์‹ ์˜ ํŒŒ์ผ์„ ์ˆ˜๋™์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ SSH๋ฅผ ํ†ตํ•ด ์ˆ˜๋™์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 10๋…„ ๋™์•ˆ ์ผํ•˜๋ฉด์„œ ์ด๋ ‡๊ฒŒ ๋ชจ์ž๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋งž์•˜๋Š”๋ฐ, ๋งˆ์ง€๋ง‰์ด ์ผ์ฃผ์ผ ์ „์ด์—ˆ๋Š”๋ฐ ๊ทธ๊ฒŒ ๋งˆ์ง€๋ง‰์ด ์•„๋‹Œ ๊ฒƒ ๊ฐ™์•„์š”. ์Œ, ์‹ค์ œ๋กœ ๊ตฌ์„ฑ์—์„œ ํ•œ ์ค„์„ ์ˆ˜์ •ํ•˜๊ณ  ์„œ๋น„์Šค๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. 10์ดˆ ์ •๋„ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. Gitlab์—์„œ ์ƒˆ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ‘ธ์‹œํ•˜๊ณ , r5k๊ฐ€ Puppetmaster์—์„œ ์ž‘๋™ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. Puppet -environment=mybranch๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•  ๋•Œ๊นŒ์ง€ ๋ช‡ ๋ถ„ ๋” ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค(์ตœ์†Œ XNUMX๋ถ„).
  • ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ Gitlab์—์„œ ๋ณ‘ํ•ฉ ์š”์ฒญ์„ ์ƒ์„ฑํ•˜์—ฌ ์ด๋ฃจ์–ด์ง€๋ฉฐ ์ตœ์†Œํ•œ ํ•œ ๋ช…์˜ ํŒ€์›์˜ ์Šน์ธ์„ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŒ€์žฅ์ด ๊ฒฐ์ •ํ•œ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ XNUMX~XNUMXํšŒ์˜ ์Šน์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค(Puppet ๋งค๋‹ˆํŽ˜์ŠคํŠธ, ์Šคํฌ๋ฆฝํŠธ ๋ฐ Hiera ๋ฐ์ดํ„ฐ๋Š” ํ…์ŠคํŠธ์ด๋ฏ€๋กœ). ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ๊ถŒ์žฅ๋˜์ง€ ์•Š์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ํŒŒ์ผ์„ ์Šน์ธํ•ด์•ผ ํ•˜๋Š” ์„ค๋“๋ ฅ ์žˆ๋Š” ์ด์œ ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ๊ณ ๋ คํ•œ ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ฌด๋‹Œ - ์ธํ”„๋ผ์— ์„œ๋ฒ„๊ฐ€ 10๊ฐœ ์ด์ƒ ์žˆ์œผ๋ฉด ๊ด€๋ฆฌ๊ฐ€ ์ง€์˜ฅ์œผ๋กœ ๋ณ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ. ๋‚˜๋Š” ์ด๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  ์‹ถ์€ ํŠน๋ณ„ํ•œ ์š•๊ตฌ๊ฐ€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ์˜ ๋ง์„ ๊ทธ๋Œ€๋กœ ๋ฐ›์•„๋“ค์˜€์Šต๋‹ˆ๋‹ค.)
  • Zabbix - ๋Ÿฌ์‹œ์•„์— ์žˆ์„ ๋•Œ ์˜ค๋žซ๋™์•ˆ ์‚ดํŽด๋ดค์ง€๋งŒ ๋‚ด ์ž‘์—…์—๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ๋Š” Puppet์„ ๊ตฌ์„ฑ ๊ด€๋ฆฌ์ž๋กœ ์‚ฌ์šฉํ•˜๊ณ  Gitlab์„ ๋ฒ„์ „ ์ œ์–ด ์‹œ์Šคํ…œ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ๊ธฐํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹œ ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ Zabbix๋Š” ์ „์ฒด ๊ตฌ์„ฑ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋ฏ€๋กœ ํ˜„์žฌ ์ƒํ™ฉ์—์„œ ๊ตฌ์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
  • ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค๋Š” ๋ถ€์„œ ๋ถ„์œ„๊ธฐ์— ๋”ฐ๋ผ ์ตœ์ข…์ ์œผ๋กœ ๋‚˜์˜ฌ ๊ฒƒ์ด์ง€๋งŒ ๋‹น์‹œ์—๋Š” ๋งˆ์Šคํ„ฐํ•˜์ง€ ๋ชปํ–ˆ๊ณ  ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋Š” ์ƒ˜ํ”Œ(๊ฐœ๋… ์ฆ๋ช…)์„ ์‹œ์—ฐํ•  ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ๋ถ€ํ•  ์ˆ˜๋ฐ–์— ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์‹œ์Šคํ…œ์˜ ์™„์ „ํ•œ ์žฌ์ž‘์—…์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์ดˆ๊ธฐ ๋‹จ๊ณ„์— ์žˆ๊ฑฐ๋‚˜ ํฌ๊ธฐ๋˜์–ด ๊ฐ™์€ ์ด์œ ๋กœ ๊ฑฐ๋ถ€๋œ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์˜ต์…˜๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์ €๋Š” ์„ธ ๊ฐ€์ง€ ์ด์œ ๋กœ Icinga2๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

1 - Nrpe(Nagios์—์„œ ๋ช…๋ น ํ™•์ธ์„ ์‹คํ–‰ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์„œ๋น„์Šค)์™€์˜ ํ˜ธํ™˜์„ฑ. ์ด๋Š” ๋งค์šฐ ์ค‘์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋‹น์‹œ์—๋Š” ๋งž์ถค ์ž‘์„ฑ๋œ ์„œ๋น„์Šค/๊ฒ€์‚ฌ๊ฐ€ ํฌํ•จ๋œ ๊ฐ€์ƒ ๋จธ์‹ ์ด 135๊ฐœ(ํ˜„์žฌ 2019๋…„์—๋Š” 165๊ฐœ) ์žˆ์—ˆ๊ณ , ์ด๋ฅผ ๋ชจ๋‘ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ๊ณ ํ†ต์Šค๋Ÿฌ์› ์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
2 - ๋ชจ๋“  ๊ตฌ์„ฑ ํŒŒ์ผ์€ ํ…์ŠคํŠธ์ด๋ฏ€๋กœ ์ด ์‚ฌ์•ˆ์„ ์‰ฝ๊ฒŒ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๊ณ  ์ถ”๊ฐ€ ๋˜๋Š” ์‚ญ์ œ๋œ ๋‚ด์šฉ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ๋ณ‘ํ•ฉ ์š”์ฒญ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
3์€ ์‚ด์•„์žˆ๊ณ  ๋ฐœ์ „ ์ค‘์ธ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” OpenSource๋ฅผ ๋งค์šฐ ์ข‹์•„ํ•˜๋ฉฐ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด Pull Request ๋ฐ Issues๋ฅผ ์ƒ์„ฑํ•˜์—ฌ OpenSource์— ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ธฐ์—ฌ๋ฅผ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ๊ฐ€์ž, Icinga2.

์ œ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ์ง๋ฉดํ•ด์•ผ ํ–ˆ๋˜ ๊ฒƒ์€ ๋™๋ฃŒ๋“ค์˜ ๊ด€์„ฑ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘๊ฐ€ Nagios/Naggios(๋ฐœ์Œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” ํƒ€ํ˜‘ํ•  ์ˆ˜ ์—†์—ˆ์ง€๋งŒ)์™€ CheckMK ์ธํ„ฐํŽ˜์ด์Šค์— ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค. icinga ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์™„์ „ํžˆ ๋‹ฌ๋ผ ๋ณด์ด์ง€๋งŒ(์ด๊ฒƒ์€ ๋งˆ์ด๋„ˆ์Šค์˜€์Šต๋‹ˆ๋‹ค) ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ๋‚ด์šฉ์„ ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด๊ฒƒ์€ ์žฅ์ ์ด์—ˆ์ง€๋งŒ ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์˜€์Šต๋‹ˆ๋‹ค).

ํ•„ํ„ฐํ˜ธ์ฃผ Nagios์—์„œ Icinga2๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

์Šคํฌ๋กค ๋ง‰๋Œ€ ํฌ๊ธฐ์™€ ์Šคํฌ๋กค ํ•„๋“œ ํฌ๊ธฐ์˜ ๋น„์œจ์„ ์ถ”์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‘˜์งธ, CheckMk๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ Nagios ํ˜ธ์ŠคํŠธ์™€ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Icinga ์ธํ„ฐํŽ˜์ด์Šค์—์„œ๋Š” ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์‚ฌ๋žŒ์ด ํ•˜๋‚˜์˜ ๋ชจ๋‹ˆํ„ฐ์—์„œ ์ „์ฒด ์ธํ”„๋ผ๋ฅผ ๋ณด๋Š” ๋ฐ ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค(์‹ค์ œ๋กœ๋Š” ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜์—์„œ ์„ค๋ช…). ๋Œ€์•ˆ์€ Thruk๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ฒƒ์ด์—ˆ์ง€๋งŒ ๊ทธ ๋””์ž์ธ์€ ๊ทธ๊ฒƒ์„ ์ œ์•ˆํ•œ ์‚ฌ๋žŒ(๋‚ด๊ฐ€ ์•„๋‹Œ)์„ ์ œ์™ธํ•˜๊ณ  ํŒ€์˜ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์„ ๊ฐœ๊ทธํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

Thruk ์šฉ๊ด‘๋กœ ์†์œผ๋กœ - ํŒ€์˜ ๋งŒ์žฅ์ผ์น˜ ๊ฒฐ์ •ํ˜ธ์ฃผ Nagios์—์„œ Icinga2๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

๋ฉฐ์น ๊ฐ„์˜ ๋ธŒ๋ ˆ์ธ์Šคํ† ๋ฐ ๋์— ํ”„๋กœ๋•์…˜ ์˜์—ญ์— ํ•˜๋‚˜์˜ ๋งˆ์Šคํ„ฐ ํ˜ธ์ŠคํŠธ๊ฐ€ ์žˆ๊ณ  ๋‘ ๊ฐœ์˜ ์Šฌ๋ ˆ์ด๋ธŒ๊ฐ€ ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ์•„์ด๋””์–ด๋ฅผ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๊ฐœ๋ฐœ/ํ…Œ์ŠคํŠธ์— ์žˆ๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋‹ค๋ฅธ ๊ณต๊ธ‰์ž์— ์œ„์น˜ํ•˜์—ฌ ์šฐ๋ฆฌ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ณ ๊ฐ์ด๋‚˜ ์™ธ๋ถ€ ๊ด€์ฐฐ์ž์˜ ๊ด€์ ์—์„œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•˜๋‚˜์˜ ์›น ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๊ณ  ๊ฝค ์ž˜ ์ž‘๋™ํ–ˆ์ง€๋งŒ... Puppet์˜ ๋ฌธ์ œ๋Š” ์ด์ œ ๋งˆ์Šคํ„ฐ ํ˜ธ์ŠคํŠธ๊ฐ€ ์‹œ์Šคํ…œ์˜ ๋ชจ๋“  ํ˜ธ์ŠคํŠธ์™€ ์„œ๋น„์Šค/๊ฒ€์‚ฌ์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•˜๊ณ  ์˜์—ญ(dev-test, staging-prod, ext) ๊ฐ„์— ๋ฐฐํฌํ•˜๋ ค๋ฉด Icinga API๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ „์†กํ•˜๋Š” ๋ฐ ๋ช‡ ์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ์ง€๋งŒ ๋ชจ๋“  ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•œ ๋ชจ๋“  ์„œ๋น„์Šค์˜ Puppet ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ๋Š” ๋ช‡ ๋ถ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๊ณ  ์™œ ๊ทธ๋ ‡๊ฒŒ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š”์ง€ ์ด๋ฏธ ์—ฌ๋Ÿฌ ๋ฒˆ ์„ค๋ช…ํ–ˆ์ง€๋งŒ ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹โ€‹โ€‹๋‚˜์—๊ฒŒ ๋น„๋‚œ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์„ธ ๋ฒˆ์งธ๋กœ, SnowFlakes๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํŠน๋ณ„ํ•œ ๊ฒƒ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜ ์‹œ์Šคํ…œ์—์„œ ๋ˆˆ์— ๋„๋Š” ๊ฒƒ๋“ค์ด๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜ ๊ทœ์น™์ด ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ •๋ฉด ๊ณต๊ฒฉ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋ณด๊ฐ€ ์šธ๋ ธ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ด๋ผ๋ฉด ๋” ๊นŠ์ด ํŒŒ๊ณ ๋“ค์–ด ๊ฒฝ๋ณด๊ฐ€ ์šธ๋ฆฌ๋ฉด ์•ˆ ๋˜์ง€๋งŒ ์™œ ๊ฒฝ๋ณด๊ฐ€ ์šธ๋ฆฌ๋Š”์ง€ ์•Œ์•„๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ - ์™œ Nagios๋Š” ๋‹นํ™ฉํ•˜์ง€๋งŒ Icinga๋Š” ๋‹นํ™ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋„ท์งธ, Nagios๋Š” ๋‚˜๋ณด๋‹ค ๋จผ์ € ์—ฌ๊ธฐ์„œ XNUMX๋…„ ๋™์•ˆ ์ผํ–ˆ๊ณ  ์ฒ˜์Œ์—๋Š” ๋‚ด๊ฐ€ ์ƒˆ๋กœ ๋„์ž…ํ•œ ํž™์Šคํ„ฐ ์‹œ์Šคํ…œ๋ณด๋‹ค ๊ทธ์— ๋Œ€ํ•œ ์‹ ๋ขฐ๊ฐ€ ๋” ์ปธ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Icinga๊ฐ€ ํŒจ๋‹‰์„ ์ผ์œผํ‚ฌ ๋•Œ๋งˆ๋‹ค Nagios๊ฐ€ ๊ฐ™์€ ๋ฌธ์ œ์— ๋Œ€ํ•ด ํฅ๋ถ„ํ•  ๋•Œ๊นŒ์ง€ ์•„๋ฌด๋„ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Icinga๊ฐ€ Nagios ์ด์ „์— ์‹ค์ œ ๊ฒฝ๋ณด๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฝ์šฐ๋Š” ๋งค์šฐ ๋“œ๋ฌผ์—ˆ๊ณ  ์ €๋Š” ์ด๊ฒƒ์ด ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ๋Š” "๊ฒฐ๋ก " ์„น์…˜์—์„œ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ ๊ฒฐ๊ณผ ์‹œ์šด์ „์ด 5๊ฐœ์›” ์ด์ƒ ์ง€์—ฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(28๋…„ 2018์›” 3์ผ ์˜ˆ์ •, ์‹ค์ œ๋กœ๋Š” 2018๋…„ XNUMX์›” XNUMX์ผ). ์ฃผ๋กœ "ํŒจ๋ฆฌํ‹ฐ ๊ฒ€์‚ฌ"๋กœ ์ธํ•ด Nagios์— ์•„๋ฌด๋„ ๋ชจ๋ฅด๋Š” ์„œ๋น„์Šค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์“ฐ๋ ˆ๊ธฐ์ž…๋‹ˆ๋‹ค. ์ง€๋‚œ ๋ช‡ ๋…„๊ฐ„ ์•„๋ฌด๊ฒƒ๋„ ๋“ค์–ด๋ณธ ์ ์ด ์—†๋Š”๋ฐ ์ง€๊ธˆ ๋‹น์žฅ์€ ๊ทธ ๋†ˆ๋“ค์ด ์•„๋ฌด ์ด์œ  ์—†์ด ์น˜๋ช…ํƒ€๋ฅผ ์คฌ๊ณ  ๋‚œ ์™œ ๊ทธ ๋†ˆ๋“ค์ด ๋‚ด ํŒจ๋„์— ์—†๋Š”์ง€ ์„ค๋ช…ํ•ด์•ผ ํ–ˆ๊ณ  Icinga์— ์ถ”๊ฐ€ํ•ด์•ผ ํ–ˆ์ฃ . ์™„๋ฃŒ"(Nagios์˜ ๋ชจ๋“  ์„œ๋น„์Šค/์ˆ˜ํ‘œ๋Š” Icinga์˜ ์„œ๋น„์Šค/์ˆ˜ํ‘œ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค)

๊ตฌํ˜„:
์ฒซ ๋ฒˆ์งธ๋Š” Puppet Style๊ณผ ๊ฐ™์€ ์ฝ”๋“œ ๋Œ€ ๋ฐ์ดํ„ฐ ์ „์Ÿ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฐ์ดํ„ฐ, ์ ˆ๋Œ€์ ์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์ด Hiera์— ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ๊ทธ ์™ธ์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฝ”๋“œ๋Š” .pp ํŒŒ์ผ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜, ์ถ”์ƒํ™”, ํ•จ์ˆ˜ - ๋ชจ๋“  ๊ฒƒ์ด pp์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.
๊ฒฐ๊ณผ์ ์œผ๋กœ SSL ์ธ์ฆ์„œ์˜ ์„ฑ๋Šฅ๊ณผ ์œ ํšจ์„ฑ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์•ผ ํ•˜๋Š” ๊ฐ€์ƒ ๋จธ์‹ (์ž‘์„ฑ ๋‹น์‹œ 165๊ฐœ)๊ณผ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ 68๊ฐœ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณผ๊ฑฐ์˜ ์น˜์งˆ๋กœ ์ธํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•œ ์ •๋ณด๋Š” ๋ณ„๋„์˜ 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
              }
            }
          }
        }
      }
    }
  }
}

ํ˜ธ์ŠคํŠธ์™€ ์„œ๋น„์Šค์˜ ๊ตฌ์„ฑ ์ฝ”๋“œ๋„ ํ˜•ํŽธ์—†์–ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋ชจ๋‹ˆํ„ฐ๋ง/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์— ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ธฐ๋ณธ ์„ค์ •์„ ๊ทธ๋ฃน ์„ค์ •๊ณผ ๋ณ‘ํ•ฉํ•œ ๋‹ค์Œ ๊ฐ ๊ฐœ๋ณ„ ๊ฒ€์‚ฌ์™€ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋งค์šฐ ์ค‘์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์„ค์ •์—์„œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด์—ˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: 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_port โ€” ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด 443์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด jabber ์›น ์ธํ„ฐํŽ˜์ด์Šค๋Š” 9090์—์„œ ์ •์ง€๋˜๊ณ  Unifi๋Š” 7443์—์„œ ์ •์ง€๋ฉ๋‹ˆ๋‹ค.
http_vํ˜ธ์ŠคํŠธ 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๊ฐœ์›” ๋™์•ˆ ์œ ์ง€ํ–ˆ๋˜ ๋‘ ๊ฐœ์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์ด๋‚˜ ๊ตฌ์‹์ด๊ณ  ์ทจ์•ฝํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์ด ์•„๋‹Œ ํ•˜๋‚˜์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์„ ๋ณด์œ ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํ˜ธ์ŠคํŠธ/์„œ๋น„์Šค(๊ฒ€์‚ฌ) ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” ์ด์ œ (์ œ ์ƒ๊ฐ์—๋Š”) ํ›จ์”ฌ ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ์ด๊ฒƒ์ด ๊ทธ๋‹ค์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋˜์—ˆ์œผ๋ฏ€๋กœ ๋ชจ๋“  ์ž‘๋™ ๋ฐฉ์‹๊ณผ ํŽธ์ง‘ ์œ„์น˜๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ๋กœ์ปฌ ์œ„ํ‚ค์— ๋‘ ํŽ˜์ด์ง€๋ฅผ ๊ฒŒ์‹œํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์‚ฌ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด http_regexp๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์›ํ•˜๋Š” ํŒจํ„ด, ๋ฐ˜ํ™˜ ์ฝ”๋“œ, URL ๋ฐ ํฌํŠธ๋ฅผ ํ˜ธ์ŠคํŠธ ์„ค์ •์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ โ€‹โ€‹์žˆ์œผ๋ฉฐ ๊ฐ ๋Œ€์‹œ๋ณด๋“œ์— ๋Œ€ํ•ด ํ‘œ์‹œ๋˜๋Š” ์•Œ๋žŒ ๋ชฉ๋ก์„ ์ •์˜ํ•˜๊ณ  Puppet ๋ฐ ๋ณ‘ํ•ฉ ์š”์ฒญ์„ ํ†ตํ•ด ์ด ๋ชจ๋“  ๊ฒƒ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์  :

  • ํŒ€ ๊ตฌ์„ฑ์›์˜ ๊ด€์„ฑ - Nagios๋Š” ์ผํ•˜๊ณ  ๋˜ ์ผํ•˜๊ณ  ์ผํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด Isinga๋Š” ๋Š์ž„์—†์ด ๋ฒ„๊ทธ๊ฐ€ ๋งŽ๊ณ  ๋А๋ฆฝ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์—ญ์‚ฌ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๋‚˜์š”? ์•„ ์  ์žฅ โ€‹โ€‹์—…๋ฐ์ดํŠธ๊ฐ€ ์•ˆ๋˜๋„ค์š”... (์‹ค์ œ ๋ฌธ์ œ๋Š” ์•Œ๋žŒ ๋‚ด์—ญ์ด ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๊ณ  F5๋กœ๋งŒ ์—…๋ฐ์ดํŠธ๋œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค)
  • ์‹œ์Šคํ…œ์˜ ๊ด€์„ฑ - ์›น ์ธํ„ฐํŽ˜์ด์Šค์—์„œ "์—…๋ฐ์ดํŠธ"(์ง€๊ธˆ ํ™•์ธ)๋ฅผ ํด๋ฆญํ•˜๋ฉด ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ํ™”์„ฑ์˜ ๋‚ ์”จ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋ฉฐ, ํŠนํžˆ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์ˆ˜์‹ญ ์ดˆ๊ฐ€ ํ•„์š”ํ•œ ๋ณต์žกํ•œ ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ ๋”์šฑ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๊ฒฐ๊ณผ๋Š” ์ •์ƒ์ž…๋‹ˆ๋‹ค. ํ˜ธ์ฃผ Nagios์—์„œ Icinga2๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋‘ ์‹œ์Šคํ…œ์„ ๋‚˜๋ž€ํžˆ ์šด์˜ํ•œ 5๊ฐœ์›” ๊ฐ„์˜ ํ†ต๊ณ„์— ๋”ฐ๋ฅด๋ฉด Nagios๋Š” ํ•ญ์ƒ Icinga๋ณด๋‹ค ๋” ๋น ๋ฅด๊ฒŒ ์ž‘์—…ํ–ˆ์œผ๋ฉฐ ์ด๋กœ ์ธํ•ด ์ •๋ง ์งœ์ฆ์ด ๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณด๊ธฐ์—” ํƒ€์ด๋จธ์— ๋ญ”๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ ํ™•์ธ์€ 30๋ถ„๋งˆ๋‹ค ์ด๋ฃจ์–ด์ง€๋Š”๋ฐ ์‹ค์ œ๋กœ๋Š” XNUMX์‹œ XNUMX๋ถ„๋งˆ๋‹ค ๊ทธ๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.
  • ์–ธ์ œ๋“ ์ง€ ์„œ๋น„์Šค๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋ฉด(systemctl restart icinga2) ํ•ด๋‹น ์‹œ์ ์— ์ง„ํ–‰ ์ค‘์ด๋˜ ๋ชจ๋“  ๊ฒ€์‚ฌ์—์„œ ์‹ฌ๊ฐํ•œ ๊ฒฝ๋ณด๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ™”๋ฉด์—์„œ๋„, ๋ฐ–์—์„œ๋„ ๋ชจ๋“  ๊ฒƒ์ด ๋–จ์–ด์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ(ํ™•์ธ๋œ ๋ฒ„๊ทธ).

๊ทธ๋Ÿฌ๋‚˜ ์ „๋ฐ˜์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

DDoS ๋ณดํ˜ธ, VPS VDS ์„œ๋ฒ„๊ฐ€ ์žˆ๋Š” ์‚ฌ์ดํŠธ๋ฅผ ์œ„ํ•œ ์•ˆ์ •์ ์ธ ํ˜ธ์ŠคํŒ… ๊ตฌ์ž… ๐Ÿ”ฅ DDoS ๊ณต๊ฒฉ ๋ฐฉ์ง€ ๊ธฐ๋Šฅ์ด ํƒ‘์žฌ๋œ ์•ˆ์ •์ ์ธ ์›น์‚ฌ์ดํŠธ ํ˜ธ์ŠคํŒ…, VPS ๋ฐ VDS ์„œ๋ฒ„๋ฅผ ๊ตฌ๋งคํ•˜์„ธ์š” | ProHoster