เดจเต‹เตผเดจเดฟเตผ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เด‰เดชเด•เดฐเดฃ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เด˜เดŸเด•เด™เตเด™เดณเตเดŸเต† เดธเตเดตเดฏเดฎเต‡เดต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดฒเตเด‚ เดชเต‚เดฐเดฟเดชเตเดชเดฟเด•เตเด•เดฒเตเด‚

เดจเต‹เตผเดจเดฟเตผ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เด‰เดชเด•เดฐเดฃ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เด˜เดŸเด•เด™เตเด™เดณเตเดŸเต† เดธเตเดตเดฏเดฎเต‡เดต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดฒเตเด‚ เดชเต‚เดฐเดฟเดชเตเดชเดฟเด•เตเด•เดฒเตเด‚

เดนเต‡ เดนเดฌเตผ!

เด…เดŸเตเดคเตเดคเดฟเดŸเต† เด‡เดตเดฟเดŸเต† เด’เดฐเต เดฒเต‡เด–เดจเด‚ เดตเดจเตเดจเต เดฎเตˆเด•เตเดฐเต‹เดŸเดฟเด•เตเด•เตเด‚ เดฒเดฟเดจเด•เตเดธเตเด‚. เดฆเดฟเดจเดšเดฐเตเดฏเดฏเตเด‚ เด“เดŸเตเดŸเต‹เดฎเต‡เดทเดจเตเด‚ เดซเต‹เดธเดฟเตฝ เดฎเดพเตผเด—เด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดธเดฎเดพเดจเดฎเดพเดฏ เด’เดฐเต เดชเตเดฐเดถเตเดจเด‚ เดชเดฐเดฟเดนเดฐเดฟเดšเตเดšเต. เดŸเดพเดธเตโ€Œเด•เต เดคเดฟเด•เดšเตเดšเตเด‚ เดธเดพเดงเดพเดฐเดฃเดฎเดพเดฃเต†เด™เตเด•เดฟเดฒเตเด‚, เดนเดฌเตเดฐเต†เดฏเดฟเตฝ เด‡เดคเดฟเดจเต เดธเดฎเดพเดจเดฎเดพเดฏ เด’เดจเตเดจเตเด‚ เดคเดจเตเดจเต†เดฏเดฟเดฒเตเดฒ. เดฌเดนเตเดฎเดพเดจเดชเตเดชเต†เดŸเตเดŸ เดเดŸเดฟ เดธเดฎเต‚เดนเดคเตเดคเดฟเดจเต เดŽเตปเตเดฑเต† เดฌเตˆเด•เตเด•เต เดจเตฝเด•เดพเตป เดžเดพเตป เดงเตˆเดฐเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต.

