แž€แžถแžšแž”แž„แŸ’แž€แžพแžแžŠแŸ„แž™แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžท แž“แžทแž„แž€แžถแžšแž”แŸ†แž–แŸแž‰แž’แžถแžแžปแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แžงแž”แž€แžšแžŽแŸแž”แžŽแŸ’แžแžถแž‰แžŠแŸ„แž™แž”แŸ’แžšแžพ Nornir

แž€แžถแžšแž”แž„แŸ’แž€แžพแžแžŠแŸ„แž™แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžท แž“แžทแž„แž€แžถแžšแž”แŸ†แž–แŸแž‰แž’แžถแžแžปแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แžงแž”แž€แžšแžŽแŸแž”แžŽแŸ’แžแžถแž‰แžŠแŸ„แž™แž”แŸ’แžšแžพ Nornir

แž แŸแž แŸ!

แžแŸ’แž˜แžธแŸ—แž“แŸแŸ‡ แžขแžแŸ’แžแž”แž‘แž˜แžฝแž™แž”แžถแž“แž›แŸแž…แžกแžพแž„แž“แŸ…แž‘แžธแž“แŸแŸ‡ แž˜แžธแž€แŸ’แžšแžผแž‘แžทแž€ แž“แžทแž„ Linuxแž‘แž˜แŸ’แž›แžถแž”แŸ‹ แž“แžทแž„ แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžทแž€แž˜แŸ’แž˜ แžŠแŸ‚แž›แž‡แžถแž€แž“แŸ’แž›แŸ‚แž„แžŠแŸ‚แž›แž”แž‰แŸ’แž แžถแžŸแŸ’แžšแžŠแŸ€แž„แž‚แŸ’แž“แžถแž“แŸแŸ‡แžแŸ’แžšแžผแžœแž”แžถแž“แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แžŠแŸ„แž™แž”แŸ’แžšแžพแž˜แž’แŸ’แž™แŸ„แž”แžถแž™แž แŸ’แžœแžผแžŸแŸŠแžธแž›แŸ” แž แžพแž™แž‘แŸ„แŸ‡แž”แžธแž‡แžถแž—แžถแžšแž€แžทแž…แŸ’แž…แž˜แžถแž“แž›แž€แŸ’แžแžŽแŸˆแž’แž˜แŸ’แž˜แžแžถแž€แŸแžŠแŸ„แž™แž€แŸแž‚แŸ’แž˜แžถแž“แžขแŸ’แžœแžธแžŸแŸ’แžšแžŠแŸ€แž„แž‚แŸ’แž“แžถแžขแŸ†แž–แžธแžœแžถแž“แŸ…แž›แžพ Habre แžŠแŸ‚แžšแŸ” แžแŸ’แž‰แžปแŸ†แž แŸŠแžถแž“แž•แŸ’แžแž›แŸ‹แž€แž„แŸ‹แžšแž”แžŸแŸ‹แžแŸ’แž‰แžปแŸ†แžŠแž›แŸ‹แžŸแž แž‚แž˜แž“แŸ IT แž‡แžถแž‘แžธแž‚แŸ„แžšแž–แŸ”

