แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒแƒ‘แƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒ˜ แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒ แƒ“แƒ แƒจแƒ”แƒ•แƒกแƒ”แƒ‘แƒ Nornir-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒแƒ‘แƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒ˜ แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒ แƒ“แƒ แƒจแƒ”แƒ•แƒกแƒ”แƒ‘แƒ Nornir-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒฐแƒ”แƒ˜ แƒฐแƒแƒ‘แƒ !

แƒชแƒแƒขแƒ แƒฎแƒœแƒ˜แƒก แƒฌแƒ˜แƒœ แƒแƒฅ แƒ’แƒแƒ›แƒแƒฉแƒœแƒ“แƒ แƒกแƒขแƒแƒขแƒ˜แƒ Mikrotik แƒ“แƒ Linux. แƒ แƒฃแƒขแƒ˜แƒœแƒ แƒ“แƒ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒกแƒแƒ“แƒแƒช แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ แƒ’แƒแƒ“แƒแƒ˜แƒญแƒ แƒ แƒœแƒแƒ›แƒแƒ แƒฎแƒ˜ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—. แƒ“แƒ แƒ›แƒ˜แƒฃแƒฎแƒ”แƒ“แƒแƒ•แƒแƒ“ แƒ˜แƒ›แƒ˜แƒกแƒ, แƒ แƒแƒ› แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ แƒกแƒ แƒฃแƒšแƒ˜แƒแƒ“ แƒขแƒ˜แƒžแƒ˜แƒฃแƒ แƒ˜แƒ, แƒฐแƒแƒ‘แƒ แƒ”แƒ–แƒ” แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒแƒ แƒแƒคแƒ”แƒ แƒ˜แƒ. แƒ›แƒ” แƒ•แƒ‘แƒ”แƒ“แƒแƒ•, แƒฉแƒ”แƒ›แƒ˜ แƒ•แƒ”แƒšแƒแƒกแƒ˜แƒžแƒ”แƒ“แƒ˜ แƒจแƒ”แƒ•แƒ—แƒแƒ•แƒแƒ–แƒ แƒžแƒแƒขแƒ˜แƒ•แƒชแƒ”แƒ›แƒฃแƒš IT แƒกแƒแƒ–แƒแƒ’แƒแƒ“แƒแƒ”แƒ‘แƒแƒก.