เด‡เดคเตเดคเดฐเดฎเตŠเดฐเต เดŸเดพเดธเตโ€Œเด•เตเด•เดฟเดจเตเดณเตเดณ เด†เดฆเตเดฏ เดฌเตˆเด•เตเด•เดฒเตเดฒ เด‡เดคเต. เด†เดฆเตเดฏ เด“เดชเตเดทเตป เด•เตเดฑเดšเตเดšเต เดตเตผเดทเด™เตเด™เตพเด•เตเด•เต เดฎเตเดฎเตเดชเต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดฟ เด‰เดคเตเดคเดฐเด‚ เดชเดคเดฟเดชเตเดชเต 1.x.x. เดธเตˆเด•เตเด•เดฟเตพ เดตเดณเดฐเต† เด…เดชเต‚เตผเดตเดฎเดพเดฏเดฟ เดฎเดพเดคเตเดฐเดฎเต‡ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเตเดณเตเดณเต‚, เด…เดคเดฟเดจเดพเตฝ เดจเดฟเดฐเดจเตเดคเดฐเด‚ เดคเตเดฐเตเดฎเตเดชเต†เดŸเตเดคเตเดคเต. เดชเดคเดฟเดชเตเดชเตเด•เตพ เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเดฎเตเดชเต‹เตพ เดŸเดพเดธเตเด•เต เดคเดจเตเดจเต† เด‰เดฃเตเดŸเดพเด•เดฟเดฒเตเดฒ เดŽเดจเตเดจ เด…เตผเดคเตเดฅเดคเตเดคเดฟเตฝ เด‰เดคเตเดคเดฐเด‚. เดจเดฟเด™เตเด™เตพ เดกเตเดฐเตˆเดตเต เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸ เด“เดฐเต‹ เดคเดตเดฃเดฏเตเด‚ เดšเต†เดฏเดฟเตป เดตเต€เดดเตเด•เดฏเต‹ เดšเด•เตเดฐเด‚ เดตเต€เดดเตเด•เดฏเต‹ เดšเต†เดฏเตเดฏเตเด‚. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เด†เดฆเตเดฏ เดญเดพเด—เด‚, เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเดจเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต, เดŽเดฒเตเดฒเดพเดฏเตเดชเตเดชเต‹เดดเตเด‚ เดตเดณเดฐเต† เดตเตเดฏเด•เตเดคเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต, เดญเดพเด—เตเดฏเดตเดถเดพเตฝ เดœเดฟเดžเตเดš2 เดŽเดžเตเดšเดฟเตป เดตเดณเดฐเต†เด•เตเด•เดพเดฒเด‚ เดธเตเดฅเดพเดชเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดŽเดจเตเดจเดพเตฝ เดฐเดฃเตเดŸเดพเด‚ เดญเดพเด—เด‚ - เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเดจเตเด•เตพ เดชเตเดฑเดคเตเดคเดฟเดฑเด•เตเด•เตเดจเตเดจเดคเต - เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เด†เดถเตเดšเดฐเตเดฏเด™เตเด™เตพ เด•เตŠเดฃเตเดŸเตเดตเดจเตเดจเต. เด…เดฐเดจเต‚เดฑเต เด‰เดชเด•เดฐเดฃเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เต เดตเดฟเดฆเต‚เดฐเดฎเดพเดฏเดฟ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดฑเต‹เตพ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเดฟเดจเดพเตฝ, เด…เดตเดฏเดฟเตฝ เดšเดฟเดฒเดคเต เด†เดฏเดฟเดฐเด•เตเด•เดฃเด•เตเด•เดฟเดจเต เด•เดฟเดฒเต‹เดฎเต€เดฑเตเดฑเตผ เด…เด•เดฒเต†เดฏเตเดณเตเดณเดคเดฟเดจเดพเตฝ, เดˆ เด‰เดชเด•เดฐเดฃเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต เด…เตฝเดชเตเดชเด‚ เดตเดฟเดฐเดธเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต.

เดŽเตปเตเดฑเต† เด…เดจเดฟเดถเตเดšเดฟเดคเดคเตเดตเด‚ เดฎเดฟเด•เตเด•เดตเดพเดฑเตเด‚ เดŽเตปเตเดฑเต† เดชเดฐเดฟเดšเดฏเด•เตเด•เตเดฑเดตเดฟเดฒเดพเดฃเต เดŽเดจเตเดจเต เดžเดพเตป เด‡เดตเดฟเดŸเต† เดธเดฎเตเดฎเดคเดฟเด•เตเด•เดฃเด‚ เด‰เดคเตเดคเดฐเด‚เด…เดคเดฟเตปเตเดฑเต† เดชเต‹เดฐเดพเดฏเตเดฎเด•เดณเต‡เด•เตเด•เดพเตพ. เด•เต‚เดŸเดพเดคเต†, เด‡เดคเต เด’เดฐเต เดชเตเดฐเดงเดพเดจ เดชเต‹เดฏเดฟเตปเตเดฑเดพเดฃเต. เด‰เดคเตเดคเดฐเด‚ เดคเดฟเด•เดšเตเดšเตเด‚ เดตเต‡เดฑเดฟเดŸเตเดŸ, เดธเตเดตเดจเตเดคเด‚ เดกเดฟเดŽเดธเตเดŽเตฝ (เดกเตŠเดฎเต†เดฏเตเตป เดธเตเดชเต†เดธเดฟเดซเดฟเด•เต เดฒเดพเด‚เด—เตเดตเต‡เดœเต) เด‰เดณเตเดณ เดธเตเดตเดจเตเดคเด‚ เด…เดฑเดฟเดตเดฟเตปเตเดฑเต† เดฎเต‡เด–เดฒเดฏเดพเดฃเต, เด…เดคเต เด†เดคเตเดฎเดตเดฟเดถเตเดตเดพเดธเดฎเตเดณเตเดณ เดคเดฒเดคเตเดคเดฟเตฝ เดจเดฟเดฒเดจเดฟเตผเดคเตเดคเดฃเด‚. เดถเดฐเดฟ, เด† เดจเดฟเดฎเดฟเดทเด‚ เด‰เดคเตเดคเดฐเด‚ เด‡เดคเต เดตเดณเดฐเต† เดตเต‡เด—เดคเตเดคเดฟเตฝ เดตเดฟเด•เดธเดฟเดšเตเดšเตเด•เตŠเดฃเตเดŸเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เดชเดฟเดจเตเดจเดพเด•เตเด• เด…เดจเตเดฏเต‹เดœเตเดฏเดคเดฏเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดชเตเดฐเดคเตเดฏเต‡เด• เดชเดฐเดฟเด—เดฃเดจเดฏเดฟเดฒเตเดฒเดพเดคเต†, เด…เดคเต เด†เดคเตเดฎเดตเดฟเดถเตเดตเดพเดธเด‚ เด•เต‚เดŸเตเดŸเตเดจเตเดจเดฟเดฒเตเดฒ.

