NETCONF/YANG を使って、Ciscoルータのコンフィグ（hostname）を設定する(IOS-XE)

#何がやりたい？
NETCONF/YANGを使ってネットワーク機器の設定を変更する。
今回は、ホスト名を変更してみることで、コンフィグの書き換え部分の動作を確認する。

実際には、ホスト名だけでなく、他の色々な設定を変更したいと思います。その際に設定したい内容が、どのようにYANGモデルに対応させてスクリプトに記述すれば良いかを確認するには、今の設定をYANGモデルとして取得しておき、それから反映させたい内容を実際のルータに設定します。それから、もう一度、設定をYANGモデルとして取得して、先ほどの内容と差分を見れば簡単に確認できます。

##確認したいポイント

ここでは、ホスト名を``CSR1kv_R1``に変更していますので、他の値にも変更して試してください。

また、下記に設定を取得する際のpayloadを記載しますので、設定の書き換えと比較してください。

```python:get_config.py
payload = """
<filter xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native"/>
</filter>
"""
```

##スクリプト本体

```python:edit_hostname_CSR1kv_R1.py
#!/usr/bin/env python

from ncclient import manager
from xml.dom import minidom
import lxml.etree as ET
import xmltodict
import json

payload = """
<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native">
    <hostname>CSR1kv_R1</hostname>
  </native>
</config>
"""

# connect to netconf agent
m = manager.connect(host='172.16.62.152', port=830, username='cisco', password='cisco', hostkey_verify=False, device_params={'name': 'iosxe'})

#response = m.get_config(source='running', filter=payload)
print '###########################################################################'
print '### XML'
print '###########################################################################'
response = m.edit_config(target='running', config=payload).xml
print response

print '###########################################################################'
print '### XML Formatstring'
print '###########################################################################'
data = ET.fromstring(response)
print(ET.tostring(data, pretty_print=True))

print '###########################################################################'
print '### Convert to Dictionary'
print '###########################################################################'
data_dict = xmltodict.parse(response)
print(data_dict)

print '###########################################################################'
print '### Convert to JSON'
print '###########################################################################'
data_jason = json.dumps(data_dict, indent=4)
print(data_jason)

```

##スクリプトを実行した結果

```xml:XML
###########################################################################
### XML
###########################################################################
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="urn:uuid:834943c4-50c6-4c2e-be9e-a41a8e7a447b" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"><ok/></rpc-reply>
```

```xml:XML(Formatstring)
###########################################################################
### XML Formatstring
###########################################################################
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="urn:uuid:834943c4-50c6-4c2e-be9e-a41a8e7a447b">
  <ok/>
</rpc-reply>
```

```python:Dictionary
###########################################################################
### Convert to Dictionary
###########################################################################
OrderedDict([(u'rpc-reply', OrderedDict([(u'@xmlns', u'urn:ietf:params:xml:ns:netconf:base:1.0'), (u'@message-id', u'urn:uuid:834943c4-50c6-4c2e-be9e-a41a8e7a447b'), (u'@xmlns:nc', u'urn:ietf:params:xml:ns:netconf:base:1.0'), (u'ok', None)]))])
```

```json:JSON
###########################################################################
### Convert to JSON
###########################################################################
{
    "rpc-reply": {
        "@xmlns": "urn:ietf:params:xml:ns:netconf:base:1.0", 
        "@message-id": "urn:uuid:834943c4-50c6-4c2e-be9e-a41a8e7a447b", 
        "@xmlns:nc": "urn:ietf:params:xml:ns:netconf:base:1.0", 
        "ok": null
    }
}
```