たそ@ITインフラ初心者

taso@初心者エンジニア

新卒2年目 エンジニアが適当に語るブログてす

Githubで公開用のリポジトリを作成する

こんにちは たそ(@taso_int)です。
もうすぐ3月になります。別れの時期ですね。
ネスぺの勉強は3月から本気出します。()

それなりにブログを書いていますが、少し困ったことがあって
コード類をちゃんとまとめておきたい
私のブログはある程度再現できるようにコードとかをブログ内で書いています。
githubリポジトリとしておいた方がよりいいのではないかと感じました。

現在githubにはプライベートのリポジトリが1つあります。
公開用のものがないので実際に作ってみようと思います。

GitHubにログイン

GithHubにログインしてみます。
1つプライベートのリポジトリがありましたね。
使っていますが、有効活用できてないです…
f:id:taso_int:20220227162710p:plain

公開用を作成してみる

早速作ってみましょう
Recent RepositoriesのNEWを押すと作成ページに行きます。

自分の情報を入れて作成します。
f:id:taso_int:20220227170326p:plain

リポジトリのクローンをする

作成するとURLが生成されるのでcloneをします。
VScodeでgitを利用すると分かりやすく便利です。

pushをしてみる

pushする前にcommitする必要があります。
f:id:taso_int:20220227170356p:plain
VScodeが便利過る。

反映されたか見てみましょう。
f:id:taso_int:20220227170408p:plain 反映されていますね。

今回は以上となります。

GitHub - tasoint/blog: blogの本文やblogのコード類置き場

次からはここにもコードを置くので試したい方はぜひ

Gitの入門書だとこちらがおすすめです。

ansible-navigatorを使う 環境構築編

はじめに

こんにちは たそ(@taso_int)です。
久しぶりです。更新すると言いながら更新できずにすみません。
希望のプロフェッショナル職になり、発信したいのに出来ず…
皆さんAnsibleでPlaybookを実行する時何を打ちますか?
ansible-playbookコマンドですかね。
もしかしたらansible-navigator runかも?
今回はAnsible navigatorについて紹介したいと思います。 長いので3部構成にします。

Ansible navigatorとは?

ここ最近Ansibleの実行環境について新しいアップデートが行われました。

こちらの記事がとても参考になるので時間がある方はぜひ
https://rheb.hatenablog.com/entry/ansible_future_2021_review

簡単に纏めるとAnsibleの実行環境がPythonの仮想環境であるvenvではなく、
コンテナ化(execution environmentと呼ばれる)するようになりました。
そこで前に紹介したansible-builderがコンテナイメージを作成します。

ここでPlaybookの実行するために
Ansible navigatorが登場します。(ようやく名前が出た)

Ansible navigator と Ansible runnerの違い

「おいおい Ansible runnerで実行するんじゃないの?」と
その通りで、Ansible runnerでPlaybookを動かします。
Ansible navigatorは以下の内容ができます。
(触ったばっかりなのでもっと出来ることあると思います)

・collectionやpythonパッケージの管理
・inventoryの管理
・コンテナへ追加の設定
・Playbookの実行
・モジュールのドキュメント閲覧
・リプレイ機能

Ansible navigatorはバックエンドにAnsible runnerを持っており、
Playbookの実行ができます。
またTUI(テキストユーザインタフェース)になっており、CLIより目視で操作ができます。

公式のドキュメントも置いておきます。結構分かりやすいです。
https://access.redhat.com/documentation/ja-jp/red_hat_ansible_automation_platform/2.0-ea/html/ansible_navigator_creator_guide/index

インストールまで

環境
AWS
os:RHEL
m5.large

今回はvenvからインストールをしたいと思います。

venvからpipでインストールします。 やり方(rootで)

python 3.9のインストール
dnf install python39
python3.9 --version ←3.9代がでればOK

venv作成
python3.9 -m venv /opt/venv
source /opt/venv/bin/activate
python --version ←3.9代がでればOK
pip install --upgrade pip
pip install ansible-navigator

rpmからインストール
rpmからインストールするにはライセンスが必要となります。
(AAPをインストールする時と同じ操作)
今回はRed HatさんのRed Hat Developer Programに参加し、
Developer Subscriptionを利用しています。

詳しくはこちらを確認してください。
https://rheb.hatenablog.com/entry/developer-program

やり方(root)で

