เชจเซ‹เชฐเซเชจเชฟเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชจเซ‡เชŸเชตเชฐเซเช• เช‰เชชเช•เชฐเชฃ เช—เซ‹เช เชตเชฃเซ€ เชคเชคเซเชตเซ‹เชจเซเช‚ เชธเซเชตเชšเชพเชฒเชฟเชค เช‰เชคเซเชชเชพเชฆเชจ เช…เชจเซ‡ เชญเชฐเชฃ

เชจเซ‹เชฐเซเชจเชฟเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชจเซ‡เชŸเชตเชฐเซเช• เช‰เชชเช•เชฐเชฃ เช—เซ‹เช เชตเชฃเซ€ เชคเชคเซเชตเซ‹เชจเซเช‚ เชธเซเชตเชšเชพเชฒเชฟเชค เช‰เชคเซเชชเชพเชฆเชจ เช…เชจเซ‡ เชญเชฐเชฃ

เชนเซ‡ เชนเชฌเชฐ!

เชคเชพเชœเซ‡เชคเชฐเชฎเชพเช‚ เชเช• เชฒเซ‡เช– เช…เชนเซ€เช‚ เชชเซ‹เชช เช…เชช Mikrotik เช…เชจเซ‡ Linux. เชฐเซ‚เชŸเชฟเชจ เช…เชจเซ‡ เช“เชŸเซ‹เชฎเซ‡เชถเชจ เชœเซเชฏเชพเช‚ เช…เชถเซเชฎเชฟเชญเซ‚เชค เชฎเชพเชงเซเชฏเชฎเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเชฎเชพเชจ เชธเชฎเชธเซเชฏเชพ เชนเชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€. เช…เชจเซ‡ เชคเซ‡เชฎ เช›เชคเชพเช‚ เช•เชพเชฐเซเชฏ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เชฒเชพเช•เซเชทเชฃเชฟเช• เช›เซ‡, เชนเซ‡เชฌเซเชฐเซ‡ เชชเชฐ เชคเซ‡เชจเชพ เชตเชฟเชถเซ‡ เช•เช‚เชˆ เชœ เชธเชฎเชพเชจ เชจเชฅเซ€. เชนเซเช‚ เช†เชฆเชฐเชฃเซ€เชฏ IT เชธเชฎเซเชฆเชพเชฏเชจเซ‡ เชฎเชพเชฐเซ€ เชธเชพเชฏเช•เชฒ เช“เชซเชฐ เช•เชฐเชตเชพเชจเซ€ เชนเชฟเช‚เชฎเชค เช•เชฐเซเช‚ เช›เซเช‚.

เช†เชตเชพ เช•เชพเชฐเซเชฏ เชฎเชพเชŸเซ‡ เช† เชชเชนเซ‡เชฒเซ€ เชฌเชพเช‡เช• เชจเชฅเซ€. เชชเซเชฐเชฅเชฎ เชตเชฟเช•เชฒเซเชช เช˜เชฃเชพ เชตเชฐเซเชทเซ‹ เชชเชนเซ‡เชฒเชพ เช…เชฎเชฒเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹ เชœเชตเชพเชฌเชฆเชพเชฐ เชธเช‚เชธเซเช•เชฐเชฃ 1.x.x เชธเชพเชฏเช•เชฒเชจเซ‹ เชญเชพเช—เซเชฏเซ‡ เชœ เช‰เชชเชฏเซ‹เช— เชฅเชคเซ‹ เชนเชคเซ‹ เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชคเซ‡เชจเซ‡ เชธเชคเชค เช•เชพเชŸ เชฒเชพเช—เชคเซ‹ เชนเชคเซ‹. เช เช…เชฐเซเชฅเชฎเชพเช‚ เช•เซ‡ เชตเชฐเซเชเชจ เช…เชชเชกเซ‡เชŸ เชฅเชพเชฏ เชคเซ‡เชŸเชฒเซ€ เชตเชพเชฐ เช•เชพเชฐเซเชฏ เชชเซ‹เชคเซ‡ เชœ เช‰เชฆเซเชญเชตเชคเซเช‚ เชจเชฅเซ€ เชœเชตเชพเชฌเชฆเชพเชฐ. เช…เชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชชเชฃ เชคเชฎเชพเชฐเซ‡ เชตเชพเชนเชจ เชšเชฒเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ, เชคเซเชฏเชพเชฐเซ‡ เชธเชพเช‚เช•เชณ เชชเชกเซ€ เชœเชพเชฏ เช›เซ‡ เช…เชฅเชตเชพ เชตเซเชนเซ€เชฒ เชชเชกเซ€ เชœเชพเชฏ เช›เซ‡. เชœเซ‹ เช•เซ‡, เชชเซเชฐเชฅเชฎ เชญเชพเช—, เชฐเซ‚เชชเชฐเซ‡เช–เชพเช“ เช‰เชคเซเชชเชจเซเชจ เช•เชฐเซ‡ เช›เซ‡, เชนเช‚เชฎเซ‡เชถเชพ เช–เซ‚เชฌ เชœ เชธเซเชชเชทเซเชŸ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡, เชธเชฆเชญเชพเช—เซเชฏเซ‡ เชœเซ€เชจเซเชœเชพ2 เชเชจเซเชœเชฟเชจ เชฒเชพเช‚เชฌเชพ เชธเชฎเชฏเชฅเซ€ เชธเซเชฅเชพเชชเชฟเชค เช›เซ‡. เชชเชฐเช‚เชคเซ เชฌเซ€เชœเซ‹ เชญเชพเช— - เชฐเซ‚เชชเชฐเซ‡เช–เชพเช“เชจเซเช‚ เชฐเซ‹เชฒเชฟเช‚เช— - เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เช†เชถเซเชšเชฐเซเชฏ เชฒเชพเชตเซ‡ เช›เซ‡. เช…เชจเซ‡ เช•เชพเชฐเชฃ เช•เซ‡ เชฎเชพเชฐเซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพเชจเซ‡ เช…เชกเชงเชพ เชธเซ‹ เช‰เชชเช•เชฐเชฃเซ‹ เชชเชฐ เชฆเซ‚เชฐเชฅเซ€ เชฐเซ‹เชฒ เช†เช‰เชŸ เช•เชฐเชตเชพเชจเซ€ เช›เซ‡, เชœเซ‡เชฎเชพเช‚เชฅเซ€ เช•เซ‡เชŸเชฒเชพเช• เชนเชœเชพเชฐเซ‹ เช•เชฟเชฒเซ‹เชฎเซ€เชŸเชฐ เชฆเซ‚เชฐ เชธเซเชฅเชฟเชค เช›เซ‡, เช† เชธเชพเชงเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เชฅเซ‹เชกเซ‹ เช•เช‚เชŸเชพเชณเชพเชœเชจเช• เชนเชคเซ‹.