เด…เดคเดฟเดจเดพเตฝ, เด…เดงเดฟเด•เด‚ เดคเดพเดฎเดธเดฟเดฏเดพเดคเต† เดธเตˆเด•เตเด•เดฟเดณเดฟเตปเตเดฑเต† เดฐเดฃเตเดŸเดพเด‚ เดชเดคเดฟเดชเตเดชเต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดฟ. เด‡เดคเตเดคเดตเดฃเดฏเตเด‚ เดชเตˆเดคเตเดคเตบ, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดŽเดดเตเดคเดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเดฟเตฝ เดชเตˆเดคเตเดคเตบ เด’เดชเตเดชเด‚ เดชเตˆเดคเตเดคเตบ เดตเดฟเดณเดฟเดšเตเดšเต เดจเต‹เตผเดจเต€เตผ

เด…เดคเดฟเดจเดพเตฝ - เดจเต‹เตผเดจเต€เตผ เด’เดฐเต เดฎเตˆเด•เตเดฐเต‹เดซเตเดฐเต†เดฏเดฟเด‚ เดตเตผเด•เตเด•เต เด†เดฃเต เดŽเดดเตเดคเดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เดชเตˆเดคเตเดคเตบ เด’เดชเตเดชเด‚ เดชเตˆเดคเตเดคเตบ เด“เดŸเตเดŸเต‹เดฎเต‡เดทเดจเดพเดฏเดฟ เดฐเต‚เดชเด•เตฝเดชเตเดชเดจ เดšเต†เดฏเตเดคเดคเตเด‚. เด•เต‡เดธเดฟเดฒเต† เดชเต‹เดฒเต† เดคเดจเตเดจเต† เด‰เดคเตเดคเดฐเด‚, เด‡เดตเดฟเดŸเต† เดชเตเดฐเดถเตเดจเด™เตเด™เตพ เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เดฏเต‹เด—เตเดฏเดคเดฏเตเดณเตเดณ เดกเดพเดฑเตเดฑ เดคเดฏเตเดฏเดพเดฑเดพเด•เตเด•เตฝ เด†เดตเดถเตเดฏเดฎเดพเดฃเต, เด…เดคเดพเดฏเดคเต. เดนเต‹เดธเตเดฑเตเดฑเตเด•เดณเตเดŸเต†เดฏเตเด‚ เด…เดตเดฏเตเดŸเต† เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เดณเตเดŸเต†เดฏเตเด‚ เด‡เตปเดตเต†เตปเตเดฑเดฑเดฟ, เดŽเดจเตเดจเดพเตฝ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เตพ เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• DSL-เตฝ เด…เดฒเตเดฒ เดŽเดดเตเดคเดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต, เดŽเดจเตเดจเดพเตฝ เดตเดณเดฐเต† เดชเดดเดฏเดคเดฒเตเดฒ, เดŽเดจเตเดจเดพเตฝ เดตเดณเดฐเต† เดจเดฒเตเดฒ p[i|i]ton.

เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดคเดคเตเดธเดฎเดฏ เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด…เดคเต เดŽเดจเตเดคเดพเดฃเต†เดจเตเดจเต เดจเต‹เด•เตเด•เดพเด‚.

เดŽเดจเดฟเด•เตเด•เต เดฐเดพเดœเตเดฏเดคเตเดคเตเดŸเดจเต€เดณเด‚ เดจเดฟเดฐเดตเดงเดฟ เดกเดธเตป เด“เดซเต€เดธเตเด•เดณเตเดณเตเดณ เด’เดฐเต เดฌเตเดฐเดพเดžเตเดšเต เดถเตƒเด‚เด–เดฒเดฏเตเดฃเตเดŸเต. เด“เดฐเต‹ เด“เดซเต€เดธเดฟเดจเตเด‚ เด’เดฐเต 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 เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เดณเตเด‚ เดฎเดพเดคเตเดฐเดฎเต‡ เด†เดตเดถเตเดฏเดฎเตเดณเตเดณเต‚. เด…เดต เด‡เดคเดพ:

  • เดŽเด™เตเด•เดฟเตฝ เดชเต‡เดฐเต
  • ipsuffix
  • asn