サブスクリプション登録
subscription-manager register
Registering to: subscription.rhsm.redhat.com:443/subscription
Username: taso_int(サブスクリプションユーザー名)
Password:(パスワード)

リポジトリ有効化
subscription-manager list --available 

Red Hat Ansible Automation Platformが入っているpool値をメモ

subscription-manager attach --pool=<メモしたpool値> 有効になればOK

クラウド環境の場合(リポジトリを引っ張れるように)
subscription-manager config --rhsm.manage_repos=1

subscription-manager repos --enable=ansible-automation-platform-2.1-for-rhel-8-x86_64-rpms

navigatorのインストール
dnf install ansible-navigator

podmanやrunner等もインストールされます。

rpmだとpodman login registry.redhat.ioが必要そうですね rpmだとRedHatさんの公式イメージがあるのでカスタマイズが必要ない限りは公式イメージ(ee)を利用するのが良さげ まあansible-navigatorよりもAAPをインストールした方がいいかも?

build

eeがない場合はbuilderをインストールしてeeを用意してください(地味に手間)
詳しくはbuilderのブログを見てください

taso-int.hatenablog.com

ファイル類だけ補足します。
buildには execution-environment.yml
requirements.txt
requirements.yml (bindep.txt)
が必要になります。

execution-environment.yml

---
version: 1

build_arg_defaults:
  EE_BASE_IMAGE: quay.io/ansible/ansible-runner:latest

dependencies:
  galaxy: requirements.yml
  python: requirements.txt

additional_build_steps:
  prepend: |
    RUN pip3 install --upgrade pip setuptools

requirements.txt

paramiko
netaddr
ansible[azure]

requirements.yml(この書き方でバージョン指定ができる)

---
collections:
  - name: azure.azcollection
    version: 1.11.0
  - name: ansible.utils
    version: 2.4.3
  - name: cisco.ios

navigater.ymlについて

ansible navigatorはansible-navigator.ymlという設定ファイルが必要です。
ここでansible-navigatorの色々な設定が可能となっています。

公式ドキュメントがかなり参考になります。
https://access.redhat.com/documentation/ja-jp/red_hat_ansible_automation_platform/2.0-ea/html/ansible_navigator_creator_guide/index

これについてはまた後で違う記事で書きたいと思います。

今回のansible-navigator.ymlはこんな感じです。

---
ansible-navigator:
  ansible:
    inventories:
      - inventory/hosts/
  execution-environment:
    container-engine: podman
    enabled: true
    image: localhost/blog:latest
  mode: stdout
  playbook-artifact:
    enable: true
    replay: ./log/{playbook_name}/{ts_utc}.json
    save-as: ./log/{playbook_name}/{ts_utc}.json

以上で環境の構築は終わりです。
次は実際にansible-navigatorを動かしたいと思います。

今年もよろしくお願いします。

はじめに

あけおめことよろです。 たそ(@taso_int)です。
2022年になりました。
昨日は2021年の振り返り的なものをしたので、
今年の目標を発表したいと思います。

環境面(仕事)

ここは引き続きテクニカル面とビジネススキルを
高めたいと思っています。
弊社のプロ職になったので、プロという肩書に
負けないように頑張りたいと思います。
登壇も1件出来ればいいなと思ったりしています。
あとはOSSでPRもしたい。

勉強(資格)

資格は次を考えています。
・AZ-104
Cisco Devnet
pythonとネットワークの資格(7月ぐらいにあるらしい)

チャレンジ
CCNP SP(Core)
・ネスぺ

たぶん半年もしたら方針が変わるかもしれませんが基本はこの方針です。
CCNP SPCORは多分時間が足りない気がしています。
ネスぺは午前免除の恩恵を受けれるのでチャレンジ(秋もやってほしい)

あとは競技プログラミングの茶入も目標です。

生活

やせ…る

ブログ

引き続き最低毎月は更新したいと思います。
頻度は落としたくないので定期的に更新したいです。

最後に

今年も頑張っていきます。
がんばるぞい
ここまで読んでいただきありがとうございました。

1年お疲れ様でした。

はじめに

こんにちは たそ(@taso_int)です。
今日で2021年が終わるということで、
軽く1年の振り返りでもしていこうかと思います。

環境面(仕事)

