Skip to content

ネットワーク機器の操作を自動化する scrapli の基本的な使い方

scrapli はネットワーク機器へ TELNET や SSH などを実行し、制御を自動化するのに利用出来るライブラリです。 今回は scrapli の基本的な使い方をメモしておきます。 自動化の対象は CML2 上に作成した CSR1000v としました。

  • scrapli
    • https://github.com/carlmontanari/scrapli
    • https://carlmontanari.github.io/scrapli/
    • https://developer.cisco.com/codeexchange/github/repo/carlmontanari/scrapli/

Python3 のインストール

scrapli は Python のライブラリである為、Python3 をインストールしておきます。

1
2
dnf install -y python39
alternatives --set python /usr/bin/python3.9

scrapli のインストール

scrapli をインストールします。 今回は venv 環境下にインストールしました。

1
2
3
4
5
6
mkdir test
cd test
python -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install scrapli

ネットワーク機器の用意

CML2 上の CSR1000v は以下のコンフィグを設定しました。 (PUBLIC-KEY) には公開鍵を指定します。 一行が長すぎるとエラーになってしまう為、1 行の文字数は 70 〜 80 文字程度にするのが無難だと思われます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
hostname CSR1000v
!
enable password secret
!
aaa new-model
username admin password password
!
ip domain name example.local
ip ssh version 2
crypto key generate rsa modulus 2048
!
ip ssh pubkey-chain
  username admin
   key-string
(PUBLIC-KEY)
exit
!
interface GigabitEthernet0/0
 ip address 10.0.0.1 255.255.255.0
 no shutdown
!
line vty 0 4
 exec-timeout 300 0
 transport input all
!
end

IP アドレスやログイン情報は以下の通りです。

項目
IP アドレス 10.0.0.1
ユーザ名 admin
パスワード password
enable パスワード secret

サンプル 1. SSH ログインしてコマンドを実行する

対象機器は SSH し、コマンドを 1 つだけ実行するサンプルです。

サンプルスクリプト

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python3

from scrapli import Scrapli

device = {
    "host": "10.0.0.1",
    "auth_username": "admin",
    "auth_password": "password",
    "auth_secondary": "secret",
    "auth_strict_key": False,
    "platform": "cisco_iosxe",
}

conn = Scrapli(**device)
conn.open()
response = conn.send_command("show clock")
print(response.result)
conn.close()

実行例

1
2
# python sample.py
*09:15:40.541 UTC Thu Dec 30 2021

サンプル 2. SSH ログインして複数コマンドを実行する

公式サイトの Sending Commands ページ にサンプルが掲載されていますが、複数コマンドを実行する場合は (send_command では無く) 複数形の send_commands へ実行したいコマンドのリストを指定します。

サンプルスクリプト

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env python3

from scrapli import Scrapli

device = {
    "host": "10.0.0.1",
    "auth_username": "admin",
    "auth_password": "password",
    "auth_secondary": "secret",
    "auth_strict_key": False,
    "platform": "cisco_iosxe",
}

commands = ["show clock", "show users"]

conn = Scrapli(**device)
conn.open()
responses = conn.send_commands(commands)
for response in responses:
    print(response.result)
conn.close()

実行例

1
2
3
4
5
6
# python sample.py
*09:17:42.536 UTC Thu Dec 30 2021
    Line       User       Host(s)              Idle       Location
*  1 vty 0     admin      idle                 00:00:00 10.0.0.100

  Interface    User               Mode         Idle     Peer Address

サンプル 3. 秘密鍵で SSH ログインする

秘密鍵ファイルを指定して SSH ログインするサンプルです。

サンプルスクリプト

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python3

from scrapli import Scrapli

device = {
    "host": "10.0.0.1",
    "auth_username": "admin",
    "auth_private_key": "/home/user/.ssh/id_rsa",
    "auth_secondary": "secret",
    "auth_strict_key": False,
    "platform": "cisco_iosxe",
}

conn = Scrapli(**device)
conn.open()
response = conn.send_command("show clock")
print(response.result)
conn.close()

実行例

1
2
# python sample.py
*09:50:24.889 UTC Thu Dec 30 2021

サンプル 4. config ファイルを指定して SSH する

config ファイルを参照して SSH するサンプルです。

サンプルスクリプト

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/usr/bin/env python3

from scrapli import Scrapli

device = {
    "host": "10.0.0.1",
    "ssh_config_file": "/home/user/.ssh/config",
    "auth_secondary": "secret",
    "auth_strict_key": False,
    "platform": "cisco_iosxe",
}

conn = Scrapli(**device)
conn.open()
response = conn.send_command("show clock")
print(response.result)
conn.close()

/home/user/.ssh/config ファイルの例は以下の通りです。

1
2
3
4
5
Host 10.0.0.1
  Hostname     10.0.0.1
  Port         22
  User         admin
  IdentityFile ~/.ssh/id_rsa

実行例

1
2
# python sample.py
*13:18:34.858 UTC Thu Dec 30 2021

サンプル 5. TELNET する

(SSH では無く) TELNET するサンプルです。

サンプルスクリプト

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python3

from scrapli import Scrapli

device = {
    "host": "10.0.0.1",
    "auth_username": "admin",
    "auth_password": "password",
    "auth_secondary": "secret",
    "platform": "cisco_iosxe",
    "transport": "telnet",
}

conn = Scrapli(**device)
conn.open()
response = conn.send_command("show clock")
print(response.result)
conn.close()

実行例

1
2
# python sample.py
*13:24:22.481 UTC Thu Dec 30 2021

サンプル 6. 設定を追加する

設定を追加するサンプルです。

サンプルスクリプト

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env python3

from scrapli import Scrapli

device = {
    "host": "10.0.0.1",
    "auth_username": "admin",
    "auth_password": "password",
    "auth_secondary": "secret",
    "auth_strict_key": False,
    "platform": "cisco_iosxe",
}

conn = Scrapli(**device)
conn.open()
response = conn.send_configs(
    ["interface loopback123", "description configured by scrapli"]
)
print(response.result)
conn.close()

実行例

1
2
3
# python sample.py
interface loopback123
description configured by scrapli