แƒ”แƒก แƒแƒ  แƒแƒ แƒ˜แƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ•แƒ”แƒšแƒแƒกแƒ˜แƒžแƒ”แƒ“แƒ˜ แƒแƒกแƒ”แƒ—แƒ˜ แƒแƒ›แƒแƒชแƒแƒœแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜ แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ“แƒ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒฌแƒšแƒ˜แƒก แƒฌแƒ˜แƒœ แƒฃแƒ™แƒแƒœ แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ›แƒ’แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ 1.x.x. แƒ•แƒ”แƒšแƒแƒกแƒ˜แƒžแƒ”แƒ“แƒก แƒ˜แƒจแƒ•แƒ˜แƒแƒ—แƒแƒ“ แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ“แƒœแƒ”แƒœ แƒ“แƒ แƒแƒ›แƒ˜แƒขแƒแƒ› แƒ›แƒฃแƒ“แƒ›แƒ˜แƒ•แƒแƒ“ แƒŸแƒแƒœแƒ’แƒ“แƒ”แƒ‘แƒแƒ“แƒ. แƒ˜แƒ› แƒ’แƒแƒ’แƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ› แƒ—แƒแƒ•แƒแƒ“ แƒแƒ›แƒแƒชแƒแƒœแƒ แƒแƒ  แƒฉแƒœแƒ“แƒ”แƒ‘แƒ แƒ˜แƒกแƒ” แƒฎแƒจแƒ˜แƒ แƒแƒ“, แƒ แƒแƒ’แƒแƒ แƒช แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒแƒฎแƒšแƒ”แƒ‘แƒ แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ›แƒ’แƒ”แƒ‘แƒ”แƒšแƒ˜. แƒ“แƒ แƒงแƒแƒ•แƒ”แƒš แƒฏแƒ”แƒ แƒ–แƒ”, แƒ แƒแƒชแƒ แƒ›แƒแƒ แƒ—แƒแƒ•แƒ—, แƒฏแƒแƒญแƒ•แƒ˜ แƒชแƒ•แƒ˜แƒ•แƒ แƒแƒœ แƒ‘แƒแƒ แƒ‘แƒแƒšแƒ˜ แƒชแƒ•แƒ˜แƒ•แƒ. แƒ—แƒฃแƒ›แƒชแƒ, แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒœแƒแƒฌแƒ˜แƒšแƒ˜, แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒ, แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒซแƒแƒšแƒ˜แƒแƒœ แƒœแƒแƒ—แƒšแƒแƒ“ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก, แƒกแƒแƒ‘แƒ”แƒ“แƒœแƒ˜แƒ”แƒ แƒแƒ“ แƒฏแƒ˜แƒœแƒฏแƒ2 แƒซแƒ แƒแƒ•แƒ แƒ“แƒ˜แƒ“แƒ˜ แƒฎแƒแƒœแƒ˜แƒ แƒฉแƒแƒ›แƒแƒงแƒแƒšแƒ˜แƒ‘แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ. แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒ”แƒแƒ แƒ” แƒœแƒแƒฌแƒ˜แƒšแƒ˜ - แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ - แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ• แƒกแƒ˜แƒฃแƒ แƒžแƒ แƒ˜แƒ–แƒ”แƒ‘แƒก แƒ›แƒแƒฐแƒงแƒ•แƒ. แƒ“แƒ แƒ แƒแƒ“แƒ’แƒแƒœ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒ“แƒ˜แƒกแƒขแƒแƒœแƒชแƒ˜แƒฃแƒ แƒแƒ“ แƒ’แƒแƒ“แƒแƒขแƒแƒœแƒ แƒ›แƒแƒ›แƒ˜แƒฌแƒ˜แƒ แƒœแƒแƒฎแƒ”แƒ•แƒแƒ  แƒแƒก แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒแƒ‘แƒแƒ–แƒ”, แƒ แƒแƒ›แƒ”แƒšแƒ—แƒแƒ’แƒแƒœ แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ—แƒ˜ แƒ›แƒ“แƒ”แƒ‘แƒแƒ แƒ”แƒแƒ‘แƒก แƒแƒ—แƒแƒกแƒแƒ‘แƒ˜แƒ— แƒ™แƒ˜แƒšแƒแƒ›แƒ”แƒขแƒ แƒ˜แƒก แƒ“แƒแƒจแƒแƒ แƒ”แƒ‘แƒ˜แƒ—, แƒแƒ› แƒฎแƒ”แƒšแƒกแƒแƒฌแƒงแƒแƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒชแƒแƒขแƒ แƒ›แƒแƒกแƒแƒฌแƒงแƒ”แƒœแƒ˜ แƒ˜แƒงแƒ.