เช…เชนเซ€เช‚ เชฎเชพเชฐเซ‡ เช•เชฌเซ‚เชฒ เช•เชฐเชตเซเช‚ เชœเซ‹เชˆเช เช•เซ‡ เชฎเชพเชฐเซ€ เช…เชจเชฟเชถเซเชšเชฟเชคเชคเชพ เชธเช‚เชญเชตเชคเชƒ เชฎเชพเชฐเชพ เชชเชฐเชฟเชšเชฟเชคเชคเชพเชจเชพ เช…เชญเชพเชตเชฎเชพเช‚ เชฐเชนเซ‡เชฒเซ€ เช›เซ‡ เชœเชตเชพเชฌเชฆเชพเชฐเชคเซ‡เชจเซ€ เช–เชพเชฎเซ€เช“ เช•เชฐเชคเชพเช‚. เช…เชจเซ‡ เช†, เชฎเชพเชฐเซเช— เชฆเซเชตเชพเชฐเชพ, เชเช• เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชฎเซเชฆเซเชฆเซ‹ เช›เซ‡. เชœเชตเชพเชฌเชฆเชพเชฐ เชเช• เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เช…เชฒเช— เช›เซ‡, เชคเซ‡เชจเชพ เชชเซ‹เชคเชพเชจเชพ DSL (เชกเซ‹เชฎเซ‡เชจ เชธเซเชชเซ‡เชธเชฟเชซเชฟเช• เชฒเซ‡เช‚เช—เซเชตเซ‡เชœ) เชธเชพเชฅเซ‡ เชคเซ‡เชจเซเช‚ เชชเซ‹เชคเชพเชจเซเช‚ เชœเซเชžเชพเชจเชจเซเช‚ เช•เซเชทเซ‡เชคเซเชฐ เช›เซ‡, เชœเซ‡ เช†เชคเซเชฎเชตเชฟเชถเซเชตเชพเชธเชจเชพ เชธเซเชคเชฐเซ‡ เชœเชพเชณเชตเชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡. เชธเชพเชฐเซเช‚, เชคเซ‡ เช•เซเชทเชฃ เช•เซ‡ เชœเชตเชพเชฌเชฆเชพเชฐ เชคเซ‡ เช–เซ‚เชฌ เชœ เชเชกเชชเชฅเซ€ เชตเชฟเช•เชพเชธ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡, เช…เชจเซ‡ เชชเช›เชพเชค เชธเซเชธเช‚เช—เชคเชคเชพ เชฎเชพเชŸเซ‡ เชตเชฟเชถเซ‡เชท เชงเซเชฏเชพเชจ เช†เชชเซเชฏเชพ เชตเชฟเชจเชพ, เชคเซ‡ เช†เชคเซเชฎเชตเชฟเชถเซเชตเชพเชธ เช‰เชฎเซ‡เชฐเชคเซเช‚ เชจเชฅเซ€.

เชคเซ‡เชฅเซ€, เช†เชŸเชฒเชพ เชฒเชพเช‚เชฌเชพ เชธเชฎเชฏ เชชเชนเซ‡เชฒเชพ เชธเชพเชฏเช•เชฒเชจเซเช‚ เชฌเซ€เชœเซเช‚ เชธเช‚เชธเซเช•เชฐเชฃ เชฒเชพเช—เซ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชจ เชนเชคเซเช‚. เช† เชตเช–เชคเซ‡ เช…เชœเช—เชฐ, เช…เชฅเชตเชพ เชคเซ‡เชจเชพ เชฌเชฆเชฒเซ‡ เชคเซ‡เชฎเชพเช‚ เชฒเช–เซ‡เชฒเชพ เชซเซเชฐเซ‡เชฎเชตเชฐเซเช• เชชเชฐ เช…เชœเช—เชฐ เช…เชจเซ‡ เชฎเชพเชŸเซ‡ เช…เชœเช—เชฐ เช•เชนเซ‡เชตเชพเชฏ เช›เซ‡ เชจเซ‹เชฐเซเชจเชฟเชฐ

