เชนเซ เชนเชฌเชฐ!
เชคเชพเชเซเชคเชฐเชฎเชพเช เชเช เชฒเซเช เช
เชนเซเช เชชเซเชช เช
เชช
เชเชตเชพ เชเชพเชฐเซเชฏ เชฎเชพเชเซ เช เชชเชนเซเชฒเซ เชฌเชพเชเช เชจเชฅเซ. เชชเซเชฐเชฅเชฎ เชตเชฟเชเชฒเซเชช เชเชฃเชพ เชตเชฐเซเชทเซ เชชเชนเซเชฒเชพ เช เชฎเชฒเชฎเชพเช เชเชตเซเชฏเซ เชนเชคเซ เชเชตเชพเชฌเชฆเชพเชฐ เชธเชเชธเซเชเชฐเชฃ 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