แž“แŸแŸ‡โ€‹แž˜แžทแž“โ€‹แž˜แŸ‚แž“โ€‹แž‡แžถโ€‹แž€แž„แŸ‹โ€‹แž‘แžธโ€‹แž˜แžฝแž™โ€‹แžŸแž˜แŸ’แžšแžถแž”แŸ‹โ€‹แž€แžถแžšแž„แžถแžšโ€‹แž”แŸ‚แž”โ€‹แž“แŸแŸ‡โ€‹แž‘แŸแŸ” แž‡แž˜แŸ’แžšแžพแžŸแžŠแŸ†แž”แžผแž„แžแŸ’แžšแžผแžœแž”แžถแž“แžขแž“แžปแžœแžแŸ’แžแž‡แžถแž…แŸ’แžšแžพแž“แž†แŸ’แž“แžถแŸ†แž˜แžปแž“ ansible แž€แŸ†แžŽแŸ‚ 1.x.x. แž€แž„แŸ‹โ€‹แž“แŸแŸ‡โ€‹แž€แž˜แŸ’แžšโ€‹แž“แžนแž„โ€‹แžแŸ’แžšแžผแžœโ€‹แž”แžถแž“โ€‹แž‚แŸโ€‹แž”แŸ’แžšแžพโ€‹แžŽแžถแžŸแŸ‹โ€‹แž แžพแž™โ€‹แž แŸแžแžปโ€‹แž“แŸแŸ‡โ€‹แž แžพแž™โ€‹แž”แžถแž“โ€‹แž…แŸ’แžšแŸ‚แŸ‡โ€‹แž‡แžถแž”แŸ‹โ€‹แž‡แžถแž“แžทแž…แŸ’แž…แŸ” แž€แŸ’แž“แžปแž„แž“แŸแž™แžแžถ แž—แžถแžšแž€แžทแž…แŸ’แž…แžแŸ’แž›แžฝแž“แžœแžถแž˜แžทแž“แž€แžพแžแžกแžพแž„แž‰แžนแž€แž‰แžถแž”แŸ‹แžŠแžผแž…แžŠแŸ‚แž›แž€แŸ†แžŽแŸ‚แžแŸ’แžšแžผแžœแž”แžถแž“แž’แŸ’แžœแžพแž”แž…แŸ’แž…แžปแž”แŸ’แž”แž“แŸ’แž“แž—แžถแž– ansible. แž แžพแž™แžšแžถแž›แŸ‹แž–แŸแž›แžŠแŸ‚แž›แžขแŸ’แž“แž€แžแŸ’แžšแžผแžœแž€แžถแžšแž”แžพแž€แž”แžš แžแŸ’แžŸแŸ‚แžŸแž„แŸ’แžœแžถแž€แŸ‹แž’แŸ’แž›แžถแž€แŸ‹ แžฌแž€แž„แŸ‹แž’แŸ’แž›แžถแž€แŸ‹แŸ” แž‘แŸ„แŸ‡แž™แŸ‰แžถแž„แžŽแžถแž€แŸแžŠแŸ„แž™ แž•แŸ’แž“แŸ‚แž€แž‘แžธแž˜แžฝแž™ แž”แž„แŸ’แž€แžพแž configs แžแŸ‚แž„แžแŸ‚แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž™แŸ‰แžถแž„แž…แŸ’แž”แžถแžŸแŸ‹ แžŸแŸ†แžŽแžถแž„แž›แŸ’แžข แž‡แžธแž“แž…แžถ แŸข แž˜แŸ‰แžถแžŸแŸŠแžธแž“แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž€แžพแžแžกแžพแž„แž‡แžถแž™แžผแžšแž˜แž€แž แžพแž™แŸ” แž”แŸ‰แžปแž“แŸ’แžแŸ‚โ€‹แž•แŸ’แž“แŸ‚แž€โ€‹แž‘แžธโ€‹แž–แžธแžšโ€‹แžŠแŸ‚แž›โ€‹แžŠแžถแž€แŸ‹โ€‹แž…แŸแž‰โ€‹แž€แžถแžšโ€‹แž€แŸ†แžŽแžแŸ‹โ€‹แž‡แžถโ€‹แž’แž˜แŸ’แž˜แžแžถโ€‹แž“แžถแŸ†โ€‹แžฑแŸ’แž™โ€‹แž˜แžถแž“โ€‹แž€แžถแžšโ€‹แž—แŸ’แž‰แžถแž€แŸ‹โ€‹แž•แŸ’แžขแžพแž›แŸ” แž แžพแž™แž…แžถแž”แŸ‹แžแžถแŸ†แž„แž–แžธแžแŸ’แž‰แžปแŸ†แžแŸ’แžšแžผแžœแž”แž‰แŸ’แž…แŸแž‰ config แž–แžธแž…แž˜แŸ’แž„แžถแž™แžŠแž›แŸ‹แžงแž”แž€แžšแžŽแŸแž€แž“แŸ’แž›แŸ‡แžšแž™ แžŠแŸ‚แž›แžงแž”แž€แžšแžŽแŸแžแŸ’แž›แŸ‡แžŸแŸ’แžแžทแžแž“แŸ…แž…แž˜แŸ’แž„แžถแž™แžšแžถแž”แŸ‹แž–แžถแž“แŸ‹แž‚แžธแžกแžผแž˜แŸ‰แŸ‚แžแŸ’แžš แž€แžถแžšแž”แŸ’แžšแžพแžงแž”แž€แžšแžŽแŸแž“แŸแŸ‡แž‚แžบแž‚แžฝแžšแžฑแŸ’แž™แž’แžปแž‰แž”แž“แŸ’แžแžทแž…แŸ”