เชคเซ‡เชฅเซ€ - เชจเซ‹เชฐเซเชจเชฟเชฐ เชเช• เชฎเชพเช‡เช•เซเชฐเซ‹เชซเซเชฐเซ‡เชฎเชตเชฐเซเช• เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เชฒเช–เชพเชฏเซ‡เชฒ เช›เซ‡ เช…เชœเช—เชฐ เช…เชจเซ‡ เชฎเชพเชŸเซ‡ เช…เชœเช—เชฐ เช…เชจเซ‡ เช“เชŸเซ‹เชฎเซ‡เชถเชจ เชฎเชพเชŸเซ‡ เชฐเชšเชพเชฏเซ‡เชฒ เช›เซ‡. เชธเชพเชฅเซ‡เชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เชœเซ‡เชตเซเช‚ เชœ เชœเชตเชพเชฌเชฆเชพเชฐ, เช…เชนเซ€เช‚ เชธเชฎเชธเซเชฏเชพเช“ เช‰เช•เซ‡เชฒเชตเชพ เชฎเชพเชŸเซ‡, เชธเช•เซเชทเชฎ เชกเซ‡เชŸเชพ เชคเซˆเชฏเชพเชฐเซ€ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡, เชเชŸเชฒเซ‡ เช•เซ‡. เชฏเชœเชฎเชพเชจเซ‹ เช…เชจเซ‡ เชคเซ‡เชฎเชจเชพ เชชเชฐเชฟเชฎเชพเชฃเซ‹เชจเซ€ เช‡เชจเซเชตเซ‡เชจเซเชŸเชฐเซ€, เชชเชฐเช‚เชคเซ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹ เช…เชฒเช— เชกเซ€เชเชธเชเชฒเชฎเชพเช‚ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเชคเซ€ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชคเซ‡ เชœ เช–เซ‚เชฌ เชœเซ‚เชจเซ€ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เช–เซ‚เชฌ เชธเชพเชฐเซ€ p[i|i] เชŸเชจ.

เชšเชพเชฒเซ‹ เชœเซ‹เชˆเช เช•เซ‡ เชคเซ‡ เชจเซ€เชšเซ‡เชจเชพ เชœเซ€เชตเช‚เชค เช‰เชฆเชพเชนเชฐเชฃเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡.

เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชฆเซ‡เชถเชญเชฐเชฎเชพเช‚ เช…เชจเซ‡เช• เชกเชเชจ เช“เชซเชฟเชธเซ‹ เชธเชพเชฅเซ‡เชจเซเช‚ เชฌเซเชฐเชพเชจเซเชš เชจเซ‡เชŸเชตเชฐเซเช• เช›เซ‡. เชฆเชฐเซ‡เช• เช“เชซเชฟเชธเชฎเชพเช‚ WAN เชฐเชพเช‰เชŸเชฐ เชนเซ‹เชฏ เช›เซ‡ เชœเซ‡ เชตเชฟเชตเชฟเชง เช“เชชเชฐเซ‡เชŸเชฐเซ‹เชจเซ€ เช˜เชฃเซ€ เช•เซ‹เชฎเซเชฏเซเชจเชฟเช•เซ‡เชถเชจ เชšเซ‡เชจเชฒเซ‹เชจเซ‡ เชธเชฎเชพเชชเซเชค เช•เชฐเซ‡ เช›เซ‡. เชฐเซ‚เชŸเซ€เช‚เช— เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ BGP เช›เซ‡. WAN เชฐเชพเช‰เชŸเชฐเซเชธ เชฌเซ‡ เชชเซเชฐเช•เชพเชฐเชจเชพ เช†เชตเซ‡ เช›เซ‡: Cisco ISG เช…เชฅเชตเชพ Juniper SRX.

เชนเชตเซ‡ เช•เชพเชฐเซเชฏ: เชคเชฎเชพเชฐเซ‡ เชฌเซเชฐเชพเชจเซเชš เชจเซ‡เชŸเชตเชฐเซเช•เชจเชพ เชคเชฎเชพเชฎ WAN เชฐเชพเช‰เชŸเชฐ เชชเชฐ เช…เชฒเช— เชชเซ‹เชฐเซเชŸ เชชเชฐ เชตเชฟเชกเชฟเชฏเซ‹ เชธเชฐเซเชตเซ‡เชฒเชจเซเชธ เชฎเชพเชŸเซ‡ เชธเชฎเชฐเซเชชเชฟเชค เชธเชฌเชจเซ‡เชŸ เช—เซ‹เช เชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ - BGPเชฎเชพเช‚ เช† เชธเชฌเชจเซ‡เชŸเชจเซ€ เชœเชพเชนเซ‡เชฐเชพเชค เช•เชฐเซ‹ - เชธเชฎเชฐเซเชชเชฟเชค เชชเซ‹เชฐเซเชŸเชจเซ€ เชเชกเชช เชฎเชฐเซเชฏเชพเชฆเชพ เช—เซ‹เช เชตเซ‹.

เชชเซเชฐเชฅเชฎ, เช†เชชเชฃเซ‡ เชฅเซ‹เชกเชพ เชจเชฎเซ‚เชจเชพเช“ เชคเซˆเชฏเชพเชฐ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เชœเซ‡เชจเชพ เช†เชงเชพเชฐเซ‡ เชธเชฟเชธเซเช•เซ‹ เช…เชจเซ‡ เชœเซเชฏเซเชจเชฟเชชเชฐ เชฎเชพเชŸเซ‡ เช…เชฒเช—เชฅเซ€ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจเซ‹ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. เชฆเชฐเซ‡เช• เชฌเชฟเช‚เชฆเซ เช…เชจเซ‡ เช•เชจเซ‡เช•เซเชถเชจ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชฎเชพเชŸเซ‡ เชกเซ‡เชŸเชพ เชคเซˆเชฏเชพเชฐ เช•เชฐเชตเซ‹ เชชเชฃ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡, เชเชŸเชฒเซ‡ เช•เซ‡. เชธเชฎเชพเชจ เช‡เชจเซเชตเซ‡เชจเซเชŸเชฐเซ€ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเซ‹

เชธเชฟเชธเซเช•เซ‹ เชฎเชพเชŸเซ‡ เชคเซˆเชฏเชพเชฐ เชจเชฎเซ‚เชจเซ‹:

$ cat templates/ios/base.j2 
class-map match-all VIDEO_SURV
 match access-group 111