แƒแƒฅ แƒฃแƒœแƒ“แƒ แƒ•แƒแƒฆแƒ˜แƒแƒ แƒ, แƒ แƒแƒ› แƒฉแƒ”แƒ›แƒ˜ แƒ’แƒแƒฃแƒ แƒ™แƒ•แƒ”แƒ•แƒšแƒแƒ‘แƒ, แƒกแƒแƒ•แƒแƒ แƒแƒฃแƒ“แƒแƒ“, แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒก แƒ˜แƒ›แƒแƒจแƒ˜, แƒ แƒแƒ› แƒแƒ  แƒ•แƒ˜แƒชแƒœแƒแƒ‘ แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ›แƒ’แƒ”แƒ‘แƒ”แƒšแƒ˜แƒ•แƒ˜แƒ“แƒ แƒ” แƒ›แƒ˜แƒก แƒœแƒแƒ™แƒšแƒแƒ•แƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒจแƒ˜. แƒ“แƒ แƒ”แƒก, แƒกแƒฎแƒ•แƒแƒ—แƒ แƒจแƒแƒ แƒ˜แƒก, แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜ แƒžแƒฃแƒœแƒฅแƒขแƒ˜แƒ. แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ›แƒ’แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒแƒ แƒ˜แƒก แƒกแƒ แƒฃแƒšแƒ˜แƒแƒ“ แƒ’แƒแƒœแƒชแƒแƒšแƒ™แƒ”แƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜, แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒชแƒแƒ“แƒœแƒ˜แƒก แƒกแƒคแƒ”แƒ แƒ แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ DSL (แƒ“แƒแƒ›แƒ”แƒœแƒ˜แƒก แƒกแƒžแƒ”แƒชแƒ˜แƒคแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ”แƒœแƒ), แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒ“แƒแƒชแƒฃแƒšแƒ˜ แƒ—แƒแƒ•แƒ“แƒแƒฏแƒ”แƒ แƒ”แƒ‘แƒฃแƒš แƒ“แƒแƒœแƒ”แƒ–แƒ”. แƒ˜แƒกแƒ”, แƒ˜แƒ› แƒ›แƒแƒ›แƒ”แƒœแƒขแƒจแƒ˜ แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ›แƒ’แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ˜แƒก แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒกแƒฌแƒ แƒแƒคแƒแƒ“ แƒ•แƒ˜แƒ—แƒแƒ แƒ“แƒ”แƒ‘แƒ แƒ“แƒ แƒฉแƒแƒ›แƒแƒ แƒฉแƒ”แƒœแƒ˜แƒšแƒ˜ แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒแƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒกแƒแƒ™แƒฃแƒ—แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ’แƒแƒ—แƒ•แƒแƒšแƒ˜แƒกแƒฌแƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”, แƒ˜แƒก แƒแƒ  แƒ›แƒแƒขแƒ”แƒ‘แƒก แƒœแƒ“แƒแƒ‘แƒแƒก.

แƒแƒ›แƒ˜แƒขแƒแƒ›, แƒแƒ แƒช แƒ˜แƒกแƒ” แƒ“แƒ˜แƒ“แƒ˜ แƒฎแƒœแƒ˜แƒก แƒฌแƒ˜แƒœ แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ“แƒ แƒ•แƒ”แƒšแƒแƒกแƒ˜แƒžแƒ”แƒ“แƒ˜แƒก แƒ›แƒ”แƒแƒ แƒ” แƒ•แƒ”แƒ แƒกแƒ˜แƒ. แƒแƒ›แƒฏแƒ”แƒ แƒแƒ“ แƒžแƒ˜แƒ—แƒแƒœแƒ˜, แƒฃแƒคแƒ แƒ แƒกแƒฌแƒแƒ แƒแƒ“ แƒฉแƒแƒฌแƒ”แƒ แƒ˜แƒš แƒฉแƒแƒ แƒฉแƒแƒ–แƒ” แƒžแƒ˜แƒ—แƒแƒœแƒ˜ แƒ“แƒ แƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒžแƒ˜แƒ—แƒแƒœแƒ˜ แƒ›แƒแƒฃแƒฌแƒแƒ“แƒ แƒœแƒแƒ แƒœแƒ˜แƒ แƒ˜