แž“แŸ…แž‘แžธแž“แŸแŸ‡แžแŸ’แž‰แžปแŸ†แžแŸ’แžšแžผแžœแžแŸ‚แž‘แž‘แžฝแž›แžŸแŸ’แž‚แžถแž›แŸ‹แžแžถแž—แžถแž–แž˜แžทแž“แž”แŸ’แžšแžถแž€แžŠแž”แŸ’แžšแž‡แžถแžšแž”แžŸแŸ‹แžแŸ’แž‰แžปแŸ†แž‘แŸ†แž“แž„แž‡แžถแžŸแŸ’แžแžทแžแž“แŸ…แž€แŸ’แž“แžปแž„แž€แžถแžšแžแŸ’แžœแŸ‡แžแžถแžแž“แŸƒแž€แžถแžšแžŸแŸ’แž‚แžถแž›แŸ‹แžšแž”แžŸแŸ‹แžแŸ’แž‰แžปแŸ† ansibleแž‡แžถแž„แž€แžถแžšแžแŸ’แžœแŸ‡แžแžถแžแžšแž”แžŸแŸ‹แžœแžถแŸ” แž แžพแž™แž“แŸแŸ‡, แžŠแŸ„แž™แžœแžทแž’แžธแž“แŸแŸ‡, แž‚แžบแž‡แžถแž…แŸ†แžŽแžปแž…แžŸแŸ†แžแžถแž“แŸ‹แž˜แžฝแž™แŸ” ansible แž‚แžบแž‡แžถแž•แŸ’แž“แŸ‚แž€แžŠแžถแž…แŸ‹แžŠแŸ„แž™แžกแŸ‚แž€แž‘แžถแŸ†แž„แžŸแŸ’แžšแžปแž„แž“แŸƒแž…แŸ†แžŽแŸแŸ‡แžŠแžนแž„แžšแž”แžŸแŸ‹แžแŸ’แž›แžฝแž“แž‡แžถแž˜แžฝแž™แž“แžนแž„ DSL (Domain Specific Language) แžšแž”แžŸแŸ‹แžแŸ’แž›แžฝแž“แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแžแŸ‚แžšแž€แŸ’แžŸแžถแž“แŸ…แž€แž˜แŸ’แžšแžทแžแžŠแŸ‚แž›แž˜แžถแž“แž‘แŸ†แž“แžปแž€แž…แžทแžแŸ’แžแŸ” แž˜แŸ‚แž“แž แžพแž™ แž–แŸแž›แž“แŸ„แŸ‡ ansible แžœแžถโ€‹แž€แŸ†แž–แžปแž„โ€‹แžขแž—แžทแžœแžŒแŸ’แžโ€‹แž™แŸ‰แžถแž„โ€‹แž†แžถแž”แŸ‹โ€‹แžšแž แŸแžŸ แž แžพแž™โ€‹แžŠแŸ„แž™โ€‹แž‚แŸ’แž˜แžถแž“โ€‹แž€แžถแžšโ€‹แž–แžทแž…แžถแžšแžŽแžถโ€‹แž–แžทแžŸแŸแžŸโ€‹แžŸแž˜แŸ’แžšแžถแž”แŸ‹โ€‹แž—แžถแž–โ€‹แžแŸ’แžšแžผแžœโ€‹แž‚แŸ’แž“แžถโ€‹แžแž™โ€‹แž€แŸ’แžšแŸ„แž™ แžœแžถโ€‹แž˜แžทแž“โ€‹แž”แž“แŸ’แžแŸ‚แž˜โ€‹แž‘แŸ†แž“แžปแž€โ€‹แž…แžทแžแŸ’แžโ€‹แžกแžพแž™แŸ”

แžŠแžผแž…แŸ’แž“แŸแŸ‡แž˜แžทแž“แž™แžผแžšแž”แŸ‰แžปแž“แŸ’แž˜แžถแž“แž‘แŸ แž€แŸ†แžŽแŸ‚แž‘แžธแž–แžธแžšแž“แŸƒแž€แž„แŸ‹แžแŸ’แžšแžผแžœแž”แžถแž“แžขแž“แžปแžœแžแŸ’แžแŸ” แž›แžพแž€แž“แŸแŸ‡แŸ” แž–แžŸแŸ‹แžแŸ’แž›แžถแž“แŸ‹แžฌแž‡แžถแž‡แžถแž„แž“แŸ…แž›แžพแž€แŸ’แžšแž”แžแŸแžŽแŸ’แžŒแžŠแŸ‚แž›แž”แžถแž“แžŸแžšแžŸแŸแžšแž“แŸ…แž€แŸ’แž“แžปแž„ แž–แžŸแŸ‹แžแŸ’แž›แžถแž“แŸ‹ แž“แžทแž„แžŸแž˜แŸ’แžšแžถแž”แŸ‹แŸ” แž–แžŸแŸ‹แžแŸ’แž›แžถแž“แŸ‹ แž”แžถแž“แž แŸ… แž“แžšแžทแž“แŸ’แž‘