環境面と言えばやっぱり学生から社会人になったことが
大きい変化ですね。
4月から新社会人となり、7月からは本配属で今に至りますね。
自分が志望してた部署に入ることが出来て、
部署のつよつよエンジニアの方々と仕事が出来て嬉しいです。
あとは仕事としてお客様にPlaybook(Ansible)を書いたことが、
自分にとっていい出来事だったなと感じました。

勉強(資格)

資格についてはこんな感じですね。
・LPIC102
python基礎
・基本情報
・応用情報
・Az-900

1年で基本と応用取れたのは凄いなと自分を褒めておきます。
Devnet associate落ちたのが悔しかったです。
ネットワークとクラウドを両立したいです。

生活

あんまりここは変わってないですね。
フルリモートなので前より外出る機会が減った気がします。

ブログ

何だかんだで毎月投稿が出来て良かったです。
来年はもっとアウトプットをしていきたいと思います。
「tasoさんのブログが参考になりました」と言われるのが
夢なので引継ぎ目指します。

最後に

関係者、Twitterのフォロワー、このブログを見ていただいてる方々、
今年はありがとうございました。
来年も引き続きよろしくお願いいたします。
来年の目標は明日書こうかなと思います。

ansible-builder ansible-runner 入門 builder編

はじめに

こんにちは たそ(@taso_int)です。
12月の中旬に差し掛かろうとしています。
年末に積んでる本を消化したいところです。
昨日AZ900無事受かりました。ちょっと不安でしたが8割ぐらいとれてましたね。
ansible-builderとAnsible-runnerについて
キャッチアップの一環で入門的なものを書いていこうと思います。
今回はbuilder編になります。

ansible-builderとanisble-runnerについて

Ansible Automation Platform 2.1(次以降AAP)がリリースされ、
実行環境(execution environment 次以降ee)が
venv(pythonの仮想環境)からコンテナへと変更されました。
そのためeeのコンテナを作成するansible-builderが必要となります。
またコンテナ上でplaybookを実行させるansible-runnerが必要となります。
どの環境でも同じものを動かすことができるコンテナのメリットを採用している
と考えられます。

ドキュメント

builder

ansible-builder.readthedocs.io

runner

ansible-runner.readthedocs.io

環境

AWS RHEL8
python 3.9.6
ansible-builder 1.0.1
ansible-runner 2.1.1
podman 3.3.1

インストール方法

コンテナのツールであるdockerもしくはpodmanが必要になります。
今回はRHELを使用しているのでpodmanをインストールします。

sudo dnf install -y @container-tools 

pipを使ってanisble-builderとanible-runnerをインストールします。

pip install anisble-builder
pip install ansible-runner

これで以上となります。
Ansibleはeeで入れることになるのでインストールは必要ありません。

eeコンテナの作成

インストールし終わったらeeのコンテナの作成をします。
AAPとの連携がわかってないので、フォルダー配置がわかってないです。
コンテナ用のフォルダーを作成します。
フォルダーの構成はこんな感じです。

XXX
├── ansible.cfg # ansible.cfg
├── execution-environment.yml # コンテナの設定ファイル
├── bindep.txt # dnfでインストールする一覧(今回は使わない)
├── requirements.txt # pipでインストールもの一覧
└── requirements.yml # ansible galaxyでインストールするもの一覧

execution-environment.yml

コンテナの設定ファイルになります。
以下が記入例となります。

---
version: 1

build_arg_defaults:
  EE_BASE_IMAGE: 'quay.io/ansible/ansible-runner:stable-2.12-devel'

ansible_config: 'ansible.cfg' # collection をAutomation Hubからもってくるときの認証情報

dependencies:
  galaxy: requirements.yml # galaxyでインストールする一覧
  python: requirements.txt # pipでインストールする一覧
  system: bindep.txt #dnfでインストールする一覧

additional_build_steps: #コンテナを作成でのオプション
  prepend: |
    RUN pip3 install --upgrade pip setuptools
  append:
    - RUN ls -la /etc
    - ENV AZURE_SUBSCRIPTION_ID=""
    - ENV AZURE_CLIENT_ID=""
    - ENV AZURE_SECRET=""
    - ENV AZURE_TENANT=""

軽い解説をしたいと思います。

EE_BASE_IMAGE

これはeeのAnsible環境(2.9~2.12まである)になります。
コンテナイメージレジストリ

quay.io

