ããã«ã¡ã¯ãã¿ããªã ç§ã¯ OK ã§äž»å°çãªã·ã¹ãã 管çè
ãšããŠåããŠãããããŒã¿ã«ã®å®å®ããéçšãæ
åœããŠããŸãã ãã£ã¹ã¯ãèªåçã«äº€æããããã»ã¹ãã©ã®ããã«æ§ç¯ãããããããŠã©ã®ããã«ããŠç®¡çè
ããã®ããã»ã¹ããé€å€ããŠãããã«çœ®ãæãããã«ã€ããŠè©±ããããšæããŸãã
ãã®èšäºã¯äžçš®ã®é³èš³ã§ã
ãã£ã¹ã¯äº€æããã»ã¹ã®æ§ç¯
ãŸãããã€ãã®æ°å
OK ã¯äœçŸäžäººãã®äººã ãå©çšãã巚倧ãªãµãŒãã¹ã§ãã 7 ã€ã®ç°ãªãããŒã¿ã»ã³ã¿ãŒã«ããçŽ 4 å°ã®ãµãŒããŒã«ãã£ãŠãµãŒãã¹ãæäŸãããŸãã ãµãŒããŒã«ã¯ 70 ãè¶ ãããã£ã¹ã¯ãå«ãŸããŠããŸãã ç©ã¿äžãããšé«ã1km以äžã®å¡ãåºæ¥äžãããŸãã
ããŒããã©ã€ãã¯ãæãé »ç¹ã«æ éãããµãŒããŒã³ã³ããŒãã³ãã§ãã ãã®ãããªããªã¥ãŒã ã§ã¯ã30 é±éã«çŽ XNUMX æã®ãã£ã¹ã¯ã亀æããå¿ èŠãããããã®æé ã¯ããŸãå¿«é©ãªã«ãŒãã£ã³ã§ã¯ãããŸããã
äºä»¶
åœç€Ÿã§ã¯ã€ã³ã·ãã³ã管çãæ¬æ Œçã«å°å ¥ããŠããŸãã ããããã®ã€ã³ã·ãã³ãã Jira ã«èšé²ãã解決ããŠæŽçããŸãã ãŠãŒã¶ãŒã«åœ±é¿ãäžããã€ã³ã·ãã³ããçºçããå Žåã¯ãå¿ ãéãŸã£ãŠããã®ãããªå Žåã®è¿ éãªå¯Ÿå¿æ¹æ³ã圱é¿ã軜æžããæ¹æ³ããããŠãã¡ããåçºãé²ãæ¹æ³ãæ€èšããŸãã
ã¹ãã¬ãŒãžããã€ã¹ãäŸå€ã§ã¯ãããŸããã ãããã®ã¹ããŒã¿ã¹ã¯ Zabbix ã«ãã£ãŠç£èŠãããŸãã Syslog å ã®ã¡ãã»ãŒãžã®æžã蟌ã¿/èªã¿åããšã©ãŒãç£èŠããHW/SW RAID ã®ã¹ããŒã¿ã¹ãåæããSMART ãç£èŠããSSD ã®æ©èãèšç®ããŸãã
以åã«ãã£ã¹ã¯ãå€æŽããæ¹æ³
Zabbix ã§ããªã¬ãŒãçºçãããšãJira ã§ã€ã³ã·ãã³ããäœæãããããŒã¿ã»ã³ã¿ãŒã®é©åãªãšã³ãžãã¢ã«èªåçã«å²ãåœãŠãããŸãã ããã¯ããã¹ãŠã®ããŒããŠã§ã¢ ã€ã³ã·ãã³ããã€ãŸãããŒã¿ ã»ã³ã¿ãŒå
ã®æ©åšã®ç©ççãªäœæ¥ãå¿
èŠãªã€ã³ã·ãã³ãã«å¯ŸããŠè¡ãããŸãã
ããŒã¿ã»ã³ã¿ãŒãšã³ãžãã¢ã¯ãããŒããŠã§ã¢ã«é¢ããåé¡ã解決ãããµãŒããŒã®èšçœ®ãä¿å®ã解äœãæ
åœãã人ã§ãã ãã±ãããåãåã£ããšã³ãžãã¢ã¯ä»äºã«åãæãããŸãã ãã£ã¹ã¯ ã·ã§ã«ãã§ã¯ã圌ã¯åå¥ã«ãã£ã¹ã¯ã亀æããŸãã ããããå¿
èŠãªããã€ã¹ã«ã¢ã¯ã»ã¹ã§ããªãå Žåããšã³ãžãã¢ã¯å€åäžã®ã·ã¹ãã 管çè
ã«å©ããæ±ããŸãã ãŸãããã£ã¹ã¯ãå転ããå€ãå¿
èŠããããŸãã ãããè¡ãã«ã¯ããµãŒããŒäžã§å¿
èŠãªå€æŽãå ããã¢ããªã±ãŒã·ã§ã³ãåæ¢ãããã£ã¹ã¯ãã¢ã³ããŠã³ãããå¿
èŠããããŸãã
åœçŽã®ã·ã¹ãã 管çè ã¯ãå€åã·ããäžã®ããŒã¿ã«å šäœã®éçšã«è²¬ä»»ãè² ããŸãã 圌ã¯ã€ã³ã·ãã³ãã調æ»ãã修埩ãè¡ããéçºè ãå°ããªã¿ã¹ã¯ãå®äºããã®ãæ¯æŽããŸãã 圌ã¯ããŒããã©ã€ãã ããæ±ã£ãŠããããã§ã¯ãããŸããã
以åã¯ãããŒã¿ã»ã³ã¿ãŒã®ãšã³ãžãã¢ã¯ãã£ãããéããŠã·ã¹ãã 管çè ãšéä¿¡ããŠããŸããã ãšã³ãžãã¢ã¯ Jira ãã±ãããžã®ãªã³ã¯ãéä¿¡ãã管çè ã¯ããããã©ããŒããäœæ¥ã®ãã°ãã¡ã¢åž³ã«èšé²ããŸããã ãããããã£ããã¯ãã®ãããªã¿ã¹ã¯ã«ã¯äžäŸ¿ã§ããããã§ã®æ å ±ã¯æ§é åãããŠããããããã«å€±ãããŸãã ãŸãã管çè ã¯ã³ã³ãã¥ãŒã¿ããé¢ãããã°ããã®éãªã¯ãšã¹ãã«å¿çããããšã³ãžãã¢ããã£ã¹ã¯ã®ã¹ã¿ãã¯ãæã£ãŠãµãŒããŒã®åã«ç«ã£ãŠåŸ æ©ããããšãã§ããŸãã
ããããææªã ã£ãã®ã¯ã管çè ãå šäœåãã€ãŸãã©ã®ãããªãã£ã¹ã¯ ã€ã³ã·ãã³ããååšããã©ãã§åé¡ãçºçããå¯èœæ§ãããããææ¡ããŠããªãã£ãããšã§ãã ããã¯ããã¹ãŠã®ããŒããŠã§ã¢ ã€ã³ã·ãã³ãããšã³ãžãã¢ã«å§ä»»ããŠããããã§ãã ã¯ãã管çè ã®ããã·ã¥ããŒãã«ãã¹ãŠã®ã€ã³ã·ãã³ãã衚瀺ããããšãã§ããŸããã ãããããããã¯å€æ°ããã管çè ãé¢äžããã®ã¯ãã®ãã¡ã®äžéšã®ã¿ã§ãã
ããã«ããšã³ãžãã¢ã¯ç¹å®ã®ãµãŒããŒã®ç®çããã©ã€ãéã®æ å ±ã®åæ£ã«ã€ããŠäœãç¥ããªããããåªå é äœãæ£ããèšå®ã§ããŸããã§ããã
æ°èŠäº€ææé
ç§ãã¡ãæåã«è¡ã£ãã®ã¯ããã¹ãŠã®ãã£ã¹ã¯ ã€ã³ã·ãã³ããå¥ã®ã¿ã€ãã®ãHW ãã£ã¹ã¯ãã«ç§»åãããããã㯠ããã€ã¹åããããµã€ãºããããã³ããã£ã¹ã¯ ã¿ã€ãããã£ãŒã«ããè¿œå ããããšã§ãããããã«ããããã®æ å ±ããã±ããã«ä¿åããããã£ããã§åžžã«ããåãããå¿ èŠã¯ãããŸããã
ãŸããXNUMX ã€ã®ã€ã³ã·ãã³ãã®é㯠XNUMX ã€ã®ãã£ã¹ã¯ã®ã¿ãå€æŽããããšã«ãåæããŸããã ããã«ãããå°æ¥ã®èªååããã»ã¹ãçµ±èšåéãäœæ¥ã倧å¹
ã«ç°¡çŽ åãããŸããã
ãŸããã責任管çè ãæ¬ãè¿œå ããŸããã ããã«ã¯å€åäžã®ã·ã¹ãã 管çè ãèªåçã«æ¿å ¥ãããŸãã ãšã³ãžãã¢ã¯èª°ã責任è ã§ããããåžžã«ç¢ºèªã§ãããããããã¯éåžžã«äŸ¿å©ã§ãã ã«ã¬ã³ããŒã«ã¢ã¯ã»ã¹ããŠæ€çŽ¢ããå¿ èŠã¯ãããŸããã ãã®ãã£ãŒã«ãã«ããã管çè ã®å©ããå¿ èŠãªãã±ããã管çè ã®ããã·ã¥ããŒãã«è¡šç€ºã§ããããã«ãªããŸããã
ãã¹ãŠã®åå è
ãã€ãããŒã·ã§ã³ããæ倧éã®æ©æµãåããããããã«ããããã«ãç§ãã¡ã¯ãã£ã«ã¿ãŒãšããã·ã¥ããŒããäœæãããããã«ã€ããŠåå è
ã«äŒããŸããã 人ã¯å€åãç解ãããšããããäžå¿
èŠãªãã®ãšããŠé ãããªããªããŸãã ãšã³ãžãã¢ã¯ããµãŒããŒãé
眮ãããŠããã©ãã¯çªå·ããã£ã¹ã¯ã®ãµã€ãºãšçš®é¡ãç¥ã£ãŠããããšãéèŠã§ãã 管çè
ã¯ãŸãããããã©ã®ãããªçš®é¡ã®ãµãŒããŒã®ã°ã«ãŒããªã®ãããŸããã£ã¹ã¯ã亀æãããšã©ã®ãããªåœ±é¿ãããã®ãââãç解ããå¿
èŠããããŸãã
ãã£ãŒã«ããšãã®è¡šç€ºã®ååšã¯äŸ¿å©ã§ããããã£ããã䜿çšããå¿ èŠããªããªãããã§ã¯ãããŸããã ãããå®çŸããã«ã¯ãã¯ãŒã¯ãããŒãå€æŽããå¿ èŠããããŸããã
以åã¯ãããªæãã§ããã
ããã¯ã管çè
ã®å©ããå¿
èŠãšããªããšã³ãžãã¢ãä»æ¥ãä»äºãç¶ããæ¹æ³ã§ãã
ãŸãæåã«æ°ããã¹ããŒã¿ã¹ãå°å ¥ããŸãã 調æ»ããã ãšã³ãžãã¢ã管çè ãå¿ èŠãã©ããããŸã 決å®ããŠããªãå Žåããã±ããã¯ãã®ã¹ããŒã¿ã¹ã«ãªããŸãã ãã®ã¹ããŒã¿ã¹ãéããŠããšã³ãžãã¢ã¯ãã±ããã管çè ã«è»¢éã§ããŸãã ããã«ããã£ã¹ã¯ã亀æããå¿ èŠãããããã£ã¹ã¯èªäœãçŸå Žã«ãªãå Žåããã®ã¹ããŒã¿ã¹ã䜿çšããŠãã±ããã«ããŒã¯ãä»ããŸãã ãã㯠CDN ãšãªã¢ãŒã ãµã€ãã®å Žåã«çºçããŸãã
ã¹ããŒã¿ã¹ãè¿œå ããŸãã ã¬ãã£ã ãã±ããã¯ãã£ã¹ã¯äº€æåŸã«åŒãç¶ãããŸãã ã€ãŸãããã¹ãŠããã§ã«å®äºããŠããŸãããHW/SW RAID ã¯ãµãŒããŒäžã§åæãããŠããŸãã ããã«ã¯ããªãé·ãæéããããå ŽåããããŸãã
管çè ãäœæ¥ã«é¢äžããå Žåãã¹ããŒã ã¯ããå°ãè€éã«ãªããŸãã
ã¹ããŒã¿ã¹ãã Open ãã±ããã¯ãã·ã¹ãã 管çè
ãšãšã³ãžãã¢ã®äž¡æ¹ã翻蚳ã§ããŸãã ã¹ããŒã¿ã¹äž é²è¡äž 管çè
ã¯ãã£ã¹ã¯ãå転ããå€ãããšã³ãžãã¢ãç°¡åã«ãã£ã¹ã¯ãåŒãåºããããã«ããŸãããµãŒããŒã®ç¹å®ã®ã°ã«ãŒãã«å¿ããŠãããã¯ã©ã€ãããªã³ã«ãããã£ã¹ã¯ãã¢ã³ããŠã³ãããã¢ããªã±ãŒã·ã§ã³ãåæ¢ããŸãã
ãã®åŸããã±ããã¯æ¬¡ã®å Žæã«è»¢éãããŸã å€æŽããæºåãã§ããŸããïŒããã¯ãšã³ãžãã¢ã«ãã£ã¹ã¯ãåŒãåºãããšããåå³ã§ãã Jira ã®ãã¹ãŠã®ãã£ãŒã«ãã¯ãã§ã«å ¥åãããŠããããšã³ãžãã¢ã¯ãã£ã¹ã¯ã®ã¿ã€ããšãµã€ãºãç¥ã£ãŠããŸãã ãã®ããŒã¿ã¯ã以åã®ã¹ããŒã¿ã¹ã«åºã¥ããŠèªåçã«å ¥åããããã管çè ã«ãã£ãŠå ¥åãããŸãã
ãã£ã¹ã¯ã亀æãããšããã±ããã®ã¹ããŒã¿ã¹ã¯æ¬¡ã®ããã«å€ãããŸãã ããã£ãã æ£ãããã£ã¹ã¯ãæ¿å ¥ãããŠããããšãããŒãã£ã·ã§ãã³ã°ãå®äºããŠããããšãã¢ããªã±ãŒã·ã§ã³ãèµ·åãããŠããããšãããã³äžéšã®ããŒã¿å埩ã¿ã¹ã¯ãèµ·åãããŠããããšã確èªããŸãã ãã±ããã¯ã¹ããŒã¿ã¹ã«è»¢éããããšãã§ããŸã ã¬ãã£ããã®å Žåã管çè ããã£ã¹ã¯ãå転ãããã®ã§ã管çè ãåŒãç¶ã責任ãè² ããŸãã å®æå³ã¯æ¬¡ã®ããã«ãªããŸãã
æ°ãããã£ãŒã«ããè¿œå ããããšã§ãäœæ¥ãã¯ããã«æ¥œã«ãªããŸããã 圌ãã¯æ§é åãããæ
å ±ãæ±ãå§ããäœãã©ã®æ®µéã§è¡ãå¿
èŠãããããæããã«ãªããŸããã åªå
é äœã¯ç®¡çè
ã«ãã£ãŠèšå®ãããããã«ãªã£ããããããéèŠãªãã®ã«ãªããŸããã
ãã£ããã®å¿ èŠã¯ãããŸããã ãã¡ããã管çè ã¯ãšã³ãžãã¢ã«ãããã¯ãã£ãšæ©ã亀æããå¿ èŠããããŸãããŸãã¯ãããå€æ¹ã§ããã亀æããæéã¯ãããŸãã?ããšæçŽãæžãããšãã§ããŸãã ããããç§ãã¡ã¯ãããã®åé¡ã«ã€ããŠæ¯æ¥ãã£ããã§ã³ãã¥ãã±ãŒã·ã§ã³ããããšã¯ãããããŸããã
ãã£ã¹ã¯ã¯ãããã§å€æŽããå§ããŸããã 管çè ãå°ãæ©ãåºå€ããèªç±æéãããããŸã äœãèµ·ãã£ãŠããªãå Žåã¯ã亀æçšã«å€æ°ã®ãµãŒããŒãæºåã§ããŸãããã£ãŒã«ãã«èšå ¥ããããŒããŒã·ã§ã³ãããã£ã¹ã¯ãåé€ããã¿ã¹ã¯ããšã³ãžãã¢ã«è»¢éããŸãã ãšã³ãžãã¢ã¯å°ãé ããŠããŒã¿ã»ã³ã¿ãŒã«æ¥ãŠãã¿ã¹ã¯ã確èªããå庫ããå¿ èŠãªãã©ã€ããåãåºããŠããã«äº€æããŸãã ãã®çµæã代æ¿çãåäžããŸããã
ã¯ãŒã¯ãããŒæ§ç¯æã«åŠãã æèš
- ããã·ãŒãžã£ãæ§ç¯ãããšãã¯ãããŸããŸãªãœãŒã¹ããæ
å ±ãåéããå¿
èŠããããŸãã
管çè ã®äžã«ã¯ããšã³ãžãã¢ãèªåã§ãã£ã¹ã¯ã亀æããŠããããšãç¥ããªãã£ã人ãããŸããã MD RAID åæã¯ãšã³ãžãã¢ã«ãã£ãŠåŠçããããšèããŠãã人ãããŸãããããšã³ãžãã¢ã®äžã«ã¯ã¢ã¯ã»ã¹æš©ããæã£ãŠããªã人ãããŸããã äžéšã®äžæµã®ãšã³ãžãã¢ã¯ãããå®è¡ããŸããããããã»ã¹ãã©ãã«ã説æãããŠããªãã£ããããå¿ ãããããã§ã¯ãããŸããã§ããã - æé ã¯ã·ã³ãã«ã§ç解ãããããã®ã§ãªããã°ãªããŸããã
人ã«ãšã£ãŠå€ãã®ã¹ãããã念é ã«çœ®ãã®ã¯å°é£ã§ãã Jira ã®æãéèŠãªé£æ¥ã¹ããŒã¿ã¹ã¯ã¡ã€ã³ç»é¢ã«é 眮ããå¿ èŠããããŸãã ãããã®ååã¯å€æŽã§ããŸããããšãã°ããé²è¡äžããå€æŽæºåå®äºããšåŒã³ãŸãã ãŸããä»ã®ã¹ããŒã¿ã¹ã¯ç®éãã«ãªããªãããã«ããããããŠã³ ã¡ãã¥ãŒã§é衚瀺ã«ããããšãã§ããŸãã ãããã人ã ãå¶éããã移è¡ããæ©äŒãäžããæ¹ãè¯ãã§ãããã
ã€ãããŒã·ã§ã³ã®äŸ¡å€ã説æããã 人ã ãç解ãããšãæ°ããæé ãããåãå ¥ãããããªããŸãã ç§ãã¡ã«ãšã£ãŠã人ã ãããã»ã¹å šäœãã¯ãªãã¯ããã®ã§ã¯ãªããããã«åŸãããšãéåžžã«éèŠã§ããã 次ã«ãããã«èªååãæ§ç¯ããŸããã - åŸ
ã£ãŠãåæããŠãç解ããŠãã ããã
æé ã®æ§ç¯ãæè¡çãªå®è£ ãäŒè°ãšãã£ã¹ã«ãã·ã§ã³ã«çŽ XNUMX ãæããããŸããã ãããŠå®è£ ã«ã¯XNUMXãæ以äžããããŸãã 人ã ãåŸã ã«ãã®ã€ãããŒã·ã§ã³ãå©çšãå§ããŠããæ§åãç®ã®åœããã«ããŸããã åæ段éã§ã¯åŠå®çãªæèŠãå€ãã£ãã§ãã ããããããã¯æé èªäœããã®æè¡çãªå®è£ ãšã¯å®å šã«ç¬ç«ããŠããŸããã ããšãã°ããã管çè 㯠Jira ã§ã¯ãªã Confluence ã® Jira ãã©ã°ã€ã³ã䜿çšããŠãããããããã€ãã®æ©èœãå©çšã§ããŸããã§ããã 圌㫠Jira ãèŠãããšãããäžè¬çãªã¿ã¹ã¯ãšãã£ã¹ã¯ã®äº€æã®äž¡æ¹ã§ç®¡çè ã®çç£æ§ãåäžããŸããã
ãã£ã¹ã¯äº€æã®èªåå
ç§ãã¡ã¯ãã£ã¹ã¯äº€æã®èªååã«äœåºŠãåãçµã¿ãŸããã ãã§ã«éçºãšã¹ã¯ãªããããããŸãããããããã¯ãã¹ãŠå¯Ÿè©±åãŸãã¯æåã§åäœããèµ·åãå¿ èŠã§ããã ãããŠãæ°ããæé ãå°å ¥ããŠåããŠãããããŸãã«ç§ãã¡ã«æ¬ ããŠãããã®ã§ããããšã«æ°ã¥ããŸããã
眮æããã»ã¹ã¯è€æ°ã®ã¹ããŒãžã«åå²ãããåã¹ããŒãžã«ã¯ç¹å®ã®å®è¡è ãšã¢ã¯ã·ã§ã³ã®ãªã¹ãããããããäžåºŠã«ãã¹ãŠãèªååããã®ã§ã¯ãªãã段éçã«èªååãæå¹ã«ããããšãã§ããŸãã ããšãã°ãæãåçŽãªæ®µéã§ããæºåå®äº (RAID/ããŒã¿åæã®ç¢ºèª) ã¯ããããã«ç°¡åã«å§ä»»ã§ããŸãã ããããå°ãåŠç¿ãããããã£ã¹ã¯ãå転ããããªã©ãããéèŠãªã¿ã¹ã¯ããããã«äžããããšãã§ããŸãã
åç©åã®ã»ããã¢ãã
ãããã«ã€ããŠè©±ãåã«ãã€ã³ã¹ã¿ã¬ãŒã·ã§ã³ã®åç©åãžå°ã足ã延ã°ããŠã¿ãŸãããã ãŸã第äžã«ãããã¯ã€ã³ãã©ã¹ãã©ã¯ãã£ã®å·šå€§ãªãµã€ãºã«ãããã®ã§ãã 次ã«ãåãµãŒãã¹ã«æé©ãªããŒããŠã§ã¢æ§æãéžæããããã«åªããŸãã åœç€Ÿã«ã¯çŽ 20 çš®é¡ã®ããŒããŠã§ã¢ RAID ã¢ãã«ãããããã®ã»ãšãã©ã LSI ãš Adaptec ã§ãããããŒãžã§ã³ã®ç°ãªã HP ãš DELL ããããŸãã å RAID ã³ã³ãããŒã©ã«ã¯ç¬èªã®ç®¡çãŠãŒãã£ãªãã£ããããŸãã ã³ãã³ãã®ã»ãããšãã®çºè¡ã¯ãå RAID ã³ã³ãããŒã©ã®ããŒãžã§ã³ããšã«ç°ãªãå ŽåããããŸãã HW-RAID ã䜿çšãããªãå Žåã¯ãmdraid ã䜿çšã§ããŸãã
ã»ãšãã©ãã¹ãŠã®æ°èŠã€ã³ã¹ããŒã«ã¯ãã£ã¹ã¯ ããã¯ã¢ãããªãã§è¡ãããŸãã ã·ã¹ãã ããµãŒããŒã§ã¯ãªãããŒã¿ã»ã³ã¿ãŒ ã¬ãã«ã§ããã¯ã¢ãããããããåœç€Ÿã§ã¯ããŒããŠã§ã¢ RAID ãšãœãããŠã§ã¢ RAID ã䜿çšããªãããã«åªããŠããŸãã ããããåœç¶ã®ããšãªããããµããŒãããå¿ èŠãããã¬ã¬ã·ãŒ ãµãŒããŒãæ°å€ããããŸãã
RAID ã³ã³ãããŒã©ãŒå ã®ãã£ã¹ã¯ã RAW ããã€ã¹ã«è»¢éãããå Žæãããã°ãJBOD ã䜿çšãããå ŽæããããŸãã ãµãŒããŒã«ã·ã¹ãã ãã£ã¹ã¯ã XNUMX ã€ããæ§æãããã亀æããå¿ èŠãããå Žåã¯ãåãããŒãžã§ã³ã® OS ãšã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããŠãµãŒããŒãåã€ã³ã¹ããŒã«ãããã®åŸãæ§æãã¡ã€ã«ãè¿œå ããŠã¢ããªã±ãŒã·ã§ã³ãèµ·åããå¿ èŠããããŸãã ãŸããããã¯ã¢ããããã£ã¹ã¯ ãµãã·ã¹ãã ã¬ãã«ã§ã¯ãªããã¢ããªã±ãŒã·ã§ã³èªäœã§çŽæ¥å®è¡ããããµãŒã㌠ã°ã«ãŒããæ°å€ããããŸãã
åèšã§ 400 ãè¶ ããç¬èªã®ãµãŒã㌠ã°ã«ãŒãããããçŽ 100 ã®ç°ãªãã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŠããŸãã ãã®ãããªèšå€§ãªæ°ã®ãªãã·ã§ã³ãã«ããŒããã«ã¯ãå€æ©èœã®èªååããŒã«ãå¿ èŠã§ããã ã§ããã°ããããæžãã人ã ãããµããŒãã§ããããã«ãåçŽãª DSL ã䜿çšããŠãã ããã
Ansible ãéžæããã®ã¯ããšãŒãžã§ã³ãã¬ã¹ã§ãããããã€ã³ãã©ã¹ãã©ã¯ãã£ãæºåããå¿ èŠããªããããã«éå§ã§ããããã§ãã ããã«ãPython ã§æžãããŠãããããŒã å ã§æšæºãšããŠåãå ¥ããããŠããŸãã
äžè¬ã¹ããŒã
XNUMX ã€ã®ã€ã³ã·ãã³ããäŸãšããŠãäžè¬çãªèªååã¹ããŒã ãèŠãŠã¿ãŸãããã Zabbix 㯠sdb ãã£ã¹ã¯ã«é害ãçºçããããšãæ€åºããããªã¬ãŒãç¹ç¯ããJira ã§ãã±ãããäœæãããŸãã 管çè ã¯ãããèŠãŠããããéè€ã§ã誀æ€ç¥ã§ããªãããšãã€ãŸããã£ã¹ã¯ãå€æŽããå¿ èŠãããããšãèªèãããã±ããããé²è¡äžãã«è»¢éããŸããã
Python ã§æžããã DiskoBot ã¢ããªã±ãŒã·ã§ã³ã¯ãJira ã«å®æçã«æ°ãããã±ãããããŒãªã³ã°ããŸãã æ°ããé²è¡äžãã±ããã衚瀺ãããããšããããã察å¿ããã¹ã¬ãããããªã¬ãŒãããAnsible ã§ãã¬ã€ããã¯ãèµ·åãããŸã (ãã㯠Jira ã®ã¹ããŒã¿ã¹ããšã«è¡ãããŸã)ã ãã®å ŽåãPrepare2change ãèµ·åãããŸãã
Ansible ã¯ãã¹ãã«éä¿¡ããããã£ã¹ã¯ãå転ããåé€ããã³ãŒã«ããã¯ãä»ããŠã¢ããªã±ãŒã·ã§ã³ã«ã¹ããŒã¿ã¹ãå ±åããŸãã
çµæã«åºã¥ããŠããããã¯ãã±ãããå€æŽæºåå®äºã«èªåçã«è»¢éããŸãã ãšã³ãžãã¢ã¯éç¥ãåãåãããã£ã¹ã¯ãå€æŽãã«è¡ãããã®åŸãã±ããã Changed ã«è»¢éããŸãã
äžã§èª¬æããã¹ããŒã ã«ããã°ããã±ããã¯ãããã«æ»ããããããå¥ã®ãã¬ã€ããã¯ãèµ·åãããã¹ãã«è¡ãããã£ã¹ã¯ãå転ãããŸãã ãããããã±ãããã¯ããŒãºããŸãã äžæ³ïŒ
次ã«ãã·ã¹ãã ã®ããã€ãã®ã³ã³ããŒãã³ãã«ã€ããŠèª¬æããŸãã
ãã£ã¹ã³ããã
ãã®ã¢ããªã±ãŒã·ã§ã³ã¯ Python ã§æžãããŠããŸãã JQL ã«åŸã£ãŠ Jira ãããã±ãããéžæããŸãã ãã±ããã®ã¹ããŒã¿ã¹ã«å¿ããŠãåŸè ã¯å¯Ÿå¿ãããã³ãã©ãŒã«é²ã¿ã次ã«ã¹ããŒã¿ã¹ã«å¯Ÿå¿ãã Ansible ãã¬ã€ããã¯ãèµ·åããŸãã
JQL ãšããŒãªã³ã°ééã¯ãã¢ããªã±ãŒã·ã§ã³æ§æãã¡ã€ã«ã§å®çŸ©ãããŸãã
jira_states:
investigate:
jql: '⊠status = Open and "Disk Size" is EMPTY'
interval: 180
inprogress:
jql: '⊠and "Disk Size" is not EMPTY and "Device Name" is not EMPTY'
ready:
jql: '⊠and (labels not in ("dbot_ignore") or labels is EMPTY)'
interval: 7200
ããšãã°ããé²è¡äžãã¹ããŒã¿ã¹ã®ãã±ããã®ãã¡ãããã£ã¹ã¯ ãµã€ãºããã£ãŒã«ããšãããã€ã¹åããã£ãŒã«ããå ¥åãããŠãããã±ããã®ã¿ãéžæãããŸãã ããã€ã¹åã¯ããã¬ã€ããã¯ãå®è¡ããããã«å¿ èŠãªããã㯠ããã€ã¹ã®ååã§ãã ãã£ã¹ã¯ ãµã€ãºã¯ããšã³ãžãã¢ãå¿ èŠãªãã£ã¹ã¯ ãµã€ãºãç¥ãããã«å¿ èŠã§ãã
ãŸããReady ã¹ããŒã¿ã¹ã®ãã±ããã®ãã¡ãdbot_ignore ã©ãã«ãä»ããŠãããã±ããã¯ãã£ã«ã¿ãŒã§é€å€ãããŸãã ã¡ãªã¿ã«ããã®ãããªãã£ã«ã¿ãªã³ã°ãšéè€ãã±ããã®ããŒã¯ä»ããšçµ±èšã®åéã®äž¡æ¹ã« Jira ã©ãã«ã䜿çšããŸãã
ãã¬ã€ããã¯ã倱æããå ŽåãJira 㯠dbot_failed ã©ãã«ãå²ãåœãŠãŠãåŸã§åé¡ã§ããããã«ããŸãã
Ansible ãšã®çžäºéçšæ§
ã¢ããªã±ãŒã·ã§ã³ã¯æ¬¡ã®æ¹æ³ã§ Ansible ãšéä¿¡ããŸãã
ãŸããAnsible ã§ã¯ã*extra_vars* çµç±ã§ããããã¯ããã€ã¹ã®ååããã±ããã®ã¹ããŒã¿ã¹ãããã³çºè¡ããŒãå«ã callback_url ã䜿çšããŸãããã㯠HTTP ã§ã®ã³ãŒã«ããã¯ã«äœ¿çšãããŸãã
èµ·åããšã«ãgroup_vars ãé©çšãããããã«ãXNUMX ã€ã®ãã¹ããšãã®ãã¹ããå±ããã°ã«ãŒãã§æ§æãããäžæã€ã³ãã³ããªãçæãããŸãã
以äžã¯ãHTTP ã³ãŒã«ããã¯ãå®è£ ããã¿ã¹ã¯ã®äŸã§ãã
ã³ãŒã«ããã¯ã䜿çšã㊠Playbook ãå®è¡ããçµæãååŸããŸãã ãããã«ã¯æ¬¡ã® XNUMX ã€ã®ã¿ã€ãããããŸãã
Ansible ã³ãŒã«ãã㯠ãã©ã°ã€ã³ ããã¬ã€ããã¯ã®å®è¡çµæã«é¢ããããŒã¿ãæäŸããŸãã éå§ãããã¿ã¹ã¯ãæ£åžžã«å®äºããã¿ã¹ã¯ããŸãã¯å€±æããã¿ã¹ã¯ã«ã€ããŠèª¬æããŸãã ãã®ã³ãŒã«ããã¯ã¯ããã¬ã€ããã¯ã®åçãçµäºãããšãã«åŒã³åºãããŸãã- ãã¬ã€ããã¯ã®åçäžã«æ å ±ãåä¿¡ããããã® HTTP ã³ãŒã«ããã¯ã Ansible ã¿ã¹ã¯ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ãžã® POST/GET ãªã¯ãšã¹ããå®è¡ããŸãã
å€æ°ã¯ããã¬ã€ããã¯ã®å®è¡äžã«å®çŸ©ãããä¿åããŠä»¥éã®å®è¡ã§äœ¿çšãã HTTP ã³ãŒã«ããã¯ãä»ããŠæž¡ãããŸãã ãã®ããŒã¿ãsqliteã§æžã蟌ã¿ãŸãã
ãŸããã³ã¡ã³ããæ®ããããHTTP ã³ãŒã«ããã¯çµç±ã§ãã±ããã®ã¹ããŒã¿ã¹ãå€æŽãããããããšãã§ããŸãã
HTTPã³ãŒã«ããã¯
# Make callback to Diskobot App
# Variables:
# callback_post_body: # A dict with follow keys. All keys are optional
# msg: If exist it would be posted to Jira as comment
# data: If exist it would be saved in Incident.variables
# desire_state: Set desire_state for incident
# status: If exist Proceed issue to that status
- name: Callback to Diskobot app (jira comment/status)
uri:
url: "{{ callback_url }}/{{ devname }}"
user: "{{ diskobot_user }}"
password: "{{ diskobot_pass }}"
force_basic_auth: True
method: POST
body: "{{ callback_post_body | to_json }}"
body_format: json
delegate_to: 127.0.0.1
åãçš®é¡ã®å€ãã®ã¿ã¹ã¯ãšåæ§ã«ãPlaybook å ã§åžžã«ç¹°ãè¿ãããªãããã«ãã¿ã¹ã¯ãå¥ã®å ±éãã¡ã€ã«ã«çœ®ããå¿ èŠã«å¿ããŠã€ã³ã¯ã«ãŒãããŸãã ããã«ã¯ãçºè¡ããŒãšãã¹ãåãå«ã callback_ url ãå«ãŸããŸãã Ansible ããã® POST ãªã¯ãšã¹ããå®è¡ãããšããããã¯ãããäœããã®ã€ã³ã·ãã³ãã®äžéšãšããŠæ¥ããã®ã§ããããšãç解ããŸãã
以äžã¯ãMD ããã€ã¹ãããã£ã¹ã¯ãåºåãããã¬ã€ããã¯ã®äŸã§ãã
# Save mdadm configuration
- include: common/callback.yml
vars:
callback_post_body:
status: 'Ready to change'
msg: "Removed disk from mdraid {{ mdadm_remove_disk.msg | comment_jira }}"
data:
mdadm_data: "{{ mdadm_remove_disk.removed }}"
parted_info: "{{ parted_info | default() }}"
when:
- mdadm_remove_disk | changed
- mdadm_remove_disk.removed
ãã®ã¿ã¹ã¯ã¯ãJira ãã±ããããå€æŽæºåå®äºãã¹ããŒã¿ã¹ã«è»¢éããã³ã¡ã³ããè¿œå ããŸãã ãŸããmdam_data å€æ°ã«ã¯ããã£ã¹ã¯ãåé€ããã md ããã€ã¹ã®ãªã¹ããä¿åãããparted_info ã«ã¯ãparted ããã®ããŒãã£ã·ã§ã³ ãã³ããä¿åãããŸãã
ãšã³ãžãã¢ãæ°ãããã£ã¹ã¯ãæ¿å ¥ãããšããããã®å€æ°ã䜿çšããŠããŒãã£ã·ã§ã³ ãã³ãã埩å ãããããã£ã¹ã¯ãåãå€ãã md ããã€ã¹ã«ãã£ã¹ã¯ãæ¿å ¥ãããã§ããŸãã
Ansible ãã§ãã¯ã¢ãŒã
èªååããªã³ã«ããã®ã¯æãã£ãã§ãã ãããã£ãŠããã¹ãŠã®ãã¬ã€ããã¯ãã¢ãŒãã§å®è¡ããããšã«ããŸããã
ãã®ãããªèµ·åã¯å¥ã®ã³ãŒã«ãã㯠ã¢ãžã¥ãŒã«ãéããŠå®è¡ããããã¬ã€ããã¯ã®å®è¡çµæã¯ã³ã¡ã³ããšã㊠Jira ã«ä¿åãããŸãã
ãŸããããã«ããããããšãã¬ã€ããã¯ã®åäœãæ€èšŒã§ããããã«ãªããŸããã 第 XNUMX ã«ã管çè
ã®ãããã«å¯Ÿããä¿¡é Œãé«ãŸããŸããã
æ€èšŒã«åæ Œãããã©ã€ã©ã³ ã¢ãŒãã ãã§ãªã Ansible ãå®è¡ã§ããããšãããã£ããšããåããã¹ãäžã§åãå€æ°ã䜿çšããŠéåžžã¢ãŒãã§åããã¬ã€ããã¯ãèµ·åããããã«ãJira ã« [Run Diskobot] ãã¿ã³ãäœæããŸããã
ããã«ããã®ãã¿ã³ã¯ããã¬ã€ããã¯ãã¯ã©ãã·ã¥ããå Žåã«ãã¬ã€ããã¯ãåèµ·åããããã«äœ¿çšãããŸãã
ãã¬ã€ããã¯ã®æ§é
Jira ãã±ããã®ã¹ããŒã¿ã¹ã«å¿ããŠããããã¯ããŸããŸãªãã¬ã€ããã¯ãèµ·åããããšã¯ãã§ã«è¿°ã¹ãŸããã
ãŸããå
¥ãå£ãæŽçããã®ãã¯ããã«ç°¡åã§ãã
第äºã«ãå Žåã«ãã£ãŠã¯åã«å¿
èŠãªå ŽåããããŸãã
ããšãã°ãã·ã¹ãã ãã£ã¹ã¯ã亀æããå Žåã¯ããŸãå±éã·ã¹ãã ã«ç§»åããŠã¿ã¹ã¯ãäœæããå¿ èŠããããŸããæ£ããå±éããåŸããµãŒããŒã« ssh çµç±ã§ã¢ã¯ã»ã¹ã§ããããã«ãªãããã®ãµãŒããŒã«ã¢ããªã±ãŒã·ã§ã³ãããŒã«ã¢ãŠãã§ããããã«ãªããŸãã ããããã¹ãŠã XNUMX ã€ã® Playbook ã§å®è¡ããå Žåããã¹ããå©çšã§ããªããããAnsible ã¯ãããå®äºã§ããŸããã
ãµãŒããŒã®ã°ã«ãŒãããšã« Ansible ããŒã«ã䜿çšããŸãã ããã§ã¯ããã¬ã€ããã¯ããã® XNUMX ã€ã§ã©ã®ããã«æ§æãããŠãããã確èªã§ããŸãã
ã©ã®ã¿ã¹ã¯ãã©ãã«ããããããã«ãããã®ã§äŸ¿å©ã§ãã Ansible ããŒã«ã®å
¥åã§ãã main.yml ã«ã¯ããã±ããã®ã¹ããŒã¿ã¹ãå
šå¡ã«å¿
èŠãªäžè¬çãªã¿ã¹ã¯ (ID ã®åãæž¡ããããŒã¯ã³ã®åä¿¡ãªã©) ãç°¡åã«å«ããããšãã§ããŸãã
調æ».yml
ã調æ»ãããã³ããªãŒãã³ãã¹ããŒã¿ã¹ã®ãã±ããã«å¯ŸããŠå®è¡ããŸãã ãã® Playbook ã§æãéèŠãªã®ã¯ãããã㯠ããã€ã¹åã§ãã ãã®æ å ±ã¯åžžã«å ¥æã§ããããã§ã¯ãããŸããã
ãããååŸããã«ã¯ãZabbix ããªã¬ãŒããã®æåŸã®å€ã§ãã Jira æŠèŠãåæããŸãã ããã㯠ããã€ã¹ã®åå (ã©ãããŒ) ãå«ãŸããå ŽåããããŸãã ãŸãã¯ãããŠã³ã ãã€ã³ããå«ãŸããŠããå Žåã¯ããµãŒããŒã«ã¢ã¯ã»ã¹ããŠè§£æããå¿ èŠãªãã£ã¹ã¯ãèšç®ããå¿ èŠããããŸãã ããªã¬ãŒã¯ãSCSI ã¢ãã¬ã¹ãŸãã¯ãã®ä»ã®æ å ±ãéä¿¡ããããšãã§ããŸãã ããããæãããããªããåæããªããã°ãªããªãããšãèµ·ãããŸãã
ããã㯠ããã€ã¹ã®ååãããã£ããããããããã£ã¹ã¯ã®ã¿ã€ããšãµã€ãºã«é¢ããæ å ±ãåéããJira ã®ãã£ãŒã«ãã«å ¥åããŸãã ãŸãããã³ããŒãã¢ãã«ããã¡ãŒã ãŠã§ã¢ãIDãSMART ã«é¢ããæ å ±ãåé€ããããããã¹ãŠã Jira ãã±ããã®ã³ã¡ã³ãã«æ¿å ¥ããŸãã 管çè ãšãšã³ãžãã¢ã¯ããã®ããŒã¿ãæ€çŽ¢ããå¿ èŠããªããªããŸããã ð
prepare2change.yml
ãã£ã¹ã¯ãå転ããå€ãã亀æã®æºåãããŸãã æãé£ãããŠéèŠãªã¹ããŒãžã ããã§ãã¢ããªã±ãŒã·ã§ã³ãåæ¢ãã¹ãã§ã¯ãªããšãã«åæ¢ã§ããŸãã ãŸãã¯ãååãªã¬ããªã«ãååšããªããã£ã¹ã¯ãåãå€ããšããŠãŒã¶ãŒã«åœ±é¿ãçããäžéšã®ããŒã¿ã倱ãããŸãã ããã§ã¯ãã£ããã§ã®ãã§ãã¯ãšéç¥ãæãå€ããªããŸãã
æãåçŽãªã±ãŒã¹ã§ã¯ãHW/MD RAID ãããã£ã¹ã¯ãåé€ããããšã«ã€ããŠè©±ããŸãã
ããè€éãªç¶æ³ (ã¹ãã¬ãŒãž ã·ã¹ãã ) ã§ã¯ãããã¯ã¢ãããã¢ããªã±ãŒã·ã§ã³ ã¬ãã«ã§å®è¡ããããšããAPI çµç±ã§ã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ãããã£ã¹ã¯åºåãå ±åããéã¢ã¯ãã£ãåããŠãªã«ããªãéå§ããå¿ èŠããããŸãã
ç§ãã¡ã¯çŸåšã倧èŠæš¡ãªç§»äœãè¡ã£ãŠããŸãã
å€æŽããã.yml
ãã£ã¹ã¯ã亀æããåŸããŸããã®å¯çšæ§ã確èªããŸãã
ãšã³ãžãã¢ã¯åžžã«æ°ãããã©ã€ããåãä»ããããã§ã¯ãªããããæºè¶³ã§ãã SMART å€ã®ãã§ãã¯ãè¿œå ããŸããã
ã©ã®ãããªå±æ§ã«æ³šç®ããŠããã®ã§ãããã?åå²ãåœãŠãããã»ã¯ã¿ãŒæ° (5) < 100
çŸåšä¿çäžã®ã»ã¯ã¿ãŒæ° (107) == 0
ãã©ã€ãããã¹ãã«åæ Œããªãã£ãå Žåã¯ããšã³ãžãã¢ã«å床亀æããããéç¥ãããŸãã ãã¹ãŠãæ£åžžã§ããã°ãããã¯ã©ã€ããæ¶ããããŒãã³ã°ãé©çšããããã£ã¹ã¯ãå転ããŸãã
æºåå®äº.yml
æãåçŽãªã±ãŒã¹: HW/SW RAID åæã確èªããããã¢ããªã±ãŒã·ã§ã³ã§ã®ããŒã¿åæãçµäºããŸãã
ã¢ããªã±ãŒã·ã§ã³API
ããããã¢ããªã±ãŒã·ã§ã³ API ã«é »ç¹ã«ã¢ã¯ã»ã¹ããããšã¯äœåºŠãè¿°ã¹ãŸããã ãã¡ããããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã«å¿ èŠãªã¡ãœãããããããã§ã¯ãªããããå€æŽããå¿ èŠããããŸããã ç§ãã¡ã䜿çšããæãéèŠãªæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
- ç¶æ ã æäœã§ãããã©ãããç解ããããã®ã¯ã©ã¹ã¿ãŒãŸãã¯ãã£ã¹ã¯ã®ã¹ããŒã¿ã¹ã
- èµ·ååæ¢ã ãã£ã¹ã¯ã®ã¢ã¯ãã£ãå/éã¢ã¯ãã£ãåã
- 移è¡/埩å ããŸãã 亀ææããã³äº€æåŸã®ããŒã¿ç§»è¡ãšãªã«ããªã
Ansible ããåŠãã æèš
ç§ã¯ Ansible ãæ¬åœã«å€§å¥œãã§ãã ããããããŸããŸãªãªãŒãã³ãœãŒã¹ ãããžã§ã¯ããèŠãŠã人ã ãã©ã®ããã« Playbook ãæžããŠããããèŠããšãå°ãæããªãããšããããããŸãã when/ã«ãŒãã®è€éãªè«ççç¹ã亀ããã·ã§ã«/ã³ãã³ãã®é »ç¹ãªäœ¿çšã«ããæè»æ§ãšåªçæ§ã®æ¬ åŠã
ç§ãã¡ã¯ãAnsible ã®å©ç¹ã§ããã¢ãžã¥ãŒã«æ§ãå©çšããŠããã¹ãŠãå¯èœãªéãåçŽåããããšã«ããŸããã æäžäœã¬ãã«ã«ã¯ Playbook ããããAnsible ãå°ãç¥ã£ãŠãã管çè ããµãŒãããŒãã£éçºè ã§ããã°èª°ã§ãäœæã§ããŸãã
- name: Blink disk
become: True
register: locate_action
disk_locate:
locate: '{{ locate }}'
devname: '{{ devname }}'
ids: '{{ locate_ids | default(pd_id) | default(omit) }}'
äžéšã®ããžãã¯ã Playbook ã«å®è£ ããã®ãé£ããå Žåã¯ãããã Ansible ã¢ãžã¥ãŒã«ãŸãã¯ãã£ã«ã¿ãŒã«ç§»åããŸãã ã¹ã¯ãªãã㯠Python ãŸãã¯ãã®ä»ã®èšèªã§äœæã§ããŸãã
ç°¡åã§ããã«æžãããšãã§ããŸãã ããšãã°ãäžã«äŸã瀺ãããã£ã¹ã¯ ããã¯ã©ã€ã ã¢ãžã¥ãŒã«ã¯ 265 ã©ã€ã³ã§æ§æãããŠããŸãã
æäžå±€ã«ã¯å³æžé€šããããŸãã ãã®ãããžã§ã¯ãã§ã¯ã察å¿ãããªã¯ãšã¹ããå®è¡ããããŒããŠã§ã¢ããã³ãœãããŠã§ã¢ RAID ãæœè±¡åããå¥ã®ã¢ããªã±ãŒã·ã§ã³ãäœæããŸããã
Ansible ã®æ倧ã®åŒ·ã¿ã¯ããã®ã·ã³ãã«ããšæ確ãªãã¬ã€ããã¯ã§ãã ããã䜿çšããå¿
èŠããããæããã yaml ãã¡ã€ã«ãèšå€§ãªæ°ã®æ¡ä»¶ãã·ã§ã«ã³ãŒããã«ãŒããçæããªãããã«ããå¿
èŠããããšæããŸãã
Ansible API ã®çµéšãããäžåºŠç¹°ãè¿ãããå Žåã¯ã次㮠XNUMX ã€ã®ç¹ã«çæããŠãã ããã
- Playbook_executor ããã³ Playbook ã«ã¯äžè¬ã«ã¿ã€ã ã¢ãŠããèšå®ã§ããŸããã SSH ã»ãã·ã§ã³ã«ã¯ã¿ã€ã ã¢ãŠãããããŸãããPlaybook ã«ã¯ã¿ã€ã ã¢ãŠãããããŸããã ã·ã¹ãã ã«ååšããªããã£ã¹ã¯ãã¢ã³ããŠã³ãããããšãããšãPlaybook ãç¡éã«å®è¡ãããããããã®èµ·åãå¥ã®ã©ãããŒã§ã©ããããã¿ã€ã ã¢ãŠãã§åŒ·å¶çµäºããå¿ èŠããããŸããã
- Ansible ã¯ãã©ãŒã¯ãããããã»ã¹ã§å®è¡ãããããããã® API ã¯ã¹ã¬ããã»ãŒãã§ã¯ãããŸããã ãã¹ãŠã® Playbook ãã·ã³ã°ã«ã¹ã¬ããã§å®è¡ããŸãã
ãã®çµæãçŽ80å²ã®ãã£ã¹ã¯äº€æãèªååããããšãã§ããŸããã å šäœãšããŠã代æ¿ç㯠XNUMX åã«ãªããŸããã çŸåšã管çè ã¯ã€ã³ã·ãã³ããèŠãŠããã£ã¹ã¯ãå€æŽããå¿ èŠããããã©ãããå€æããã¯ã³ã¯ãªãã¯ããã ãã§ãã
ãããä»ãå¥ã®åé¡ã«çŽé¢ãå§ããŠããŸããæ°ãã管çè
ã®äžã«ã¯ãã©ã€ãã®å€æŽæ¹æ³ãç¥ããªã人ãããŸãã ð
åºæïŒ habr.com