แžŠแžผแž…แŸ’แž“แŸแŸ‡ - แž“แžšแžทแž“แŸ’แž‘ แž‚แžบแž‡แžถ microframework แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“แžŸแžšแžŸแŸแžšแž“แŸ…แž€แŸ’แž“แžปแž„ แž–แžŸแŸ‹แžแŸ’แž›แžถแž“แŸ‹ แž“แžทแž„แžŸแž˜แŸ’แžšแžถแž”แŸ‹แŸ” แž–แžŸแŸ‹แžแŸ’แž›แžถแž“แŸ‹ แž“แžทแž„แžแŸ’แžšแžผแžœแž”แžถแž“แžšแž…แž“แžถแžกแžพแž„แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžทแž€แž˜แŸ’แž˜แŸ” แžŠแžผแž…แž‚แŸ’แž“แžถแž“แžนแž„แž€แžšแžŽแžธแž‡แžถแž˜แžฝแž™ ansibleแžŠแžพแž˜แŸ’แž”แžธแžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แž”แž‰แŸ’แž แžถแž“แŸ…แž‘แžธแž“แŸแŸ‡ แž€แžถแžšแžšแŸ€แž”แž…แŸ†แž‘แžทแž“แŸ’แž“แž“แŸแž™แž˜แžถแž“แžŸแž˜แžแŸ’แžแž€แžทแž…แŸ’แž…แž‚แžบแžแŸ’แžšแžผแžœแž”แžถแž“แž‘แžถแž˜แž‘แžถแžš, i.e. แžŸแžถแžšแž–แžพแž—แŸแžŽแŸ’แžŒแž“แŸƒแž˜แŸ‰แžถแžŸแŸŠแžธแž“ แž“แžทแž„แž”แŸ‰แžถแžšแŸ‰แžถแž˜แŸ‰แŸ‚แžแŸ’แžšแžšแž”แžŸแŸ‹แž–แžฝแž€แž‚แŸ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžŸแŸ’แž‚แŸ’แžšแžธแž”แž˜แžทแž“แžแŸ’แžšแžผแžœแž”แžถแž“แžŸแžšแžŸแŸแžšแž“แŸ…แž€แŸ’แž“แžปแž„ DSL แžŠแžถแž…แŸ‹แžŠแŸ„แž™แžกแŸ‚แž€แž“แŸ„แŸ‡แž‘แŸ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž“แŸ…แž€แŸ’แž“แžปแž„แžŠแžผแž…แž‚แŸ’แž“แžถแž“แŸแŸ‡แž˜แžทแž“แž…แžถแžŸแŸ‹แžŽแžถแžŸแŸ‹ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž›แŸ’แžขแžŽแžถแžŸแŸ‹ p[i|i]ton แŸ”

แžŸแžผแž˜แž€แŸ’แžšแžกแŸแž€แž˜แžพแž›แžขแŸ’แžœแžธแžŠแŸ‚แž›แžœแžถแž€แŸ†แž–แžปแž„แž”แŸ’แžšแžพแžงแž‘แžถแž แžšแžŽแŸแž•แŸ’แž‘แžถแž›แŸ‹แžแžถแž„แž€แŸ’แžšแŸ„แž˜แŸ”

แžแŸ’แž‰แžปแŸ†แž˜แžถแž“แž”แžŽแŸ’แžแžถแž‰แžŸแžถแžแžถแžŠแŸ‚แž›แž˜แžถแž“แž€แžถแžšแžทแž™แžถแž›แŸแž™แžšแžถแž”แŸ‹แžŸแžทแž”แž‘แžผแž‘แžถแŸ†แž„แž”แŸ’แžšแž‘แŸแžŸแŸ” แž€แžถแžšแžทแž™แžถแž›แŸแž™แž“แžธแž˜แžฝแž™แŸ—แž˜แžถแž“แžšแŸ‰แŸ„แžแž‘แŸแžš WAN แžŠแŸ‚แž›แž”แžทแž‘แž”แžŽแŸ’แžแžถแž‰แž‘แŸ†แž“แžถแž€แŸ‹แž‘แŸ†แž“แž„แž‡แžถแž…แŸ’แžšแžพแž“แž–แžธแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžšแž•แŸ’แžŸแŸแž„แŸ—แž‚แŸ’แž“แžถแŸ” แž–แžทแž’แžธแž€แžถแžšแž“แžถแŸ†แž•แŸ’แž›แžผแžœแž‚แžบ BGP แŸ” แžšแŸ‰แŸ„แžแž‘แŸแžš WAN แž˜แžถแž“แž–แžธแžšแž”แŸ’แžšแž—แŸแž‘แž‚แžบ Cisco ISG แžฌ Juniper SRX แŸ”