เด‡เดชเตเดชเต‹เตพ เดจเดฎเตเดฎเตพ เด“เดฐเต‹ เด‰เดชเด•เดฐเดฃเดคเตเดคเดฟเดจเตเด‚ เดˆ เดชเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ เดธเดœเตเดœเดฎเดพเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต, เด…เดคเดพเดฏเดคเต. เด…เดคเต‡ เด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเด• เด‡เตปเดตเต†เดจเตเดฑเดฑเดฟ.

เดตเต‡เดฃเตเดŸเดฟ เด‡เตปเดตเต†เดจเตเดฑเดฑเดฟ เดžเด™เตเด™เตพ เดกเต‹เด•เตเดฏเตเดฎเต†เตปเตเดฑเต‡เดทเตป เด•เตผเดถเดจเดฎเดพเดฏเดฟ เดชเดพเดฒเดฟเด•เตเด•เตเด‚ Nornir เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต

เด…เดคเดพเดฏเดคเต, เดจเดฎเตเด•เตเด•เต เด…เดคเต‡ เดซเดฏเตฝ เด…เดธเตเดฅเดฟเด•เต‚เดŸเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเด‚:

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

config.yaml เดซเดฏเตฝ เดธเดพเดงเดพเดฐเดฃ เดจเต‹เตผเดจเดฟเตผ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดซเดฏเดฒเดพเดฃเต

$ 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

เด—เตเดฐเต‚เดชเตเดชเตเด•เตพ เด‡เดตเดฟเดŸเต†เดฏเตเดฃเตเดŸเต.yaml:

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

juniper:
    platform: junos
    username: admin2
    password: juniper2

เด‡เดคเดพเดฃเต เดธเด‚เดญเดตเดฟเดšเตเดšเดคเต เด‡เตปเดตเต†เดจเตเดฑเดฑเดฟ เดžเด™เตเด™เดณเตเดŸเต† เดšเตเดฎเดคเดฒเดฏเตเด•เตเด•เดพเดฏเดฟ. เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เด‡เตปเดตเต†เตปเตเดฑเดฑเดฟ เดซเดฏเดฒเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ เด’เดฌเตเดœเด•เตเดฑเตเดฑเต เดฎเต‹เดกเดฒเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดชเตเดชเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต เด‡เตปเดตเต†เตปเตเดฑเดฑเดฟ เดŽเดฒเดฎเต†เตปเตเดฑเต.

เดธเตโ€Œเดชเต‹เดฏเดฟเดฒเดฑเดฟเดจเต เดคเดพเดดเต† เด‡เตปเดตเต†เตปเตเดฑเดฑเดฟ เดŽเดฒเดฎเต†เตปเตเดฑเต เดฎเต‹เดกเดฒเดฟเตปเตเดฑเต† เด’เดฐเต เดกเดฏเด—เตเดฐเด‚ เด‰เดฃเตเดŸเต

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"
                }
            }
        }
    }
}

เดˆ เดฎเต‹เดกเตฝ เด…เตฝเดชเตเดชเด‚ เด†เดถเดฏเด•เตเด•เตเดดเดชเตเดชเดคเตเดคเดฟเดฒเดพเด•เตเด•เตเด‚, เดชเตเดฐเดคเตเดฏเต‡เด•เดฟเดšเตเดšเต เด†เดฆเตเดฏเด‚. เด…เดคเต เด•เดฃเตเดŸเตเดชเดฟเดŸเดฟเด•เตเด•เดพเตป, เด‡เตปเตเดฑเดฑเดพเด•เตเดŸเต€เดตเต เดฎเต‹เดกเต เด‡เตป เดเดชเตˆเดคเตเดคเตบ.

 $ 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-เดจเต† เด•เตเดฑเดฟเดšเตเดšเต เด•เตเดฑเดšเตเดšเต เดฒเต‡เด–เดจเด™เตเด™เตพ เด•เต‚เดŸเดฟ เดตเดฐเตเดจเตเดจเตเดฃเตเดŸเต, เดŽเดจเตเดจเดพเตฝ เด‡เดคเต เด“เดŸเตเดŸเต‹เดฎเต‡เดทเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเดฒเตเดฒ. เดธเดฎเต€เดชเดญเดพเดตเดฟเดฏเดฟเตฝ เดธเดฟเดธเตโ€Œเด•เต‹เดฏเดฟเตฝ เดฑเต†เดธเตโ€Œเด•เต‹เตบเดซเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดŽเดดเตเดคเดพเตป เดžเดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•