ネットワーク機器の操作を自動化する 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 をインストールしておきます。
| dnf install -y python39
alternatives --set python /usr/bin/python3.9
|
scrapli のインストール
scrapli をインストールします。 今回は venv 環境下にインストールしました。
| 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()
|
実行例
| # 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()
|
実行例
| # 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()
|
実行例
| # 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
ファイルの例は以下の通りです。
| Host 10.0.0.1
Hostname 10.0.0.1
Port 22
User admin
IdentityFile ~/.ssh/id_rsa
|
実行例
| # 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()
|
実行例
| # 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()
|
実行例
| # python sample.py
interface loopback123
description configured by scrapli
|