แžฅแžกแžผแžœแž“แŸแŸ‡แž—แžถแžšแž€แžทแž…แŸ’แž…แŸ– แžขแŸ’แž“แž€แžแŸ’แžšแžผแžœแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž”แžŽแŸ’แžแžถแž‰แžšแž„แžŠแŸ‚แž›แžแžทแžแžแŸ†แž”แŸ’แžšแžนแž„แž”แŸ’แžšแŸ‚แž„แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแžƒแŸ’แž›แžถแŸ†แž˜แžพแž›แžœแžธแžŠแŸแžขแžผแž“แŸ…แž›แžพแž…แŸ’แžšแž€แžŠแžถแž…แŸ‹แžŠแŸ„แž™แžกแŸ‚แž€แž“แŸ…แž›แžพแžšแŸ‰แŸ„แžแž‘แŸแžš WAN แž‘แžถแŸ†แž„แžขแžŸแŸ‹แž“แŸƒแž”แžŽแŸ’แžแžถแž‰แžŸแžถแžแžถ - แž•แŸ’แžŸแž–แŸ’แžœแž•แŸ’แžŸแžถแž™แž”แžŽแŸ’แžแžถแž‰แžšแž„แž“แŸแŸ‡แž“แŸ…แž€แŸ’แž“แžปแž„ BGP - แž€แŸ†แžŽแžแŸ‹แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แž›แŸ’แž”แžฟแž“แž“แŸƒแž…แŸ’แžšแž€แžŠแŸ‚แž›แžแžทแžแžแŸ†แž”แŸ’แžšแžนแž„แž”แŸ’แžšแŸ‚แž„แŸ”

แž‡แžถแžŠแŸ†แž”แžผแž„ แž™แžพแž„แžแŸ’แžšแžผแžœแžšแŸ€แž”แž…แŸ†แž‚แŸ†แžšแžผแž˜แžฝแž™แž…แŸ†แž“แžฝแž“ แžŠแŸ„แž™แžˆแžšแž›แžพแž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž“แŸƒแž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แžŠแŸ‚แž›แž“แžนแž„แžแŸ’แžšแžผแžœแž”แž„แŸ’แž€แžพแžแžŠแžถแž…แŸ‹แžŠแŸ„แž™แžกแŸ‚แž€แžŸแž˜แŸ’แžšแžถแž”แŸ‹ Cisco แž“แžทแž„ Juniper แŸ” แžœแžถแž€แŸแž…แžถแŸ†แž”แžถแž…แŸ‹แž•แž„แžŠแŸ‚แžšแž€แŸ’แž“แžปแž„แž€แžถแžšแžšแŸ€แž”แž…แŸ†แž‘แžทแž“แŸ’แž“แž“แŸแž™แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž…แŸ†แžŽแžปแž…แž“แžธแž˜แžฝแž™แŸ— แž“แžทแž„แž”แŸ‰แžถแžšแŸ‰แžถแž˜แŸ‰แŸ‚แžแŸ’แžšแž“แŸƒแž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹ i.e. แž”แŸ’แžšแž˜แžผแž›แžŸแžถแžšแž–แžพแž—แŸแžŽแŸ’แžŒแžŠแžผแž…แž‚แŸ’แž“แžถแŸ”

แž‚แŸ†แžšแžผแžšแžฝแž…แžšแžถแž›แŸ‹แžŸแž˜แŸ’แžšแžถแž”แŸ‹ CiscoแŸ–

$ 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

แž‚แŸ†แžšแžผแžŸแž˜แŸ’แžšแžถแž”แŸ‹ JuniperแŸ–

$ 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

แž‡แžถแž€แžถแžšแž–แžทแžแžŽแžถแžŸแŸ‹แž‚แŸ†แžšแžผแž˜แžทแž“แž…แŸแž‰แž–แžธแžแŸ’แž™แž›แŸ‹แžŸแŸ’แžแžพแž„แž‘แŸแŸ” แž‘แžถแŸ†แž„แž“แŸแŸ‡แž‚แžบแž‡แžถแž—แžถแž–แžแžปแžŸแž‚แŸ’แž“แžถแžŸแŸ†แžแžถแž“แŸ‹แžšแžœแžถแž„แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž€แžถแžšแž„แžถแžšแžŠแŸ‚แž›แž˜แžถแž“ แž“แžทแž„แž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธแž”แžถแž“แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แž—แžถแžšแž€แžทแž…แŸ’แž…แž“แŸ…แž›แžพแžšแŸ‰แŸ„แžแž‘แŸแžšแž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹แž–แžธแžšแž“แŸƒแž˜แŸ‰แžผแžŠแŸ‚แž›แž•แŸ’แžŸแŸแž„แŸ—แž‚แŸ’แž“แžถแŸ”

แž–แžธแž‚แŸ†แžšแžผแžšแž”แžŸแŸ‹แž™แžพแž„ แž™แžพแž„แžƒแžพแž‰แžแžถ แžŠแžพแž˜แŸ’แž”แžธแžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แž”แž‰แŸ’แž แžถ แž™แžพแž„แžแŸ’แžšแžผแžœแž€แžถแžšแžแŸ‚แž”แŸ‰แžถแžšแŸ‰แžถแž˜แŸ‰แŸ‚แžแŸ’แžšแž–แžธแžšแžŸแž˜แŸ’แžšแžถแž”แŸ‹ Juniper แž“แžทแž„ 3 แž”แŸ‰แžถแžšแŸ‰แžถแž˜แŸ‰แŸ‚แžแŸ’แžšแžŸแž˜แŸ’แžšแžถแž”แŸ‹ Cisco แŸ” แž–แžฝแž€แž‚แŸแž“แŸ…แž‘แžธแž“แŸแŸ‡แŸ–

  • ifname
  • ipsuffix
  • แžขแŸแž“

