naoki86star

インターネットの片隅でなにかしら書いてみる

junos-eznc

 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がとなっている。xmlのコンテナ。lxmlというモジュールに慣れると吉。

>>> 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を流し込むとかは、もっとドキュメント読んでいく必要あり

Junos PyEZ Developer Guide
The lxml.etree Tutorial