policy-map VIDEO_SURV
 class VIDEO_SURV
    police 1500000 conform-action transmit  exceed-action drop

interface {{ host.task_data.ifname }}
  description VIDEOSURV
  ip address 10.10.{{ host.task_data.ipsuffix }}.254 255.255.255.0
  service-policy input VIDEO_SURV

router bgp {{ host.task_data.asn }}
  network 10.40.{{ host.task_data.ipsuffix }}.0 mask 255.255.255.0

access-list 11 permit 10.10.{{ host.task_data.ipsuffix }}.0 0.0.0.255
access-list 111 permit ip 10.10.{{ host.task_data.ipsuffix }}.0 0.0.0.255 any

เชœเซเชฏเซเชจเชฟเชชเชฐ เชฎเชพเชŸเซ‡เชจเซ‹ เชจเชฎเซ‚เชจเซ‹:

$ cat templates/junos/base.j2 
set interfaces {{ host.task_data.ifname }} unit 0 description "Video surveillance"
set interfaces {{ host.task_data.ifname }} unit 0 family inet filter input limit-in
set interfaces {{ host.task_data.ifname }} unit 0 family inet address 10.10.{{ host.task_data.ipsuffix }}.254/24
set policy-options policy-statement export2bgp term 1 from route-filter 10.10.{{ host.task_data.ipsuffix }}.0/24 exact
set security zones security-zone WAN interfaces {{ host.task_data.ifname }}
set firewall policer policer-1m if-exceeding bandwidth-limit 1m
set firewall policer policer-1m if-exceeding burst-size-limit 187k
set firewall policer policer-1m then discard
set firewall policer policer-1.5m if-exceeding bandwidth-limit 1500000
set firewall policer policer-1.5m if-exceeding burst-size-limit 280k
set firewall policer policer-1.5m then discard
set firewall filter limit-in term 1 then policer policer-1.5m
set firewall filter limit-in term 1 then count limiter

เชจเชฎเซ‚เชจเชพเช“, เช…เชฒเชฌเชคเซเชค, เชชเชพเชคเชณเชพ เชนเชตเชพเชฎเชพเช‚เชฅเซ€ เชฌเชนเชพเชฐ เช†เชตเชคเชพ เชจเชฅเซ€. เช† เช†เชตเชถเซเชฏเช•เชชเชฃเซ‡ เช•เชพเชฐเซเชฏเช•เชพเชฐเซ€ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจเซ‹ เชตเชšเซเชšเซ‡ เชคเชซเชพเชตเชค เช›เซ‡ เชœเซ‡ เชตเชฟเชตเชฟเชง เชฎเซ‹เชกเซ‡เชฒเซ‹เชจเชพ เชฌเซ‡ เชšเซ‹เช•เซเช•เชธ เชฐเชพเช‰เชŸเชฐ เชชเชฐ เช•เชพเชฐเซเชฏเชจเซ‡ เชนเชฒ เช•เชฐเซเชฏเชพ เชชเช›เซ€ เชนเชคเชพ เช…เชจเซ‡ เชนเชคเชพ.

เช…เชฎเชพเชฐเชพ เชจเชฎเซ‚เชจเชพเช“เชฎเชพเช‚เชฅเซ€ เช†เชชเชฃเซ‡ เชœเซ‹เชˆเช เช›เซ€เช เช•เซ‡ เชธเชฎเชธเซเชฏเชพเชจเซ‡ เช‰เช•เซ‡เชฒเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเชจเซ‡ เชœเซเชฏเซเชจเชฟเชชเชฐ เชฎเชพเชŸเซ‡ เชฎเชพเชคเซเชฐ เชฌเซ‡ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เช…เชจเซ‡ เชธเชฟเชธเซเช•เซ‹ เชฎเชพเชŸเซ‡ 3 เชชเชฐเชฟเชฎเชพเชฃเซ‹เชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช† เชฐเชนเซเชฏเชพ เชคเซ‡เช“:

  • ifname
  • ipsuffix
  • asn

เชนเชตเซ‡ เช†เชชเชฃเซ‡ เชฆเชฐเซ‡เช• เช‰เชชเช•เชฐเชฃ เชฎเชพเชŸเซ‡ เช† เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชธเซ‡เชŸ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เชเชŸเชฒเซ‡ เช•เซ‡. เชคเซ‡ เชœ เชตเชธเซเชคเซ เช•เชฐเซ‹ เชฏเชพเชฆเซ€.

เชฎเชพเชŸเซ‡ เชฏเชพเชฆเซ€ เช…เชฎเซ‡ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ‹เชจเซเช‚ เชšเซเชธเซเชคเชชเชฃเซ‡ เชชเชพเชฒเชจ เช•เชฐเซ€เชถเซเช‚ เชจเซ‹เชฐเซเชจเชฟเชฐ เชถเชฐเซ‚ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช

เชเชŸเชฒเซ‡ เช•เซ‡, เชšเชพเชฒเซ‹ เชธเชฎเชพเชจ เชซเชพเช‡เชฒ เชนเชพเชกเชชเชฟเช‚เชœเชฐ เชฌเชจเชพเชตเซ€เช:

.
โ”œโ”€โ”€ config.yaml
โ”œโ”€โ”€ inventory
โ”‚   โ”œโ”€โ”€ defaults.yaml
โ”‚   โ”œโ”€โ”€ groups.yaml
โ”‚   โ””โ”€โ”€ hosts.yaml

config.yaml เชซเชพเช‡เชฒ เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค nornir เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเช‡เชฒ เช›เซ‡

$ cat config.yaml 
---
core:
    num_workers: 10

inventory:
    plugin: nornir.plugins.inventory.simple.SimpleInventory
    options:
        host_file: "inventory/hosts.yaml"
        group_file: "inventory/groups.yaml"
        defaults_file: "inventory/defaults.yaml"

