話題のChat GPTでCiscoのconfigを生成してみた

# はじめに
この記事は Cisco Systems Japan の有志による Advent Calendar 2022 (1枚目) の 3日目として投稿しています。
　2022年版(1枚目 & 2枚目): https://qiita.com/advent-calendar/2022/cisco



勝男です
今回は話題のChat GPTについてNWエンジニア視点何か役に立たないかな？と思って色々試験してみたので
紹介します
本検証日時は2022/12/1時点なため必ずしも皆さんが実際にやってみた結果とは異なる可能性があります。

# Chat GPTとは

GPT（Generative Pretrained Transformer） は、2015年12月に設立された非営利の人工知能研究組織**「OpenAI」が開発している「文章生成言語モデル」**です。

URL https://openai.com/blog/openai-api/


簡単に言えばBGPのconfig作ってといえばそれっぽいものを教えてくれるツールとなります。
例
```md
ciscoについて教えて

返答
Cisco Systems, Inc.は、アメリカ合衆国のテクノロジー企業です。
Ciscoは、ネットワークインフラストラクチャ製品、サービス、
およびソフトウェアを提供しており、
特に、インターネットプロトコル（IP）通信に特化した製品とサービスで有名です。
Ciscoは、世界で最も大きなネットワークインフラストラクチャ企業の1つであり、
多くの企業や政府機関、および学術施設がCiscoの製品を利用しています。
```

では実際に試してみた結果を見てみましょう

## BGP編

```
cisco IOS XRでBGPのpeerをあげるconfig教えて
```
以下返答

BGPのpeerをあげるconfigをご案内するには、Cisco IOS XRの設定方法を理解している必要があります。また、実際に設定を行うには、適切なアクセス権限が必要です。BGPのpeerをCisco IOS XR上で設定する場合は、次のようにします。

1. router bgpコマンドを使用して、BGPルータを設定します。
1. neighborコマンドを使用して、BGP neighborを設定します。このコマンドには、接続するBGP peerのIPアドレスとAS番号が必要です。
1. remote-asコマンドを使用して、BGP neighborが属するAS番号を設定します。
1. update-sourceコマンドを使用して、BGP updateメッセージの送信元IPアドレスを設定します。
1. address-familyコマンドを使用して、BGP neighborとの間で通信するアドレスファミリーを設定します。

```json
router bgp 65000
 neighbor 192.0.2.1 remote-as 65001
  address-family ipv4 unicast
   update-source Loopback0
```


上記の例では、BGPルータのAS番号が65000、BGP neighborのAS番号が65001、接続するBGP peerのIPアドレスが192.0.2.1であるとしています。また、BGP updateメッセージの送信元IPアドレスはループバックインターフェース0であるとしています。


以上


かなり丁寧にconfig付きで解説してくれますね
機能単位に絞れば高精度で返してくれる印象です
また普段あまり使わない機能もしっかりと教えてくれます。

#### 例えばBGP route reflectorでも以下のような回答が返ってきます

BGP route reflectorは、BGPルータを中継することで、BGP neighbor間のトポロジをフラットに保つことができる機能です。BGP route reflectorを設定することで、BGP neighbor数を減らし、BGP updateの処理負荷を軽減することができます。

BGP route reflectorをCisco IOS XR上で設定する場合は、次のようにします。

--------------------
1. router bgpコマンドを使用して、BGPルータを設定します。
1. bgp router-idコマンドを使用して、BGPルータのRouter IDを設定します。
1. neighborコマンドを使用して、BGP neighborを設定します。このコマンドには、接続するBGP peerのIPアドレスとAS番号が必要です。
1. remote-asコマンドを使用して、BGP neighborが属するAS番号を設定します。
1. update-sourceコマンドを使用して、BGP updateメッセージの送信元IPアドレスを設定します。
1. address-familyコマンドを使用して、BGP neighborとの間で通信するアドレスファミリーを設定します。
1. route-reflector-clientコマンドを使用して、BGP neighborをroute reflectorクライアントとして設定します。
例:
```json
Copy code
router bgp 65000
 bgp router-id 1.1.1.1
 neighbor 192.0.2.1 remote-as 65001
  address-family ipv4 unicast
   update-source Loopback0
   route-reflector-client
 neighbor 192.0.2.2 remote-as 65002
  address-family ipv4 unicast
   update-source Loopback0
```
続いて複数台構成のconfig作れないか？検証してみます

## 複数台構成のconfig


```
複数台構成のCIsco IOS XRの動くconfig
```
返答

Cisco IOS XRを複数台構成する場合、接続するインターフェースの設定が必要になります。ここでは、2台のCisco IOS XRを直接接続する例を紹介します。

1. interfaceコマンドを使用して、接続するインターフェースを設定します。
1. ipv4 addressコマンドを使用して、インターフェースにIPアドレスを割り当てます。
1. no shutdownコマンドを使用して、インターフェースを有効にします。