แฒ˜แƒกแƒ” - แƒœแƒแƒ แƒœแƒ˜แƒ แƒ˜ แƒแƒ แƒ˜แƒก แƒ›แƒ˜แƒ™แƒ แƒแƒฉแƒแƒ แƒฉแƒแƒจแƒ˜ แƒฉแƒแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒžแƒ˜แƒ—แƒแƒœแƒ˜ แƒ“แƒ แƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒžแƒ˜แƒ—แƒแƒœแƒ˜ แƒ“แƒ แƒ’แƒแƒœแƒ™แƒฃแƒ—แƒ•แƒœแƒ˜แƒšแƒ˜แƒ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ˜แƒ’แƒ˜แƒ•แƒ”, แƒ แƒแƒช แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ›แƒ’แƒ”แƒ‘แƒ”แƒšแƒ˜, แƒแƒฅ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ“แƒแƒกแƒแƒญแƒ แƒ”แƒšแƒแƒ“ แƒกแƒแƒญแƒ˜แƒ แƒแƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ™แƒแƒ›แƒžแƒ”แƒขแƒ”แƒœแƒขแƒฃแƒ แƒ˜ แƒ›แƒแƒ›แƒ–แƒแƒ“แƒ”แƒ‘แƒ, แƒ”.แƒ˜. แƒฐแƒแƒกแƒขแƒ”แƒ‘แƒ˜แƒก แƒ˜แƒœแƒ•แƒ”แƒœแƒขแƒแƒ แƒ˜ แƒ“แƒ แƒ›แƒแƒ—แƒ˜ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒ˜ แƒ˜แƒฌแƒ”แƒ แƒ”แƒ‘แƒ แƒแƒ แƒ แƒชแƒแƒšแƒ™แƒ” DSL-แƒจแƒ˜, แƒแƒ แƒแƒ›แƒ”แƒ“ แƒ˜แƒ›แƒแƒ•แƒ” แƒแƒ แƒช แƒ—แƒฃ แƒ˜แƒกแƒ” แƒซแƒ•แƒ”แƒš, แƒ›แƒแƒ’แƒ แƒแƒ› แƒซแƒแƒšแƒ˜แƒแƒœ แƒ™แƒแƒ แƒ’ p[i|i]ton-แƒจแƒ˜.

แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒ แƒแƒก แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒชแƒแƒชแƒฎแƒแƒšแƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

แƒ›แƒ” แƒ›แƒแƒฅแƒ•แƒก แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ”แƒ‘แƒ˜แƒก แƒฅแƒกแƒ”แƒšแƒ˜ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒแƒ—แƒ”แƒฃแƒšแƒ˜ แƒแƒคแƒ˜แƒกแƒ˜แƒ— แƒ›แƒ—แƒ”แƒšแƒ˜ แƒฅแƒ•แƒ”แƒงแƒœแƒ˜แƒก แƒ›แƒแƒกแƒจแƒขแƒแƒ‘แƒ˜แƒ—. แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒš แƒแƒคแƒ˜แƒกแƒก แƒแƒฅแƒ•แƒก WAN แƒ แƒแƒฃแƒขแƒ”แƒ แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฌแƒงแƒ•แƒ”แƒขแƒก แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒกแƒแƒ™แƒแƒ›แƒฃแƒœแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒแƒ แƒฎแƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒกแƒ’แƒแƒœ. แƒ›แƒแƒ แƒจแƒ แƒฃแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜ แƒแƒ แƒ˜แƒก BGP. WAN แƒ›แƒแƒ แƒจแƒ แƒฃแƒขแƒ˜แƒ–แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜ แƒแƒ แƒ˜ แƒขแƒ˜แƒžแƒ˜แƒกแƒแƒ: Cisco ISG แƒแƒœ Juniper SRX.

แƒแƒฎแƒšแƒ แƒแƒ›แƒแƒชแƒแƒœแƒ: แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒแƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒ˜แƒ แƒแƒ— แƒ’แƒแƒ›แƒแƒงแƒแƒคแƒ˜แƒšแƒ˜ แƒฅแƒ•แƒ”แƒฅแƒกแƒ”แƒšแƒ˜ แƒ•แƒ˜แƒ“แƒ”แƒ แƒ›แƒ”แƒ—แƒ•แƒแƒšแƒงแƒฃแƒ แƒ”แƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒชแƒแƒšแƒ™แƒ” แƒžแƒแƒ แƒขแƒ–แƒ” แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ˜แƒก แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ WAN แƒ›แƒแƒ แƒจแƒ แƒฃแƒขแƒ˜แƒ–แƒแƒขแƒแƒ แƒ–แƒ” - แƒ’แƒแƒœแƒแƒ—แƒแƒ•แƒกแƒ”แƒ— แƒ”แƒก แƒฅแƒ•แƒ”แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒ แƒ”แƒ™แƒšแƒแƒ›แƒ BGP-แƒจแƒ˜ - แƒ“แƒแƒแƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒ˜แƒ แƒ”แƒ— แƒ’แƒแƒ›แƒแƒงแƒแƒคแƒ˜แƒšแƒ˜ แƒžแƒแƒ แƒขแƒ˜แƒก แƒกแƒ˜แƒฉแƒฅแƒแƒ แƒ˜แƒก แƒšแƒ˜แƒ›แƒ˜แƒขแƒ˜.

แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜, แƒฉแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ›แƒแƒ•แƒแƒ›แƒ–แƒแƒ“แƒแƒ— แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒจแƒแƒ‘แƒšแƒแƒœแƒ˜, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒกแƒแƒคแƒฃแƒซแƒ•แƒ”แƒšแƒ–แƒ”แƒช แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒชแƒแƒš-แƒชแƒแƒšแƒ™แƒ” แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ Cisco-แƒกแƒ แƒ“แƒ Juniper-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒแƒกแƒ”แƒ•แƒ” แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒฌแƒ”แƒ แƒขแƒ˜แƒšแƒ˜แƒกแƒ แƒ“แƒ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ›แƒ–แƒแƒ“แƒ”แƒ‘แƒ, แƒ”.แƒ˜. แƒจแƒ”แƒแƒ’แƒ แƒแƒ•แƒ”แƒ— แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒ˜แƒœแƒ•แƒ”แƒœแƒขแƒแƒ แƒ˜

แƒ›แƒ–แƒ แƒจแƒแƒ‘แƒšแƒแƒœแƒ˜ 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-แƒกแƒ—แƒ•แƒ˜แƒก. แƒแƒ˜ แƒ˜แƒกแƒ˜แƒœแƒ˜:

  • แƒ—แƒฃ แƒกแƒแƒฎแƒ”แƒšแƒ˜
  • แƒ˜แƒคแƒกแƒฃแƒคแƒ˜แƒฅแƒกแƒ˜
  • แƒแƒกแƒœ

แƒแƒฎแƒšแƒ แƒฉแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ•แƒแƒงแƒ”แƒœแƒแƒ— แƒ”แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ”.แƒ˜. แƒ’แƒแƒแƒ™แƒ”แƒ—แƒ” แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒ˜แƒœแƒ•แƒ”แƒœแƒขแƒแƒ แƒ˜.

แƒ˜แƒงแƒ˜แƒ“แƒ”แƒ‘แƒ แƒ˜แƒœแƒ•แƒ”แƒœแƒขแƒแƒ แƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ›แƒ™แƒแƒชแƒ แƒแƒ“ แƒ“แƒแƒ•แƒ˜แƒชแƒแƒ•แƒ— แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒแƒก Nornir-แƒ˜แƒก แƒ˜แƒœแƒ˜แƒชแƒ˜แƒ แƒ”แƒ‘แƒ

แƒแƒœแƒฃ, แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒฉแƒแƒœแƒฉแƒฎแƒ˜:

.
โ”œโ”€โ”€ 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"

แƒฉแƒ•แƒ”แƒœ แƒ›แƒ˜แƒ•แƒฃแƒ—แƒ˜แƒ—แƒ”แƒ‘แƒ— แƒ›แƒ—แƒแƒ•แƒแƒ  แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒก แƒคแƒแƒ˜แƒšแƒจแƒ˜ แƒ›แƒแƒกแƒžแƒ˜แƒœแƒซแƒšแƒ”แƒ‘แƒ˜.yaml, แƒ“แƒแƒฏแƒ’แƒฃแƒคแƒ”แƒ‘แƒ (แƒฉแƒ”แƒ›แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒ”แƒก แƒแƒ แƒ˜แƒก แƒจแƒ”แƒกแƒ•แƒšแƒ/แƒžแƒแƒ แƒแƒšแƒ”แƒ‘แƒ˜) in แƒฏแƒ’แƒฃแƒคแƒ”แƒ‘แƒ˜.yamlแƒ“แƒ แƒœแƒแƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒ˜.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

แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ˜แƒก, แƒ แƒแƒช แƒ›แƒแƒฎแƒ“แƒ แƒ˜แƒœแƒ•แƒ”แƒœแƒขแƒแƒ แƒ˜ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒแƒ›แƒแƒชแƒแƒœแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ˜แƒœแƒ˜แƒชแƒ˜แƒแƒšแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒ“แƒ แƒแƒก, แƒ˜แƒœแƒ•แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒ“แƒแƒœ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜ แƒแƒกแƒแƒฎแƒฃแƒšแƒ˜แƒ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜แƒก แƒ›แƒแƒ“แƒ”แƒšแƒ–แƒ” แƒ˜แƒœแƒ•แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ˜.

แƒกแƒžแƒแƒ˜แƒšแƒ”แƒ แƒ˜แƒก แƒฅแƒ•แƒ”แƒ›แƒแƒ— แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜แƒ 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"
                }
            }
        }
    }
}

แƒ”แƒก แƒ›แƒแƒ“แƒ”แƒšแƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒชแƒแƒขแƒ แƒ“แƒแƒ›แƒแƒ‘แƒœแƒ”แƒ•แƒ”แƒšแƒ˜ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒแƒ“แƒ”แƒก, แƒ’แƒแƒœแƒกแƒแƒ™แƒฃแƒ—แƒ แƒ”แƒ‘แƒ˜แƒ— แƒ—แƒแƒ•แƒ˜แƒ“แƒแƒœ. แƒแƒ›แƒ˜แƒก แƒ’แƒแƒกแƒแƒ แƒ™แƒ•แƒ”แƒ•แƒแƒ“, แƒจแƒ”แƒ“แƒ˜แƒ— แƒ˜แƒœแƒขแƒ”แƒ แƒแƒฅแƒขแƒ˜แƒฃแƒš แƒ แƒ”แƒŸแƒ˜แƒ›แƒจแƒ˜ แƒ˜แƒžแƒ˜แƒ—แƒแƒœแƒ˜.

 $ 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-แƒจแƒ˜) , แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒแƒ  แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ. แƒกแƒแƒ‘แƒ แƒซแƒแƒšแƒ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒแƒ›แƒแƒ˜แƒฆแƒแƒ— แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜ แƒ›แƒจแƒ แƒแƒšแƒ˜_แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ แƒแƒœ แƒจแƒ”แƒชแƒ•แƒแƒšแƒ”แƒ— แƒ›แƒ˜แƒกแƒ˜ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ แƒงแƒแƒšแƒ‘แƒ˜.

แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ, Nornir แƒ’แƒแƒ›แƒแƒกแƒชแƒ”แƒ›แƒก แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ  แƒŸแƒฃแƒ แƒœแƒแƒšแƒ”แƒ‘แƒก แƒ™แƒแƒœแƒกแƒแƒšแƒจแƒ˜.

แƒกแƒžแƒแƒ˜แƒšแƒ”แƒ แƒ˜แƒก แƒฅแƒ•แƒ”แƒ›แƒแƒ— แƒแƒ แƒ˜แƒก แƒกแƒแƒ‘แƒ แƒซแƒแƒšแƒ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜ แƒแƒ  แƒกแƒแƒขแƒ”แƒกแƒขแƒ แƒ›แƒแƒ แƒจแƒ แƒฃแƒขแƒ˜แƒ–แƒแƒขแƒแƒ แƒ–แƒ”:

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-แƒ–แƒ” แƒ“แƒ แƒ“แƒแƒ•แƒจแƒ˜แƒคแƒ แƒแƒ— แƒ˜แƒ’แƒ˜ 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

แƒ”แƒก แƒแƒกแƒ” แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ. แƒ แƒฉแƒ”แƒ‘แƒ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒกแƒฌแƒแƒ•แƒšแƒ”แƒ‘แƒ แƒœแƒแƒ แƒœแƒ˜แƒ แƒ˜-แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜ แƒแƒ› แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒกแƒแƒฆแƒ”แƒ‘แƒแƒ“ แƒ“แƒ แƒ’แƒแƒ›แƒแƒกแƒแƒงแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ“.
แƒแƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก แƒฉแƒ•แƒ”แƒœแƒก แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒจแƒ˜ แƒ˜แƒœแƒ˜แƒชแƒ˜แƒแƒšแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒฎแƒแƒ–แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ 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

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