เช…เชฎเซ‡ เชซเชพเช‡เชฒเชฎเชพเช‚ เชฎเซเช–เซเชฏ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชธเซ‚เชšเชตเซ€เชถเซเช‚ hosts.yaml, เชœเซ‚เชฅ (เชฎเชพเชฐเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เช† เชฒเซ‹เช—เชฟเชจ/เชชเชพเชธเชตเชฐเซเชกเซเชธ เช›เซ‡) เชฎเชพเช‚ group.yaml, เช…เชจเซ‡ เชฎเชพเช‚ defaults.yaml เช…เชฎเซ‡ เช•เช‚เชˆเชชเชฃ เชธเซ‚เชšเชตเซ€เชถเซเช‚ เชจเชนเซ€เช‚, เชชเชฐเช‚เชคเซ เชคเชฎเชพเชฐเซ‡ เชคเซเชฏเชพเช‚ เชคเซเชฐเชฃ เช“เช›เชพ เชฆเชพเช–เชฒ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ - เชคเซ‡ เชธเซ‚เชšเชตเซ‡ เช›เซ‡ เช•เซ‡ เชคเซ‡ เช›เซ‡ เชฏเชพเชฎเชฒ เชœเซ‹เช•เซ‡ เชซเชพเชˆเชฒ เช–เชพเชฒเซ€ เช›เซ‡.

hosts.yaml เช†เชจเชพ เชœเซ‡เชตเซเช‚ เชฆเซ‡เช–เชพเชฏ เช›เซ‡:

---
srx-test:
    hostname: srx-test
    groups: 
        - juniper
    data:
        task_data:
            ifname: fe-0/0/2
            ipsuffix: 111

cisco-test:
    hostname: cisco-test
    groups: 
        - cisco
    data:
        task_data:
            ifname: GigabitEthernet0/1/1
            ipsuffix: 222
            asn: 65111

เช…เชจเซ‡ เช…เชนเซ€เช‚ เช›เซ‡ group.yaml:

---
cisco:
    platform: ios
    username: admin1
    password: cisco1

juniper:
    platform: junos
    username: admin2
    password: juniper2

เช†เชตเซเช‚ เชœ เชฅเชฏเซเช‚ เชฏเชพเชฆเซ€ เช…เชฎเชพเชฐเชพ เช•เชพเชฐเซเชฏ เชฎเชพเชŸเซ‡. เชชเซเชฐเชพเชฐเช‚เชญ เชฆเชฐเชฎเชฟเชฏเชพเชจ, เช‡เชจเซเชตเซ‡เชจเซเชŸเชฐเซ€ เชซเชพเช‡เชฒเซ‹เชจเชพ เชชเชฐเชฟเชฎเชพเชฃเซ‹เชจเซ‡ เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชฎเซ‹เชกเซ‡เชฒ เชชเชฐ เชฎเซ‡เชช เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช‡เชจเซเชตเซ‡เชจเซเชŸเชฐเซ€ เชเชฒเชฟเชฎเซ‡เชจเซเชŸ.

เชธเซเชชเซ‹เช‡เชฒเชฐ เชจเซ€เชšเซ‡ InventoryElement เชฎเซ‹เชกเชฒเชจเซ‹ เช†เช•เซƒเชคเชฟ เช›เซ‡

print(json.dumps(InventoryElement.schema(), indent=4))
{
    "title": "InventoryElement",
    "type": "object",
    "properties": {
        "hostname": {
            "title": "Hostname",
            "type": "string"
        },
        "port": {
            "title": "Port",
            "type": "integer"
        },
        "username": {
            "title": "Username",
            "type": "string"
        },
        "password": {
            "title": "Password",
            "type": "string"
        },
        "platform": {
            "title": "Platform",
            "type": "string"
        },
        "groups": {
            "title": "Groups",
            "default": [],
            "type": "array",
            "items": {
                "type": "string"
            }
        },
        "data": {
            "title": "Data",
            "default": {},
            "type": "object"
        },
        "connection_options": {
            "title": "Connection_Options",
            "default": {},
            "type": "object",
            "additionalProperties": {
                "$ref": "#/definitions/ConnectionOptions"
            }
        }
    },
    "definitions": {
        "ConnectionOptions": {
            "title": "ConnectionOptions",
            "type": "object",
            "properties": {
                "hostname": {
                    "title": "Hostname",
                    "type": "string"
                },
                "port": {
                    "title": "Port",
                    "type": "integer"
                },
                "username": {
                    "title": "Username",
                    "type": "string"
                },
                "password": {
                    "title": "Password",
                    "type": "string"
                },
                "platform": {
                    "title": "Platform",
                    "type": "string"
                },
                "extras": {
                    "title": "Extras",
                    "type": "object"
                }
            }
        }
    }
}

เช† เชฎเซ‹เชกเซ‡เชฒ เชฅเซ‹เชกเซเช‚ เช—เซ‚เช‚เชšเชตเชฃเชญเชฐเซเชฏเซเช‚ เชฆเซ‡เช–เชพเชˆ เชถเช•เซ‡ เช›เซ‡, เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚. เชคเซ‡เชจเซ‡ เชถเซ‹เชงเชตเชพ เชฎเชพเชŸเซ‡, เช‡เชจเซเชŸเชฐเซ‡เช•เซเชŸเชฟเชต เชฎเซ‹เชก เช‡เชจ ipython.

 $ ipython3
Python 3.6.9 (default, Nov  7 2019, 10:44:02) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.1.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from nornir import InitNornir                                                                           

In [2]: nr = InitNornir(config_file="config.yaml", dry_run=True)                                                

In [3]: nr.inventory.hosts                                                                                      
Out[3]: 
{'srx-test': Host: srx-test, 'cisco-test': Host: cisco-test}