แžฅแžกแžผแžœแž“แŸแŸ‡แž™แžพแž„แžแŸ’แžšแžผแžœแž€แŸ†แžŽแžแŸ‹แž”แŸ‰แžถแžšแŸ‰แžถแž˜แŸ‰แŸ‚แžแŸ’แžšแž‘แžถแŸ†แž„แž“แŸแŸ‡แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžงแž”แž€แžšแžŽแŸแž“แžธแž˜แžฝแž™แŸ— i.e. แž’แŸ’แžœแžพแžšแžฟแž„แžŠแžผแž…แž‚แŸ’แž“แžถแŸ” แžŸแžถแžšแž–แžพแž—แŸแžŽแŸ’แžŒ.

แžŸแž˜แŸ’แžšแžถแž”แŸ‹ แžŸแžถแžšแž–แžพแž—แŸแžŽแŸ’แžŒ แž™แžพแž„แž“แžนแž„แžขแž“แžปแžœแžแŸ’แžแžแžถแž˜แžฏแž€แžŸแžถแžšแž™แŸ‰แžถแž„แžแžนแž„แžšแŸ‰แžนแž„ แž€แžถแžšแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜ Nornir

แž“แŸ„แŸ‡แž‚แžบ แž…แžผแžšแž™แžพแž„แž”แž„แŸ’แž€แžพแžแž‚แŸ’แžšแŸ„แž„แžฏแž€แžŸแžถแžšแžŠแžผแž…แž‚แŸ’แž“แžถแŸ–

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

แžฏแž€แžŸแžถแžš config.yaml แž‚แžบแž‡แžถแžฏแž€แžŸแžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’ nonir แžŸแŸ’แžแž„แŸ‹แžŠแžถแžš

$ 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, แž€แŸ’แžšแžปแž˜ (แž€แŸ’แž“แžปแž„แž€แžšแžŽแžธแžšแž”แžŸแŸ‹แžแŸ’แž‰แžปแŸ†แž‘แžถแŸ†แž„แž“แŸแŸ‡แž‚แžบแž‡แžถแž€แžถแžšแž…แžผแž› / แž–แžถแž€แŸ’แž™แžŸแž˜แŸ’แž„แžถแžแŸ‹) แž“แŸ…แž€แŸ’แž“แžปแž„ แž€แŸ’แžšแžปแž˜.yamlแž“แžทแž„แž€แŸ’แž“แžปแž„แŸ” defaults.yaml แž™แžพแž„แž“แžนแž„แž˜แžทแž“แž”แž„แŸ’แž แžถแž‰แžขแŸ’แžœแžธแž“แŸ„แŸ‡แž‘แŸ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžขแŸ’แž“แž€แžแŸ’แžšแžผแžœแž”แž‰แŸ’แž…แžผแž› minuses แž”แžธแž“แŸ…แž‘แžธแž“แŸ„แŸ‡ - แž”แž„แŸ’แž แžถแž‰แžแžถแžœแžถแž‚แžบ แž™แŸ‰แžถแž˜แž› แžฏแž€แžŸแžถแžšแž‚แžบแž‘แž‘แŸแŸ”

แž“แŸแŸ‡แž‡แžถแžขแŸ’แžœแžธแžŠแŸ‚แž› 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

แž“แŸแŸ‡แž‡แžถแžขแŸ’แžœแžธแžŠแŸ‚แž›แž”แžถแž“แž€แžพแžแžกแžพแž„ แžŸแžถแžšแž–แžพแž—แŸแžŽแŸ’แžŒ แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžทแž…แŸ’แž…แž€แžถแžšแžšแž”แžŸแŸ‹แž™แžพแž„แŸ” แž€แŸ†แžกแžปแž„แž–แŸแž›แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜ แž”แŸ‰แžถแžšแŸ‰แžถแž˜แŸ‰แŸ‚แžแŸ’แžšแž–แžธแžฏแž€แžŸแžถแžšแžŸแžถแžšแž–แžพแž—แŸแžŽแŸ’แžŒแžแŸ’แžšแžผแžœแž”แžถแž“แž•แŸ’แž‚แžผแž•แŸ’แž‚แž„แž‘แŸ…แž“แžนแž„แž‚แŸ†แžšแžผแžœแžแŸ’แžแžป แž’แžถแžแžปแžŸแžถแžšแž–แžพแž—แŸแžŽแŸ’แžŒ.