```json
interface GigabitEthernet0/0/0/1
 ipv4 address 192.0.
```
Cisco IOS XRは、Cisco社が提供するネットワークオペレーティングシステムです。Cisco IOS XRを複数台構成することで、大規模なネットワークの管理や運用が可能になります。

複数台のCisco IOS XRを構成する場合は、次のような設定が必要になります。

システム構成に応じて、各Cisco IOS XRデバイスのハードウェアを選択し、接続します。
各Cisco IOS XRデバイスに対して、IPアドレスやルーティングプロトコルなどの基本的

複数台構成の要望をするとconfigも説明も中途半端な状態で終わり、生成はできませんでした
ただしBGPで複数台構成でといえば以下の通りになりました。

```json
BGPのpeerをCisco IOS XR上で3台構成のconfig
```

```json
router bgp 65000
 neighbor 192.0.2.1 remote-as 65001
  address-family ipv4 unicast
   update-source Loopback0
 neighbor 192.0.2.2 remote-as 65002
  address-family ipv4 unicast
   update-source Loopback0
 neighbor 192.0.2.3 remote-as 65003
  address-family ipv4 unicast
   update-source Loopback0
```
3台分書いてくれるというわけではなく3つのBGP peerを設定する出力結果となりました。
これは自分の書きかたが悪かった説もあるので今後もの検証事項かな思います。

続いて話題のSegment Routingのconfig作ってと言ってみます

## Segment Routingをまわすためのconfig

```json
!
interface FastEthernet0/0
ip address 192.168.10.1 255.255.255.0
!
interface FastEthernet0/1
ip address 192.168.100.1 255.255.255.0
!
router bgp 100
bgp router-id 1.1.1.1
neighbor 192.168.10.2 remote-as 100
neighbor 192.168.100.2 remote-as 200
network 192.168.10.0 mask 255.255.255.0
network 192.168.100.0 mask 255.255.255.0
!
ip route 0.0.0.0 0.0.0.0 FastEthernet0/0
ip route 0.0.0.0 0.0.0.0 FastEthernet0/1
!
router bgp 100
bgp router-id 1.1.1.1
neighbor 192.168.10.2 remote-as 100
neighbor 192.168.100.2 remote-as 200
network 192.168.10.0 mask 255.255.255.0
network 192.168.100.0 mask 255.255.255.0
segment-routing mpls
!
interface FastEthernet0/0
segment-routing mpls
!
interface FastEthernet0/1
segment-routing mpls
!
ip route 192.168.10.0 255.255.255.0 FastEthernet0/0
ip route 192.168.100.0 255.255.255.0 FastEthernet0/1
!

```
## Ciscoのconfigを出力するperlのコード

続いてconfigを出力する系のプログラムです
本来であればプログラムが書けるというのがメリットであったので一例だけ出します
Ciscoのconfigを出力するperlのコード

```perl
#!/usr/bin/perl

use strict;
use warnings;

use Net::Telnet;

# CiscoルーターのIPアドレス、ユーザー名、パスワードを定義する
my $ip = '192.168.0.1';
my $username = 'admin';
my $password = 'password';

# TelnetでCiscoルーターに接続する
my $t = new Net::Telnet (Timeout => 10,
                         Prompt => '/.*[#>]\s?$/');
$t->open($ip);

# ユーザー名とパスワードを入力し、ログインする
$t->login($username, $password);

# show runコマンドを実行し、configを取得する
my @output = $t->cmd('show run');

# 取得したconfigを出力する
foreach my $line (@output) {
  print "$line\n";
}

# 接続を切断する
$t->close();

```
調整は多少必要ですがベースはこれでいいなというレベルのコードが出てきて感動しますね

## まとめ
Chat GPTを使用してみましたが使い方のユースケースとしては以下の感じの感想を得ました。

複数台構成を書いてくれる神的な存在ではなく
あくまでも補助的要素にはなりそうです
パーツの組み合わせのconfig作成にはなりますが
次世代に必要な能力はこういったものの組み合わせを上手に動かす力なのかもしれませんね

機能単位でよければ高精度なconfigは書いてくれるので勉強会や試験勉強には使えそうです。(CCNAとか)
同じ質問をしても異なる回答を出す場合があります。(どんどん学習していってそうです)
今すぐ使える方法としては
文法的に間違えているconfigチェックはすぐに使えそうです
以下は意図的に間違えたconfigを突っ込んだ場合の反応です
![スクリーンショット 2022-12-01 231417.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314181/9fa004ff-df91-68a4-b066-7277e0940038.png)


あとはめっちゃ長いマニュアル読むよりはまずはconfigをみたいという人におすすめかなと思います。
注意事項としてはプログラムのコード生成の時にも話題になりましたが
このconfigは誰が書いたことになって権利は誰のものになるのか？
不明な点も多いのでその点は気を付けた方がいいかもしれません。