In [4]: nr.inventory.hosts['srx-test'].data                                                                                    
Out[4]: {'task_data': {'ifname': 'fe-0/0/2', 'ipsuffix': 111}}

In [5]: nr.inventory.hosts['srx-test']['task_data']                                                     
Out[5]: {'ifname': 'fe-0/0/2', 'ipsuffix': 111}

In [6]: nr.inventory.hosts['srx-test'].platform                                                                                
Out[6]: 'junos'

เช…เชจเซ‡ เช›เซ‡เชฒเซเชฒเซ‡, เชšเชพเชฒเซ‹ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชชเชฐ เชœ เช†เช—เชณ เชตเชงเซ€เช. เชฎเชพเชฐเซ‡ เช…เชนเซ€เช‚ เช–เชพเชธ เช—เชฐเซเชต เช•เชฐเชตเชพ เชœเซ‡เชตเซเช‚ เช•เช‚เชˆ เชจเชฅเซ€. เชฎเซ‡เช‚ เชนเชฎเชฃเชพเช‚ เชœ เชเช• เชคเซˆเชฏเชพเชฐ เช‰เชฆเชพเชนเชฐเชฃ เชฒเซ€เชงเซเช‚ เชŸเซเชฏเซเชŸเซ‹เชฐเซ€เชฏเชฒ เช…เชจเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฒเช—เชญเช— เชฏเชฅเชพเชตเชค เช›เซ‡. เชซเชฟเชจเชฟเชถเซเชก เชตเชฐเซเช•เชฟเช‚เช— เชธเซเช•เซเชฐเชฟเชชเซเชŸ เช†เชจเชพ เชœเซ‡เชตเซ€ เชฆเซ‡เช–เชพเชฏ เช›เซ‡:

from nornir import InitNornir
from nornir.plugins.tasks import networking, text
from nornir.plugins.functions.text import print_title, print_result

def config_and_deploy(task):
    # Transform inventory data to configuration via a template file
    r = task.run(task=text.template_file,
                 name="Base Configuration",
                 template="base.j2",
                 path=f"templates/{task.host.platform}")

    # Save the compiled configuration into a host variable
    task.host["config"] = r.result

    # Save the compiled configuration into a file
    with open(f"configs/{task.host.hostname}", "w") as f:
        f.write(r.result)

    # Deploy that configuration to the device using NAPALM
    task.run(task=networking.napalm_configure,
             name="Loading Configuration on the device",
             replace=False,
             configuration=task.host["config"])

nr = InitNornir(config_file="config.yaml", dry_run=True) # set dry_run=False, cross your fingers and run again

# run tasks
result = nr.run(task=config_and_deploy)
print_result(result)

เชชเชฐเชฟเชฎเชพเชฃ เชชเชฐ เชงเซเชฏเชพเชจ เช†เชชเซ‹ dry_run=เชธเชพเชšเซเช‚ เชฒเชพเช‡เชจ เช‘เชฌเซเชœเซ‡เช•เซเชŸ เช†เชฐเช‚เชญเชฎเชพเช‚ nr.
เช…เชนเซ€เช‚ เชฎเชพเช‚ เชœเซ‡เชตเซเช‚ เชœ เช›เซ‡ เชœเชตเชพเชฌเชฆเชพเชฐ เชเช• เชŸเซ‡เชธเซเชŸ เชฐเชจ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เชฐเชพเช‰เชŸเชฐ เชธเชพเชฅเซ‡ เช•เชจเซ‡เช•เซเชถเชจ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชเช• เชจเชตเซเช‚ เชธเช‚เชถเซ‹เชงเชฟเชค เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชคเซˆเชฏเชพเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชœเซ‡ เชชเช›เซ€ เช‰เชชเช•เชฐเชฃ เชฆเซเชตเชพเชฐเชพ เชฎเชพเชจเซเชฏ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ (เชชเชฐเช‚เชคเซ เช† เชšเซ‹เช•เซเช•เชธ เชจเชฅเซ€; เชคเซ‡ เช‰เชชเช•เชฐเชฃ เชธเชชเซ‹เชฐเซเชŸ เช…เชจเซ‡ NAPALM เชฎเชพเช‚ เชกเซเชฐเชพเช‡เชตเชฐ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช›เซ‡) , เชชเชฐเช‚เชคเซ เชจเชตเซเช‚ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชธเซ€เชงเซเช‚ เชฒเชพเช—เซ เชชเชกเชคเซเช‚ เชจเชฅเซ€. เชฒเชกเชพเช‡เชจเชพ เช‰เชชเชฏเซ‹เช— เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชชเชฐเชฟเชฎเชพเชฃ เชฆเซ‚เชฐ เช•เชฐเชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡ เชกเซเชฐเชพเชฏ_เชฐเชจ เช…เชฅเชตเชพ เชคเซ‡เชจเซ€ เช•เชฟเช‚เชฎเชค เชฌเชฆเชฒเซ‹ เช–เซ‹เชŸเซเช‚.

เชœเซเชฏเชพเชฐเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชšเชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชจเซ‹เชฐเซเชจเชฟเชฐ เช•เชจเซเชธเซ‹เชฒ เชชเชฐ เชตเชฟเช—เชคเชตเชพเชฐ เชฒเซ‰เช—เซเชธ เช†เช‰เชŸเชชเซเชŸ เช•เชฐเซ‡ เช›เซ‡.

เชธเซเชชเซ‹เชˆเชฒเชฐเชจเซ€ เชจเซ€เชšเซ‡ เชฌเซ‡ เชŸเซ‡เชธเซเชŸ เชฐเชพเช‰เชŸเชฐ เชชเชฐ เชšเชพเชฒเชคเซ€ เชฒเชกเชพเช‡เชจเซเช‚ เช†เช‰เชŸเชชเซเชŸ เช›เซ‡:

