vmxも試してた流れで、今日は、junos用のpythonライブラリを味見。
ubuntu18側で、
pip3 install junos-eznc
vMX側で、
root# set system services netconf ssh [edit] root# set system login user admin authentication plain-text-password New password: Retype new password: [edit] root# set system login user admin class super-user [edit]
まずHello worldライクに、python インタプリタからルータにアクセス・情報参照
root@BirdRouter:~# python3 Python 3.6.8 (default, Oct 7 2019, 12:59:55) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from jnpr.junos import Device >>> from pprint import pprint >>> r0 = Device(host='172.31.2.1',user='admin',password=himitsu) >>> r0.open() Device(172.31.2.1) >>> pprint(r0.facts) {'2RE': False, 'HOME': '/var/home/admin', 'RE0': {'last_reboot_reason': 'Router rebooted after a normal shutdown.', 'mastership_state': 'master', 'model': 'RE-VMX', 'status': 'OK', 'up_time': '1 day, 23 hours, 21 minutes, 30 seconds'}, 'RE1': None, 'RE_hw_mi': False, 'current_re': ['re0', 'master', 'node', 'fwdd', 'member', 'pfem'], 'domain': None, 'fqdn': '', 'hostname': '', 'hostname_info': {'re0': ''}, 'ifd_style': 'CLASSIC', 'junos_info': {'re0': {'object': junos.version_info(major=(17, 1), type=R, minor=1, build=8), 'text': '17.1R1.8'}}, 'master': 'RE0', 'model': 'VMX', 'model_info': {'re0': 'VMX'}, 'personality': 'MX', 're_info': {'default': {'0': {'last_reboot_reason': 'Router rebooted after a ' 'normal shutdown.', 'mastership_state': 'master', 'model': 'RE-VMX', 'status': 'OK'}, 'default': {'last_reboot_reason': 'Router rebooted ' 'after a normal ' 'shutdown.', 'mastership_state': 'master', 'model': 'RE-VMX', 'status': 'OK'}}}, 're_master': {'default': '0'}, 'serialnumber': 'VM**********', 'srx_cluster': None, 'srx_cluster_id': None, 'srx_cluster_redundancy_group': None, 'switch_style': 'BRIDGE_DOMAIN', 'vc_capable': False, 'vc_fabric': None, 'vc_master': None, 'vc_mode': None, 'version': '17.1R1.8', 'version_RE0': '17.1R1.8', 'version_RE1': None, 'version_info': junos.version_info(major=(17, 1), type=R, minor=1, build=8), 'virtual': True} >>>
open()を忘れると:-p
(まず参照系?)xMXでのcliコマンド実行と同じ結果を得るには、まずそのrcpコマンド名を取得する。返ってくるxmlエレメント名で-を_に置き換えたのが、Device.rpcのメソッドになっている模様。
show route table inet.0を実行してみるなら
>>> print (r0.display_xml_rpc('show route table inet.0', format='text')) <get-route-information><table>inet.0</table></get-route-information> >>> e=r0.rpc.get_route_information(table='inet.0')
eが
>>> from lxml import etree >>> type(e) <class 'lxml.etree._Element'> >>> for c in e: print(e.tag) ... route-information route-information
pingも実行できたりした。
>>> print (r0.display_xml_rpc('ping 172.31.1.100', format='text')) <ping><host>172.31.1.100</host></ping> >>> a=r0.rpc.ping(host='172.31.1.100') >>> print(etree.tostring(a)) b'<ping-results><target-host>\n172.31.1.100\n</target-host><target-ip>\n172.31.1.100\n</target-ip><packet-size>\n56\n</packet-size><probe-result date-determined="1571102089"><probe-index>\n1\n</probe-index><probe-success/><sequence-number>\n0\n</sequence-number><ip-address>\n172.31.1.100\n</ip-address><time-to-live>\n64\n</time-to-live><response-size>\n64\n</response-size><rtt>\n1493\n</rtt></probe-result><probe-results-summary><probes-sent>\n1\n</probes-sent><responses-received>\n1\n</responses-received><packet-loss>\n0\n</packet-loss><rtt-minimum>\n1493\n</rtt-minimum><rtt-maximum>\n1493\n</rtt-maximum><rtt-average>\n1493\n</rtt-average><rtt-stddev>\n0\n</rtt-stddev></probe-results-summary><ping-success/></ping-results>'
- 今現在で、python3で利用可能
- スクリプトからのアクセスには、ssh 鍵認証にするのがいい感じなのかも
- configを流し込むとかは、もっとドキュメント読んでいく必要あり