Device

Deviceサービスは、CLIプロキシやNETCONFプロキシの制御対象となるネットワーク機器やサーバのエンドポイントを管理する機能です。
Deviceには、単一の制御エンドポイント(simplex device)と複数の制御エンドポイント(complex device)を表現する2種類の概念があります。

Deviceの定義項目

属性 概要 備考
alias Deviceをユニークに識別する名前を指定します。 -
class Deviceエンドポイントの種別を指定します。 simplexcomplexのいづれかを指定します。デフォルトは、simplexです。
host DeviceのIPアドレスを指定します。 simplexの場合のみ指定する必要があります。
port Deviceの制御ポート番号を指定します。 デフォルトは、23 TELNETポートです。simplexの場合のみ指定する必要があります。
username Deviceを制御するユーザ名を指定します。 simplexの場合のみ指定する必要があります。
password Deviceを制御するユーザのパスワードを指定します。 simplexの場合のみ指定する必要があります。
secret Deviceを制御するユーザのシークレットパスワードを指定します。 simplexの場合のみ指定する必要があります。
device Deviceの種別を指定します。 サポートされている種別は、cisco_ios cisco_xe cisco_asa cisco_nxos cisco_xr arista_eos hp_procurve hp_comware juniper juniper_junos linuxのいづれかです。simplexの場合のみ指定する必要があります。
options SSH等に関する各種パラメータを指定します。 simplexの場合のみ指定することができます。CLIプロキシではnetmiko(https://github.com/ktbyers/netmiko)を使用しているため、これらのパラメータはnetmikoライブラリに指定されるパラメータです。
parameters Device固有のメタ情報を指定します。 CLIプロキシのコマンドテンプレートやNETCONFプロキシのXMLテンプレートへのレンダリングに使用できます。
aliases 包含するDeviceのaliasを列挙します。 complexの場合のみ指定することができます。
role Deviceのロールを指定します。 ロールには、CLIプロキシを紐付けすることができます。Deviceにロールを指定するとロールに関連付けられたCLIプロキシやNETCONFプロキシの呼び出し処理がDeviceのメソッドとして実装されます。Deviceロールについては、Docs » Lambda » Deviceロールを参考にしてください。

Note

optionsのパラメータ、デフォルト設定は以下の通りです。

パラメータ デフォルト
verbose False
global_delay_factor 1
use_keys False
key_file None
ssh_strict False
system_host_keys False
alt_host_keys False
alt_key_file None
timeout 20


Deviceロールの割付例

Docs » Lambda » CLIプロキシのチュートリアルで作成したCLIプロキシを使ってDeviceロールをDeviceに付与した場合の動作を見てみましょう。
最初にDeviceロールを作成します。

role: sampleRole
actions:
  - southbound_api_path: /showVersion
    tag: showVersion
  - southbound_api_path: /config
    tag: setInterface


作成したDeviceロールをDeviceに付与します。

alias: csr1000v
class: simplex
device: cisco_ios
host: 192.168.2.200
port: '22'
username: qmonus
password: qmonus
secret: qmonus
role: sampleRole
parameters: {}


ロールを付与したDeviceは、ロールに関連付けられたCLIプロキシをメソッドとして利用することができます。

>>> device = await Device.load("csr1000v")↵
... r = await device.showVersion()↵
... ↵
Connecting...
Done.
csr1000v#
show ver | inc (Cisco IOS XE Software, Version)
Cisco IOS XE Software, Version 03.15.00.S - Standard Support Release
csr1000v#

Qmonus> version = '03.15.00.S'
↵
disable
csr1000v>

Disconnecting...
Done.
>>> print(r.output.bindings.version)↵
... ↵
↵
03.15.00.S
>>> print(r.yaml_format)↵
... ↵
↵
code: 200
output:
  bindings:
    $alias: csr1000v
    $host: 192.168.2.200
    $password: qmonus
    $port: '22'
    $secret: qmonus
    $username: qmonus
    version: 03.15.00.S
  message: null
  responses:
  - |-
    show ver | inc (Cisco IOS XE Software, Version)
    Cisco IOS XE Software, Version 03.15.00.S - Standard Support Release
    csr1000v#
  status: Complete
>>> r = await device.setInterface(iface="GigabitEthernet3", address="172.16.100.1", netmask="255.255.255.0")↵
... ↵
Connecting...
Done.
csr1000v#
config term
Enter configuration commands, one per line.  End with CNTL/Z.
csr1000v(config)#
interface GigabitEthernet3
csr1000v(config-if)#
ip address 172.16.100.1 255.255.255.0
csr1000v(config-if)#
no shutdown
csr1000v(config-if)#
do show ip interface brief | inc GigabitEthernet3
GigabitEthernet3       172.16.100.1    YES manual up                    up      
csr1000v(config-if)#

Qmonus> status = 'up'
↵
disable
csr1000v>

Disconnecting...
Done.
>>> print(r.yaml_format)↵
... ↵
↵
code: 200
output:
  bindings:
    $alias: csr1000v
    $host: 192.168.2.200
    $password: qmonus
    $port: '22'
    $secret: qmonus
    $username: qmonus
    address: 172.16.100.1
    iface: GigabitEthernet3
    netmask: 255.255.255.0
    status: up
  message: null
  responses:
  - |-
    interface GigabitEthernet3
    csr1000v(config-if)#
  - |-
    ip address 172.16.100.1 255.255.255.0
    csr1000v(config-if)#
  - |-
    no shutdown
    csr1000v(config-if)#
  - "do show ip interface brief | inc GigabitEthernet3\nGigabitEthernet3       172.16.100.1\
    \    YES manual up                    up      \ncsr1000v(config-if)#"
  status: Complete
>>>


Deviceロールの継承について

ロールの継承は、super_roleに上位のロールを指定することで実現できます。
最初に上位のロールを作成しましょう。

role: parentRole
actions:
  - southbound_api_path: /showVersion
    tag: showVersion


作成した上位のロールをsuper_roleに指定して子のロールを作成します。

role: childRole
super_role: parentRole
actions:
  - southbound_api_path: /config
    tag: setInterface


子のロールをDeviceに付与します。

alias: csr1000v
class: simplex
device: cisco_ios
host: 192.168.2.200
password: qmonus
port: '22'
role: childRole
secret: qmonus
username: qmonus
parameters: {}


ロールからDeviceに実装されたメソッドは、actionsプロパティで参照できます。
setInterfaceは、childRoleから実装され、showVersionは、parentRoleから継承実装されていることが確認できます。

>>> d = await Device.load("csr1000v")↵
... print(d.actions)↵
... ↵
↵
setInterface:
  inherit: false
  path: /config
  schema: |
    properties:
      address:
        anyOf:
        - type: boolean
        - type: 'null'
        - type: number
        - type: string
        title: address
      iface:
        anyOf:
        - type: boolean
        - type: 'null'
        - type: number
        - type: string
        title: iface
      netmask:
        anyOf:
        - type: boolean
        - type: 'null'
        - type: number
        - type: string
        title: netmask
    required:
    - address
    - iface
    - netmask
    type: object
showVersion:
  inherit: true
  path: /showVersion
  schema: |
    properties: {}
    type: object
>>>