config_and_deploy***************************************************************
* cisco-test ** changed : True *******************************************
vvvv config_and_deploy ** changed : True vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO
---- Base Configuration ** changed : True ------------------------------------- INFO
class-map match-all VIDEO_SURV
 match access-group 111

policy-map VIDEO_SURV
 class VIDEO_SURV
    police 1500000 conform-action transmit  exceed-action drop

interface GigabitEthernet0/1/1
  description VIDEOSURV
  ip address 10.10.222.254 255.255.255.0
  service-policy input VIDEO_SURV

router bgp 65001
  network 10.10.222.0 mask 255.255.255.0

access-list 11 permit 10.10.222.0 0.0.0.255
access-list 111 permit ip 10.10.222.0 0.0.0.255 any
---- Loading Configuration on the device ** changed : True --------------------- INFO
+class-map match-all VIDEO_SURV
+ match access-group 111
+policy-map VIDEO_SURV
+ class VIDEO_SURV
+interface GigabitEthernet0/1/1
+  description VIDEOSURV
+  ip address 10.10.222.254 255.255.255.0
+  service-policy input VIDEO_SURV
+router bgp 65001
+  network 10.10.222.0 mask 255.255.255.0
+access-list 11 permit 10.10.222.0 0.0.0.255
+access-list 111 permit ip 10.10.222.0 0.0.0.255 any
^^^^ END config_and_deploy ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
* srx-test ** changed : True *******************************************
vvvv config_and_deploy ** changed : True vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO
---- Base Configuration ** changed : True ------------------------------------- INFO
set interfaces fe-0/0/2 unit 0 description "Video surveillance"
set interfaces fe-0/0/2 unit 0 family inet filter input limit-in
set interfaces fe-0/0/2 unit 0 family inet address 10.10.111.254/24
set policy-options policy-statement export2bgp term 1 from route-filter 10.10.111.0/24 exact
set security zones security-zone WAN interfaces fe-0/0/2
set firewall policer policer-1m if-exceeding bandwidth-limit 1m
set firewall policer policer-1m if-exceeding burst-size-limit 187k
set firewall policer policer-1m then discard
set firewall policer policer-1.5m if-exceeding bandwidth-limit 1500000
set firewall policer policer-1.5m if-exceeding burst-size-limit 280k
set firewall policer policer-1.5m then discard
set firewall filter limit-in term 1 then policer policer-1.5m
set firewall filter limit-in term 1 then count limiter
---- Loading Configuration on the device ** changed : True --------------------- INFO
[edit interfaces]
+   fe-0/0/2 {
+       unit 0 {
+           description "Video surveillance";
+           family inet {
+               filter {
+                   input limit-in;
+               }
+               address 10.10.111.254/24;
+           }
+       }
+   }
[edit]
+  policy-options {
+      policy-statement export2bgp {
+          term 1 {
+              from {
+                  route-filter 10.10.111.0/24 exact;
+              }
+          }
+      }
+  }
[edit security zones]
     security-zone test-vpn { ... }
+    security-zone WAN {
+        interfaces {
+            fe-0/0/2.0;
+        }
+    }
[edit]
+  firewall {
+      policer policer-1m {
+          if-exceeding {
+              bandwidth-limit 1m;
+              burst-size-limit 187k;
+          }
+          then discard;
+      }
+      policer policer-1.5m {
+          if-exceeding {
+              bandwidth-limit 1500000;
+              burst-size-limit 280k;
+          }
+          then discard;
+      }
+      filter limit-in {
+          term 1 {
+              then {
+                  policer policer-1.5m;
+                  count limiter;
+              }
+          }
+      }
+  }
^^^^ END config_and_deploy ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

ansible_vault เชฎเชพเช‚ เชชเชพเชธเชตเชฐเซเชก เช›เซเชชเชพเชตเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช

เชฒเซ‡เช–เชจเซ€ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚ เชนเซเช‚ เชฅเซ‹เชกเซ‹ เช“เชตเชฐเชฌเซ‹เชฐเซเชก เช—เชฏเซ‹ เชœเชตเชพเชฌเชฆเชพเชฐ, เชชเชฐเช‚เชคเซ เชคเซ‡ เชฌเชงเซเช‚ เชเชŸเชฒเซเช‚ เช–เชฐเชพเชฌ เชจเชฅเซ€. เชนเซเช‚ เช–เชฐเซ‡เช–เชฐ เชคเซ‡เชฎเชจเซ‡ เช—เชฎเซ‡ เช›เซ‡ เชคเชฟเชœเซ‹เชฐเซ€ เชœเซ‡เชฎ เช•เซ‡, เชœเซ‡ เชธเช‚เชตเซ‡เชฆเชจเชถเซ€เชฒ เชฎเชพเชนเชฟเชคเซ€เชจเซ‡ เชฆเซƒเชทเซเชŸเชฟเชจเซ€ เชฌเชนเชพเชฐ เช›เซเชชเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชฐเชšเชพเชฏเซ‡เชฒ เช›เซ‡. เช…เชจเซ‡ เช•เชฆเชพเชš เช˜เชฃเชพ เชฒเซ‹เช•เซ‹เช เชจเซ‹เช‚เชงเซเชฏเซเช‚ เช›เซ‡ เช•เซ‡ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชซเชพเช‡เชฒเชฎเชพเช‚ เช–เซเชฒเซเชฒเชพ เชธเซเชตเชฐเซ‚เชชเชฎเชพเช‚ เชšเชฎเช•เชคเชพ เชคเชฎเชพเชฎ เช•เซ‹เชฎเซเชฌเซ‡เชŸ เชฐเชพเช‰เชŸเชฐเซเชธ เชฎเชพเชŸเซ‡เชจเชพ เชคเชฎเชพเชฎ เชฒเซ‹เช—เชฟเชจ/เชชเชพเชธเชตเชฐเซเชกเซเชธ เช›เซ‡. gorups.yaml. เชคเซ‡ เช…เชฒเชฌเชคเซเชค, เชธเซเช‚เชฆเชฐ เชจเชฅเซ€. เชšเชพเชฒเซ‹ เช† เชกเซ‡เชŸเชพเชจเซ‡ เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เช•เชฐเซ€เช เชคเชฟเชœเซ‹เชฐเซ€.