แžแžถแž„แž€แŸ’แžšแŸ„แž˜ spoiler แž‚แžบแž‡แžถแžŠแŸ’แž™แžถแž€แŸ’แžšแžถแž˜แž“แŸƒ InventoryElement model

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.
แž“แŸ…แž‘แžธแž“แŸแŸ‡แžŠแžผแž…แž‚แŸ’แž“แžถแž“แžนแž„แž“แŸ…แž€แŸ’แž“แžปแž„ ansible แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŸแžถแž€แž›แŸ’แž”แž„แžแŸ’แžšแžผแžœแž”แžถแž“แžขแž“แžปแžœแžแŸ’แžแžŠแŸ‚แž›แž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹แž‘แŸ…แžšแŸ‰แŸ„แžแž‘แŸแžšแžแŸ’แžšแžผแžœแž”แžถแž“แž’แŸ’แžœแžพแžกแžพแž„ แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แžŠแŸ‚แž›แž”แžถแž“แž€แŸ‚แž”แŸ’แžšแŸ‚แžแŸ’แž˜แžธแžแŸ’แžšแžผแžœแž”แžถแž“แžšแŸ€แž”แž…แŸ† แžŠแŸ‚แž›แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž‰แŸ’แž‡แžถแž€แŸ‹แžŠแŸ„แž™แžงแž”แž€แžšแžŽแŸ (แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž˜แžทแž“แž”แŸ’แžšแžถแž€แžŠแž‘แŸ แžœแžถแžขแžถแžŸแŸ’แžšแŸแž™แž›แžพแž€แžถแžšแž‚แžถแŸ†แž‘แŸ’แžšแžงแž”แž€แžšแžŽแŸ แž“แžทแž„แž€แžถแžšแžขแž“แžปแžœแžแŸ’แžแž€แž˜แŸ’แž˜แžœแžทแž’แžธแž”แž‰แŸ’แž‡แžถแž“แŸ…แž€แŸ’แž“แžปแž„ NAPALM) แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แžแŸ’แž˜แžธแž˜แžทแž“แžแŸ’แžšแžผแžœแž”แžถแž“แžขแž“แžปแžœแžแŸ’แžแžŠแŸ„แž™แž•แŸ’แž‘แžถแž›แŸ‹แž‘แŸแŸ” แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž”แŸ’แžšแž™แžปแž‘แŸ’แž’ แžขแŸ’แž“แž€แžแŸ’แžšแžผแžœแžแŸ‚แžŠแž€แž”แŸ‰แžถแžšแŸ‰แžถแž˜แŸ‰แŸ‚แžแŸ’แžšแž…แŸแž‰ dry_run แžฌแž”แŸ’แžแžผแžšแžแž˜แŸ’แž›แŸƒแžšแž”แžŸแŸ‹แžœแžถแž‘แŸ…แž‡แžถ False.

แž“แŸ…แž–แŸแž›แžŠแŸ‚แž›แžŸแŸ’แž‚แŸ’แžšแžธแž”แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ’แžšแžแžทแž”แžแŸ’แžแžท Nornir แž”แž‰แŸ’แž…แŸแž‰แž€แŸ†แžŽแžแŸ‹แž แŸแžแžปแž›แž˜แŸ’แžขแžทแžแž‘แŸ…แž€แžถแž“แŸ‹แž€แžปแž„แžŸแžผแž›แŸ”

แžแžถแž„แž€แŸ’แžšแŸ„แž˜ spoiler แž‚แžบแž‡แžถแž›แž‘แŸ’แž’แž•แž›แž“แŸƒแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž”แŸ’แžšแž™แžปแž‘แŸ’แž’แž“แŸ…แž›แžพ Router แžŸแžถแž€แž›แŸ’แž”แž„แž–แžธแžšแŸ–

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