コンテナイメージレジストリから自分の使いたい環境を引っ張る形になります。
これらのレジストリは更新されてしまうため時間が経つと変化が起こる可能性があります。
そのためイメージのハッシュ値を指定することで、
そのハッシュ値のイメージを変更なしに使用することが可能です。
例 Ansible2.9のハッシュ値を指定

EE_BASE_IMAGE: 'quay.io/ansible/ansible-runner@sha256:14c06cf54c0f9b090d0c189c0eeb76db2a29f3fd630cb272cc9752ce6c21a6e7

そのイメージのAnsibleのバージョンが見たい場合はpodmanで調べることが可能です。

[ec2-user@ip-172-31-22-9 ~]$ podman run -it quay.io/ansible/ansible-runner:stable-2.12-devel ansible --version
ansible [core 2.12.1.post0]
  config file = None
  configured module search path = ['/home/runner/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.8/site-packages/ansible
  ansible collection location = /home/runner/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/bin/ansible
  python version = 3.8.8 (default, Aug 25 2021, 16:13:02) [GCC 8.5.0 20210514 (Red Hat 8.5.0-3)]
  jinja version = 2.10.3
  libyaml = True

ansible.cfg

いつもならplaybookのフォルダーに入れたりしますが、
ここで設定することで置く必要がなくなります。
今回はdiffのcontext(デフォルトは3行)を1行にする設定を入れておきます。
訂正
collectionをAutomation Hubからもってくるときの認証情報を指定するanisble.cfgで、
Ansible自体の設定ではありませんでした。
@akira6592さんありがとうございます。

参考 access.redhat.com

dependencies

dependenciesは指定ファイルに書かれているリストをインストールします。
例 requirements.txt

ansible[azure]
pywinrm
paramiko
netaddr

例 requirements.yml

---
collections:
  - name: azure.azcollection
  - name: ansible.windows
  - name: cisco.ios

additional_build_steps

prependがメインビルドの前、appendはメインビルド後で
追加のコマンドを指定することができます。
今回はAzureのデプロイに関する自動化を実行するので、
サービスプリンシパル(AWSのアクセスシークレットキー的なもの)を環境変数として追加します。

作成する

上記のファイル一式を用意したらeeのコンテナを作成します。

ansible-builder build --t eetest --verbosity 3

runnerの設定でコンテナの名前を指定するので--tagを付けることをお勧めします。
--verbosity 3でコンテナの作成ログを確認することができます。

appendで設定した環境変数が確認できますね。

[3/3] STEP 8/11: ENV AZURE_SUBSCRIPTION_ID=""
[3/3] STEP 9/11: ENV AZURE_CLIENT_ID=""
[3/3] STEP 10/11: ENV AZURE_SECRET=""
[3/3] STEP 11/11: ENV AZURE_TENANT=""
[3/3] COMMIT eetest
Successfully tagged localhost/eetest:latest

podmanでコンテナが作成されているか確認しましょう。

(venv) [ec2-user@ip-172-31-22-9 test]$ podman images
REPOSITORY                       TAG                IMAGE ID      CREATED         SIZE
localhost/eetest                 latest             e0fe27474668  7 minutes ago   1.12 GB
<none>                           <none>             f2555b8fd8dc  9 minutes ago   1.12 GB
<none>                           <none>             e8fea866ba54  11 minutes ago  786 MB
quay.io/ansible/ansible-runner   stable-2.12-devel  f36649c10f20  8 hours ago     763 MB
<none>                           <none>             0ef5110917a3  4 days ago      762 MB
<none>                           <none>             b0e87c7a7760  5 days ago      767 MB
quay.io/ansible/ansible-runner   latest             4284ef892283  5 days ago      762 MB
quay.io/ansible/ansible-builder  latest             6ccdd35188d4  5 days ago      655 MB

作られてはいますがnoneが気になりますね。
コンテナの知識があまりないのでここら辺が分かる方は教えてほしいです。
コンテナの勉強がしたい…
おすすめコンテンツがあれば教えてください。

実行するとcontextというディレクトリが生成されます。
(builderのオプションで生成場所の指定も可能)
そこに今回利用したファイルのバックアップやコンテナファイルが保存されます。

これでeeのコンテナが作れたので次はrunnerでplaybookを実行したいと思います。
こちらはrunner編で解説します。
ここまでお疲れ様でした。

参考ブログ

参考にさせて頂いたブログを紹介します。

zaki-hmkc.hatenablog.com

usage-automate.hatenablog.com

rheb.hatenablog.com

napalmを使ってみた。

始めてに

こんにちは たそ(@taso_int)です。
11月になりました。なんか暑いのか寒いのかわからない気温ですね。
先週母校の学園祭に顔出してきました。
みんな社会人の意識を持ってるなと感じました。
今日はWindows環境でnapalmを使ってCiscoのSandbox上へコマンドを実行します。

napalmとは

napalmとは、Network Automation and Programmability Abstraction Layer with Multivendor support
の略で、ネットワーク機器の設定や情報を取得するためのPythonライブラリです。
Multivendor supportと言われている通り、様々なルータベンダーに対応しております。
ドキュメントはこちら

napalm.readthedocs.io

windowsでvenv環境を作成する

これはnetmikoで紹介したものと同じ手順です。 venvの作成(すでにvenv環境がある場合は作成不要です。)

python -m venv venv

venvのアクティベート

.venv\Scripts\activate.ps1

セキュリティエラーが出る場合は管理者権限でpowerShellを実行し、
以下のコマンドを実行し、スクリプトの実行を許可する(初回のみ)

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force

napalmのインストール

pipのアップグレードおよびnapalmのインストール

pip install --upgrade pip
pip install napalm

napalmのバージョン3.3.1がインストールされ、 その他必要なnetmikoやparamikoなどもインストールされます。

napalmで接続してみる

実際にnapalmで接続をしてみましょう。
コード

from napalm import get_network_driver
# 接続するベンダーの指定 今回はios junosとかを記述
driver = get_network_driver('ios')
# ログイン機器の情報 ホスト名,ユーザー名,パスワードの順で記述
devnet = driver('sandbox-iosxe-latest-1.cisco.com', 'developer' ,'C1sco12345')
# 接続する
devnet.open()

# ネットワーク機器の詳細の取得
ios_output = devnet.get_facts()
print(ios_output)

# ネットワーク機器のインターフェイスについて
ios_output = devnet.get_interfaces()
print(ios_output)

devnet.close()

実行してみましょう。
f:id:taso_int:20211108002028p:plain

実行は出来ましたが、出力表示がイマイチですね。
出力表示を見やすくするにはライブラリを使用して形式を変えましょう。
pprintやjsonを使ってみましょう。

pprintバージョン

from napalm import get_network_driver
# pprintの適応
from pprint import pprint
driver = get_network_driver('ios')
devnet = driver('sandbox-iosxe-latest-1.cisco.com', 'developer' ,'C1sco12345')

devnet.open()

ios_output = devnet.get_facts()
pprint(ios_output)

ios_output = devnet.get_interfaces()
pprint(ios_output)

devnet.close()

結果がこちら だいぶ見やすくなりました。 f:id:taso_int:20211108002101p:plain

jsonバージョン

import json
from napalm import get_network_driver
driver = get_network_driver('ios')
devnet = driver('sandbox-iosxe-latest-1.cisco.com', 'developer' ,'C1sco12345')

devnet.open()

ios_output = devnet.get_facts()
print(json.dumps(ios_output, indent=4))

ios_output = devnet.get_interfaces()
print(json.dumps(ios_output, indent=4))

devnet.close()

結果がこちら Json形式になってますね。
f:id:taso_int:20211108002123p:plain

configの適用

接続ができたら次は設定がしたくなりますね。
loopbackインタフェースを追加してみたいと思います。
コード

from napalm import get_network_driver
from pprint import pprint
driver = get_network_driver('ios')
devnet = driver('sandbox-iosxe-latest-1.cisco.com', 'developer' ,'C1sco12345')

devnet.open()

ios_output = devnet.get_facts()
pprint(ios_output)

# 参照先ファイル名(相対パス)
# 中身
# int loopback 99
# ip add 99.99.99.99 255.255.255.255
devnet.load_merge_candidate(filename='automation\set_loopback.cfg')

ios_output = devnet.get_facts()
pprint(ios_output)

#コンフィグの差分表示
pprint(devnet.compare_config())

#コンフィグの反映
devnet.commit_config()

ios_output = devnet.get_facts()
pprint(ios_output)

devnet.close()

load_templateを使う予定だったのですが参照ファイルが読めずに断念しました。(理由わからず)
代わりとしてload_merge_candidateを利用
設定の変化が見たかったのでget_factsを乱立させました。

結果がこちら
f:id:taso_int:20211108002146p:plain ちょっと見づらいですが、コンフィグの反映を行うまでは設定が反映されてないですね。
commit_config後に反映されています。

以上となります。
napalmは結構Ansibleに似てる気がしますね。今まで触った中では一番似てる感じが、
次はsubprocessかnornirかopenpyxlかのどれかをやります。
ここまで読んでいただきありがとうございました。

Telnetlibを試しに使ってみる。

はじめに

こんにちは たそ(@taso_int)です。
もう2ヶ月で1年が終わっちゃいます。
はやすぎ...
引継ぎアウトプットはしていきたいと思います。
今日はWindows環境でtelnetlibを使いCiscoのrouter上へコマンドを実行します。
本来だとCiscoのSandboxで行いたいのですが、Telnetが使えないので、
手元のルータで実行してみたいと思います。
他に出来そうなのはAWSでのCSR1000vとかですかね。(クラウド料金が多少かかる)

telnetlibとは

telnetlibは、Telnetプロトコルを実装している Telnetクラスを提供します。
Pythonの標準ライブラリであることも特徴の1つかもしれません。

docs.python.org

↑の末尾にサンプルコードがあるのでこちらを参考にして利用していきたいと思います。

import getpass
import telnetlib

HOST = "localhost"
user = input("Enter your remote account: ")
password = getpass.getpass()

tn = telnetlib.Telnet(HOST)

tn.read_until(b"login: ")
tn.write(user.encode('ascii') + b"\n")
if password:
    tn.read_until(b"Password: ")
    tn.write(password.encode('ascii') + b"\n")

tn.write(b"ls\n")
tn.write(b"exit\n")

print(tn.read_all().decode('ascii'))

環境について

今回は手元のルータ(cisco 1841)を利用したいと思います。
telnetを使える状態にします。
ユーザーはtasoでパスワードはciscoにします。

telnetlibで接続してみる

こちらがコードになります。

import getpass
import telnetlib

#対象のルータのIPアドレス
HOST = "192.168.1.254" 
#ユーザー名入力式にしてる user = 'taso' でも可
user = input("Enter your telnet username: ")
#パスワード入力式 見れないようになってる password = 'cisco' でも可
password = getpass.getpass()

tn = telnetlib.Telnet(HOST)

#telnetの接続認証関係
tn.read_until(b"Username: ")
tn.write(user.encode('ascii') + b"\n")
if password:
    tn.read_until(b"Password: ")
    tn.write(password.encode('ascii') + b"\n")

#コマンド内容今回はユーザーの設定が特権ユーザーからなのでenable省略
tn.write(b"show ip int brief\n")
tn.write(b"exit\n")

print(tn.read_all().decode('ascii'))

telnetで入り、enableをしてshow ip int briefをしています。 実行してみます。

実行結果 f:id:taso_int:20211031221212p:plain ちゃんと実行出来てますね。

telnetlibで設定を入れてみる

次にloopbackインタフェースを追加してみたいと思います。

import getpass
import telnetlib

#対象のルータのIPアドレス
HOST = "192.168.1.254" 
#ユーザー名入力式にしてる user = 'taso' でも可
user = input("Enter your telnet username: ")
#パスワード入力式 見れないようになってる password = 'cisco' でも可
password = getpass.getpass()

tn = telnetlib.Telnet(HOST)

#telnetの接続認証関係
tn.read_until(b"Username: ")
tn.write(user.encode('ascii') + b"\n")
if password:
    tn.read_until(b"Password: ")
    tn.write(password.encode('ascii') + b"\n")

#コマンド内容
#事前と事後で確認
tn.write(b"show ip int brief\n")
tn.write(b"conf t\n")
tn.write(b"int loopback 100\n")
tn.write(b"ip add 100.100.100.100 255.255.255.255\n")
tn.write(b"end\n")
tn.write(b"show ip int brief\n")
tn.write(b"exit\n")

print(tn.read_all().decode('ascii'))

実行結果 f:id:taso_int:20211031221231p:plain ちゃんと実行出来てますね。
for文を利用して複数機器、複数設定も可能です。

Telnetしか使えないという環境であれば採用されるかも知れませんね。

次はNAPALMというPythonライブラリを使って自動化をしてみたいと思います。
ここまで読んで頂きありがとうございました。