เชšเชพเชฒเซ‹ เชชเชฐเชฟเชฎเชพเชฃเซ‹เชจเซ‡ group.yaml เชฅเซ€ creds.yaml เชฎเชพเช‚ เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฟเชค เช•เชฐเซ€เช, เช…เชจเซ‡ เชคเซ‡เชจเซ‡ 256-เช…เช‚เช•เชจเชพ เชชเชพเชธเชตเชฐเซเชก เชธเชพเชฅเซ‡ AES20 เชธเชพเชฅเซ‡ เชเชจเซเช•เซเชฐเชฟเชชเซเชŸ เช•เชฐเซ€เช:

$ cd inventory
$ cat creds.yaml
---
cisco:
    username: admin1
    password: cisco1

juniper:
    username: admin2
    password: juniper2

$ pwgen 20 -N 1 > vault.passwd
ansible-vault encrypt creds.yaml --vault-password-file vault.passwd  
Encryption successful
$ cat creds.yaml 
$ANSIBLE_VAULT;1.1;AES256
39656463353437333337356361633737383464383231366233386636333965306662323534626131
3964396534396333363939373539393662623164373539620a346565373439646436356438653965
39643266333639356564663961303535353364383163633232366138643132313530346661316533
6236306435613132610a656163653065633866626639613537326233653765353661613337393839
62376662303061353963383330323164633162386336643832376263343634356230613562643533
30363436343465306638653932366166306562393061323636636163373164613630643965636361
34343936323066393763323633336366366566393236613737326530346234393735306261363239
35663430623934323632616161636330353134393435396632663530373932383532316161353963
31393434653165613432326636616636383665316465623036376631313162646435

เชคเซ‡ เชธเชฐเชณ เช›เซ‡. เชคเซ‡ เช…เชฎเชพเชฐเชพ เชถเซ€เช–เชตเชตเชพ เชฎเชพเชŸเซ‡ เชฐเชนเซ‡ เช›เซ‡ เชจเซ‹เชฐเซเชจเชฟเชฐเช† เชกเซ‡เชŸเชพเชจเซ‡ เชชเซเชจเชƒเชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพ เช…เชจเซ‡ เชฒเชพเช—เซ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸ.
เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชถเชฐเซ‚เช†เชคเชจเซ€ เชฒเชพเช‡เชจ เชชเช›เซ€ เช…เชฎเชพเชฐเซ€ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชฎเชพเช‚ nr = InitNornir(config_file=โ€ฆ เชจเซ€เชšเซ‡เชจเซ‹ เช•เซ‹เชก เช‰เชฎเซ‡เชฐเซ‹:

...
nr = InitNornir(config_file="config.yaml", dry_run=True) # set dry_run=False, cross your fingers and run again

# enrich Inventory with the encrypted vault data
from ansible_vault import Vault
vault_password_file="inventory/vault.passwd"
vault_file="inventory/creds.yaml"
with open(vault_password_file, "r") as fp:
    password = fp.readline().strip()   
    vault = Vault(password)
    vaultdata = vault.load(open(vault_file).read())

for a in nr.inventory.hosts.keys():
    item = nr.inventory.hosts[a]
    item.username = vaultdata[item.groups[0]]['username']
    item.password = vaultdata[item.groups[0]]['password']
    #print("hostname={}, username={}, password={}n".format(item.hostname, item.username, item.password))

# run tasks
...

เช…เชฒเชฌเชคเซเชค, vault.passwd เชฎเชพเชฐเชพ เช‰เชฆเชพเชนเชฐเชฃเชจเซ€ เชœเซ‡เชฎ creds.yaml เชจเซ€ เชฌเชพเชœเซเชฎเชพเช‚ เชธเซเชฅเชฟเชค เชนเซ‹เชตเซเช‚ เชœเซ‹เชˆเช เชจเชนเซ€เช‚. เชชเชฐเช‚เชคเซ เชคเซ‡ เชฐเชฎเชตเชพ เชฎเชพเชŸเซ‡ เชฌเชฐเชพเชฌเชฐ เช›เซ‡.

เชนเชฎเชฃเชพเช‚ เชฎเชพเชŸเซ‡ เชเชŸเชฒเซเช‚ เชœ. Cisco + Zabbix เชตเชฟเชถเซ‡ เชฅเซ‹เชกเชพ เชตเชงเซ เชฒเซ‡เช–เซ‹ เช†เชตเซ€ เชฐเชนเซเชฏเชพ เช›เซ‡, เชชเชฐเช‚เชคเซ เช† เช“เชŸเซ‹เชฎเซ‡เชถเชจ เชตเชฟเชถเซ‡ เชฅเซ‹เชกเซเช‚ เชจเชฅเซ€. เช…เชจเซ‡ เชจเชœเซ€เช•เชจเชพ เชญเชตเชฟเชทเซเชฏเชฎเชพเช‚ เชนเซเช‚ เชธเชฟเชธเซเช•เซ‹เชฎเชพเช‚ RESTCONF เชตเชฟเชถเซ‡ เชฒเช–เชตเชพเชจเซเช‚ เชตเชฟเชšเชพเชฐเซ€ เชฐเชนเซเชฏเซ‹ เช›เซเช‚.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