แž“แŸ…แžŠแžพแž˜แžขแžแŸ’แžแž”แž‘ แžแŸ’แž‰แžปแŸ†แž”แžถแž“แž†แŸ’แž›แž„แž€แžถแžแŸ‹แž”แž“แŸ’แžแžทแž… ansibleแž”แŸ‰แžปแž“แŸ’แžแŸ‚แžœแžถแž˜แžทแž“แž˜แŸ‚แž“แžขแžถแž€แŸ’แžšแž€แŸ‹แž‘แžถแŸ†แž„แžขแžŸแŸ‹แž“แŸ„แŸ‡แž‘แŸแŸ” แžแŸ’แž‰แžปแŸ†แž–แžทแžแž‡แžถแž…แžผแž›แž…แžทแžแŸ’แžแž–แžฝแž€แž‚แŸแŸ” แžแžปแžŠแŸแž€ แžŠแžผแž…แž‡แžถ แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“แžšแž…แž“แžถแžกแžพแž„แžŠแžพแž˜แŸ’แž”แžธแž›แžถแž€แŸ‹แž–แŸแžแŸŒแž˜แžถแž“แžšแžŸแžพแž”แž…แŸแž‰แž–แžธแž€แžถแžšแž˜แžพแž›แžƒแžพแž‰แŸ” แž แžพแž™แž”แŸ’แžšแž แŸ‚แž›แž‡แžถแž˜แžถแž“แž˜แž“แžปแžŸแŸ’แžŸแž‡แžถแž…แŸ’แžšแžพแž“แž”แžถแž“แž€แžแŸ‹แžŸแž˜แŸ’แž‚แžถแž›แŸ‹แžƒแžพแž‰แžแžถ แž™แžพแž„แž˜แžถแž“แžšแžถแž›แŸ‹แž€แžถแžšแž…แžผแž›/แž–แžถแž€แŸ’แž™แžŸแž˜แŸ’แž„แžถแžแŸ‹แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžšแŸ‰แŸ„แžแž‘แŸแžšแž”แŸ’แžšแž™แžปแž‘แŸ’แž’แž‘แžถแŸ†แž„แžขแžŸแŸ‹แžŠแŸ‚แž›แž˜แžถแž“แž–แž“แŸ’แž›แžบแž“แŸ…แž€แŸ’แž“แžปแž„แž‘แž˜แŸ’แžšแž„แŸ‹แž”แžพแž€แž…แŸ†แž แž“แŸ…แž€แŸ’แž“แžปแž„แžฏแž€แžŸแžถแžšแž˜แžฝแž™แŸ” gorups.yaml. แž–แžทแžแžŽแžถแžŸแŸ‹แžœแžถแž˜แžทแž“แžŸแŸ’แžขแžถแžแž‘แŸแŸ” แžแŸ„แŸ‡แž€แžถแžšแž–แžถแžšแž‘แžทแž“แŸ’แž“แž“แŸแž™แž“แŸแŸ‡แž‡แžถแž˜แžฝแž™ แžแžปแžŠแŸแž€.

แžแŸ„แŸ‡แž•แŸ’แž‘แŸแžšแž”แŸ‰แžถแžšแŸ‰แžถแž˜แŸ‰แŸ‚แžแŸ’แžšแž–แžธ groups.yaml แž‘แŸ… creds.yaml แž แžพแž™แžขแŸŠแžทแž“แž‚แŸ’แžšแžธแž”แžœแžถแž‡แžถแž˜แžฝแž™ AES256 แž‡แžถแž˜แžฝแž™แž“แžนแž„แž–แžถแž€แŸ’แž™แžŸแž˜แŸ’แž„แžถแžแŸ‹ 20 แžแŸ’แž‘แž„แŸ‹แŸ–

$ 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

แžœแžถแžŸแžถแž˜แž‰แŸ’แž‰แžŽแžถแžŸแŸ‹แŸ” แžœแžถแž“แŸ…แžŸแž›แŸ‹แžŠแžพแž˜แŸ’แž”แžธแž”แž„แŸ’แžšแŸ€แž“แžšแž”แžŸแŸ‹แž™แžพแž„แŸ” แž“แžšแžทแž“แŸ’แž‘-script แžŠแžพแž˜แŸ’แž”แžธแž‘แžถแž‰แž™แž€ แž“แžทแž„แžขแž“แžปแžœแžแŸ’แžแž‘แžทแž“แŸ’แž“แž“แŸแž™แž“แŸแŸ‡แŸ”
แžŠแžพแž˜แŸ’แž”แžธแž’แŸ’แžœแžพแžŠแžผแž…แž“แŸแŸ‡แž“แŸ…แž€แŸ’แž“แžปแž„แžŸแŸ’แž‚แŸ’แžšแžธแž”แžšแž”แžŸแŸ‹แž™แžพแž„แž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธแž”แž“แŸ’แž‘แžถแžแŸ‹แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜ 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 แž“แŸ…แž€แŸ’แž“แžปแž„ CiscoแŸ”

แž”แŸ’แžšแž—แž–: www.habr.com

แž‘แžทแž‰แž€แžถแžšแž”แž„แŸ’แž แŸ„แŸ‡แžŠแŸ‚แž›แžขแžถแž…แž‘แžปแž€แž…แžทแžแŸ’แžแž”แžถแž“แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž‚แŸแž แž‘แŸ†แž–แŸแžšแžŠแŸ‚แž›แž˜แžถแž“แž€แžถแžšแž€แžถแžšแž–แžถแžš DDoS, แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ VPS VDS ๐Ÿ”ฅ แž‘แžทแž‰แžŸแŸแžœแžถแž”แž„แŸ’แž แŸ„แŸ‡แž‚แŸแž แž‘แŸ†แž–แŸแžšแžŠแŸ‚แž›แžขแžถแž…แž‘แžปแž€แž…แžทแžแŸ’แžแž”แžถแž“แž‡แžถแž˜แžฝแž™แž“แžนแž„แž€แžถแžšแž€แžถแžšแž–แžถแžš DDoS แž“แžทแž„แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ VPS VDS | ProHoster