【NW設定自動化】Ansible+ChatGPTでネットワーク機器の設定変更はできるのか?試してみた【後編】

前回の記事で、Ansible+ChatGPTによる自動化のうち”ごく簡単なshowコマンドの取得”にチャレンジしてみたわけですが(まだの方は前編からお読みください)
後編ではレベルをあげて、いくつか簡単な設定変更をやってみたいと思います。
前編でChatGPTが割とAnsibleを使えちゃったので「あんまりやりすぎたら、我々ネットワークエンジニアの仕事がなくなったりしないのか?」なんて不安を覚えつつ、やっていきましょう。

Ansible+ChatGPT ネットワーク機器設定変更のメリット

Ansibleでネットワーク機器の設定変更する場合のフロー

まず始める前に、そもそもAnsibleによる自動化ってどうなの?ラクになるの?

と、基本に立ち返って考えてみます。

人間がAnsibleを使用する際のフローを図にしてみました。

図にも記載していますが、人間がAnsibleを操作する際のつまづきポイントは、

・プレイブック・インベントリなどのファイルの作成方法がわからない
・モジュールの使い方が分からなかったりで時間がかかる
・トラブルシューティング。どう修正したら動くか分からない

などなど、

「そこに時間をかけるなら、手でやったほうが早いじゃん?」というのがよくある話。

AnsibleとChatGPTを組み合わせて設定変更する場合のフロー(理想図)

じゃあ、今回やりたいこと、AnsibleとChatGPTを組み合わせるとどうなるか?

プレイブックやインベントリ、モジュールの選定、トラシュー、などつまづきポイントはChatGPTにやらせます。これで知識ゼロでもラクラク作成できる予定。

人間がやるべきことは、セキュリティの関わる部分。

例えば、コンフィグはChatGPTに渡せないので人間が差分として入力します。ここをどうやってラクするかも考える必要があります。

Ansible+ChatGPTでネットワーク機器の設定を変えてみた

では、さっそくやってみましょう。まずは前提条件から。

■前提条件
・ChatGPTはGPT-4oを利用
・オペレーションはLinuxサーバで行う
・Ansibleはオペレーションサーバにインストール済み
・操作対象にはSSHで接続して実行する
・操作対象はAristaのEOSで動作

※Arista使ってないよ!という方も多いと思いますが、CiscoのAnsible+ChatGPTも同じようにできる想定。やってみて下さい。

Ansible+ChatGPTでインターフェイスの設定変更を自動化してみる

よくあるインターフェイスの設定変更から試してみましょう。以下のようなプロンプトでChatGPTに依頼します。

プロンプトはこんな感じ、

以下の要件を満たすAnsibleのプレイブック・INIファイル・コマンドファイルを作成して下さい。

■前提条件
・Arista機器を対象にする
・SSHで接続して実行する
・可読性が高く、シンプルな構造にする
・モジュールはシンプルかつ最適なものを選定する
・オペレーションはLinuxサーバで行う
・オペレーションサーバにAnsibleはインストールされているものとする
・接続情報(可変値)はINIファイルにまとめる
・設定変更コマンド(可変値)はコマンドファイルにまとめる
・Ansibleプレイブックは使いまわすことを前提に可変値を入れる

■実行内容
・複数台の機器に設定変更コマンドを実行する
・設定変更コマンドを実行したあと、確認コマンドを実行する
・コマンド実行後、設定を保存する
・実行結果をログファイルに保存する
・ログファイルはディレクトリ YYYYMMDD を作成しその配下に保存する
・ファイル名は YYYYMMDD_HHMMSS_ansible.txt とする
※YYYYは西暦4桁、MMは月を2桁、DDは日を2桁、HHは時間を2桁、MMは分を2桁、SSは秒を2桁

■設定変更コマンド
conf t
interface eth49/1
description TEST
end

■確認コマンド
show run

出力されたコードはこちら、

指定したとおり、プレイブック・インベントリ・コマンドファイルと、実行コマンドが出力されました。

出力されたコードは以下の通り、


--- - name: Apply config and verify on Arista devices hosts: arista gather_facts: no vars: config_commands_file: "commands.txt" verify_command: "show run int eth49/1" log_dir: "{{ lookup('pipe', 'date +%Y%m%d') }}" log_file: "{{ log_dir }}/{{ lookup('pipe', 'date +%Y%m%d_%H%M%S') }}_ansible.txt" tasks: - name: Create log directory with today's date ansible.builtin.file: path: "{{ log_dir }}" state: directory mode: '0755' - name: Load config commands from file ansible.builtin.slurp: src: "{{ config_commands_file }}" register: slurped_commands - name: Set config command list set_fact: config_commands: "{{ slurped_commands['content'] | b64decode | split('\n') }}" - name: Push configuration to device arista.eos.eos_config: lines: "{{ config_commands }}" save_when: always - name: Run verification command arista.eos.eos_command: commands: - "{{ verify_command }}" register: verify_output - name: Save output to log file ansible.builtin.copy: content: "{{ verify_output.stdout[0] }}" dest: "{{ log_file }}"

使用しているAnsibleモジュールと用途を書き出してみました。設定変更をするとなるとノーチェックはいけない。何をしようとしているかチェックするくらいはやっておくべき。

ansible.builtin.file … ディレクトリ作成
ansible.builtin.slurp … ファイルの読み込み
set_fact … 変数の定義
arista.eos.eos_config … コンフィグの投入
arista.eos.eos_command … showコマンドの採取
ansible.builtin.copy … 結果の書き込み

※リンク先は該当モジュールの公式ドキュメント(ググったらでてきます)

これだけのドキュメントを人力で探して使いこなす労力を考えると、ChatGPTが揃えてくれるのは有り難い。たいへん時短になるのでは。

つづいて設定変更の前にテストをしたい。知識ゼロということでやっているので、そのやりかたもChatGPTに聞いてみます。

ドライランを提案されました。ドライランというのは仮想的にAnsibleを動かして、設定を変えずに構文がうまくいっているか見る機能。

ノーリスクなのでさくっとやっちゃいましょう。「–check」オプションをつけて実行。どん!

失敗!

FAILED! とエラーっぽいのが出ています。デバッグもChatGPTにやらせましょう。この出力もとに以下のようにプロンプトを書きます。

修正方法がでてきました。set_factモジュールが使っている「Jinja2テンプレートのフィルタでは使えない記法になっている」とのこと。

Jinja2テンプレートというのは、Ansibleでコンフィグファイルのやりとりなんかに使う変数の塊みたいなやつ。わかりづらいため、ChatGPTにやってもらえるのは凄く助かります。

「ちゃんと作ってよChatGPT君!」と言いたいところですが、ある程度の間違いはしょうがない。そのためのデバッグです。

指定通りコードを修正します。

再実行。

Faild! が消えて、ok=6 になっています。エラーは修正できたとみてよいでしょう。

これでドライランの確認はOK。

本番コマンドいってみます。えいや。

OK。

うまく動いたようです。設定が変わったかどうか見てみましょう。

ビフォー

アフター

良いですね、デスクリプションは正しく正しく変わっています。

ただ、ログファイルがうまく保存出来ていません。

「20250508_125730_ansible.txt」の1ファイルしかありません。ホスト2のログでで上書きしちゃっているのかな?

これもデバッグし、ChatGPTに「”20250508_125730_【ホスト名】.txt”でホストごとにファイルを分けて保存」するよう依頼し、クリア。

設定変更箇所のログ、

show コマンドのログ(show run のみ)、

シンプルなAnsibleですが、コンフィグ部分を手書きすれば、ある程度の作業はできそう。

Ansible+ChatGPTでインターフェイス設定変更自動化はできたのか?

上記の結果からすると、

「ChatGPT+Ansibleでネットワーク設定変更自動化は可能」

…と言って良いのではないでしょうか!

コンフィグとshowコマンドの部分だけ、人間が手でなおせば様々な機能に対応できるはず。特に複数台に同じコマンド投入するときに活躍しそうですね。

機能の追加とかもChatGPTに頼めばやってくれそう。“事前事後でDIFFする”とか、欲しい!

【上級編】Ansible+ChatGPT+マクロでアクセスリストの設定変更を自動化

さて実験をもうひとつ。面倒な作業の代表というとアクセスリスト(ACL)。これを何とか自動的にできないものか?

なんならコンフィグも書きたくない!

アクセスリスト(ACL)をAnsibleで設定変更するアプローチ

まずアプローチとして、以下の二つが考えられます。

① ACLの差分だけ適用する
② 毎回ACLを全て上書き入力する

①は適用する行数が少なく、通信の影響が最小限。差分を正しく適用する必要があり、またもしDeny条件が混じっていれば、順序も気にする必要がある。

②はシンプルかつ明快ではあるものの、一瞬ACLを削除する必要があるため、通信影響があります。

ひとまず今回は「①差分だけ適用する」でいくことにします。

アクセスリスト(ACL)の自動生成はどうするか?

ではACL差分の作成をどうするか?というところですが、セキュリティ上ChatGPTにやらせるのはナシ。

じゃっどうするか。例えば、以下でやるのはどうでしょうか?

ACL表のエクセルを作成したうえで
→ChatGPTにエクセルVBAマクロを作成させ
→人間が表に値を入れ

→人間がACL表からエクセルVBAマクロでAnsibleコマンドファイルを生成する

これで安全に自動化できるはず。

つまり図にするとこう、

VBAにコンフィグを作らせれば、人間が作るのは「インベントリファイル」「表の入力&ACL実行」のみ。つまり、めっちゃ楽になります。

さっそくChatGPTを活用して作っていきましょう!

Ansible+ChatGPTでアクセスリスト(ACL)の設定変更にチャレンジ!

まずは先ほどと同じように、ChatGPTにAnsibleのプレイブック・インベントリファイル・コマンドファイルのテンプレートを作成してもらいます。

以下のプロンプトを入力、

以下の要件を満たすAnsibleのプレイブック・INIファイル・コマンドファイルを作成して下さい。
■前提条件
・Arista機器を対象にする
・SSHで接続して実行する
・可読性が高く、シンプルな構造にする
・モジュールはシンプルかつ最適なものを選定する
・オペレーションはLinuxサーバで行う
・オペレーションサーバにAnsibleはインストールされているものとする
・接続情報(可変値)はINIファイルにまとめる
・設定変更コマンド(可変値)はコマンドファイルにまとめる
・Ansibleプレイブックは使いまわすことを前提に可変値を入れる

■実行内容
・複数台の機器にあクセ巣リストの設定変更コマンドを実行する
・設定変更コマンドを実行したあと、確認コマンドを実行する
・コマンド実行後、設定を保存する
・実行結果をログファイルに保存する
・ログファイルはディレクトリ YYYYMMDD を作成しその配下に保存する
・ファイル名は YYYYMMDD_HHMMSS_【ホスト名】.txt とする
※YYYYは西暦4桁、MMは月を2桁、DDは日を2桁、HHは時間を2桁、MMは分を2桁、SSは秒を2桁

■現在のアクセスリスト(例)
IP Access List TEST_ACL_01
permit ip 192.168.0.0/24 any
permit tcp 172.16.0.0/24 eq www any
deny ip any any

■差分(例)
ip access-list TEST_ACL_01
permit tcp 172.16.1.0/24 eq 80 any
no deny ip any any
deny ip any any

■変更後のアクセスリスト(例)
IP Access List TEST_ACL_01
permit ip 192.168.0.0/24 any
permit tcp 172.16.0.0/24 eq www any
permit tcp 172.16.1.0/24 eq www any
deny ip any any

こんな感じで出力されました。

コマンドファイルの部分が”config”と”show”で別ファイルになっています。編集しやすいのでこれも良いかもですね。ただディレクトリ一つ深いのは嫌かも。

今回はこのままいきますが、ChatGPTは依頼するたび結果が変わるので、慣れてきたら狙った設定になるまでガチャを引くのがよき。

続いて、エクセルACL表。こんな感じのものでいいでしょう、よくあるやつ(これは手作業)。

続いてVBAスクリプト。ChatGPTにこんな感じのプロトコルで出力させます。

エクセルVBAを作成して下さい

■VBAの要件
・コマンドシートのA列にAristaのアクセスリストコマンドを出力します
・どのようなアクセスリストを出力するかは、表シートを参照します
・表シートのA列の名前付きアクセスリストを対象に処理を行います
・表シートのI列の作業対象が「追加」もしくは「削除」となっているセルが作業対象です
・作業対象のB~Iのセルを組み合わせアクセスリストコマンドを作成します
・コマンドの作り方は「既存ACL」の項目を参照し、スペースやeqの文字を正しく配置して下さい。
・「削除」の場合は、コマンドの先頭に"no "を付与して下さい

■既存ACL
ip access-list TEST_ACL_01
permit ip 192.168.0.0/24 any
permit ip 172.16.0.0/24 any eq 80
deny ip any any

■表シートの内容(例)
ACL Protocol Action 送信元 宛先 作業対象
Name Address Mask Port Address Mask Port
TEST_ACL_01 ip permit 192.168.0.0 /24 any
ip permit 172.16.0.0 /24 eq 80 any
ip permit 172.16.1.0 /24 eq 80 any 追加
ip deny any any 削除
ip deny any any 追加

何度かデバッグが必要でしたが、結果ちゃんと動くVBAが完成しました。コードを乗せておきます。

Sub GenerateACLCommands()

    Dim wsTable As Worksheet
    Dim wsCommand As Worksheet
    Dim lastRow As Long
    Dim outputRow As Long
    Dim i As Long
    Dim aclName As String, prevAclName As String
    Dim protocol As String
    Dim action As String
    Dim srcAddr As String, srcMask As String, srcPort As String
    Dim dstAddr As String, dstMask As String, dstPort As String
    Dim task As String
    Dim command As String
    Dim prefix As String

    Set wsTable = Worksheets("表")
    Set wsCommand = Worksheets("コマンド")

    wsCommand.Cells.ClearContents
    outputRow = 1

    lastRow = wsTable.Cells(wsTable.Rows.Count, "B").End(xlUp).Row

    wsCommand.Cells(outputRow, 1).Value = "生成されたACLコマンド"
    outputRow = outputRow + 1

    prevAclName = ""

    For i = 2 To lastRow
        task = Trim(wsTable.Cells(i, "K").Value)

        If task = "追加" Or task = "削除" Then
            aclName = Trim(wsTable.Cells(i, "A").Value)
            protocol = Trim(wsTable.Cells(i, "B").Value)
            action = Trim(wsTable.Cells(i, "C").Value)
            srcAddr = Trim(wsTable.Cells(i, "D").Value)
            srcMask = Trim(wsTable.Cells(i, "E").Value)
            srcPort = Trim(wsTable.Cells(i, "F").Value)
            dstAddr = Trim(wsTable.Cells(i, "G").Value)
            dstMask = Trim(wsTable.Cells(i, "H").Value)
            dstPort = Trim(wsTable.Cells(i, "I").Value)

            If task = "削除" Then
                prefix = "no "
            Else
                prefix = ""
            End If

            ' ACL名が前の行と異なる場合はヘッダ行を出力
            If aclName <> prevAclName Then
                wsCommand.Cells(outputRow, 1).Value = prefix & "ip access-list " & aclName
                outputRow = outputRow + 1
                prevAclName = aclName
            End If

            ' 本文コマンド(インデント付き)
            command = " " & prefix & action & " " & protocol & " "

            If srcAddr = "any" Then
                command = command & "any "
            ElseIf srcMask <> "" Then
                command = command & srcAddr & srcMask & " "
            Else
                command = command & srcAddr & " "
            End If

            If srcPort <> "" Then
                command = command & "eq " & srcPort & " "
            End If

            If dstAddr = "any" Then
                command = command & "any"
            ElseIf dstMask <> "" Then
                command = command & dstAddr & dstMask
            Else
                command = command & dstAddr
            End If

            If dstPort <> "" Then
                command = command & " eq " & dstPort
            End If

            wsCommand.Cells(outputRow, 1).Value = command
            outputRow = outputRow + 1
        End If
    Next i

    MsgBox "ACLコマンドの生成が完了しました。", vbInformation

End Sub

このVBAマクロを実行すると、ACL差分コマンドが作成されました。

もうちょっとやりようがありそうですが、一旦これで良いでしょう、

これをコマンドファイルにコピペして実行。今回は一発成功。

ビフォー

アフター

ちゃんと変更できました。シーケンス番号が飛んでますが許容範囲とします。

「ChatGPT+Ansible+VBAでアクセスリストの設定変更を自動化できた」と言って良いのではないでしょうか。

まとめ

結論、ChatGPT+AnsibleでIFの設定変更自動化に成功しましたし、ChatGPT+Ansible+VBAでアクセスリストの設定変更が自動化にも成功しました。

この組み合わせを応用していけば、だいたいのコンフィグは自動生産できてしまうのでは…?

気が付けばネットワーク設定変更自動化の世界は手元まで来ていたんですね…。そのうちネットワークエンジニアのコンフィグ作業は世の中からなくなってしまうかもしれません。

私の仕事なくなっちゃう!?こわっ!

ご拝読ありがとうございました!

【NW構成図】は一周まわってエクセルで書けば良いのでは?という提案
【NW設定自動化】をAnsible+ChatGPTで知識ゼロからできるのか?試してみた【前編】

ブログの著者欄

友 源輝

GMOインターネットグループ株式会社

東京へ上京してNWエンジニアを始めた九州人。NW一筋で東京で十年ちょい生きてきた。が、最近は田舎が恋しくなってきたらしい。趣味はアウトドア。休日はだいたい野山にいる。

採用情報

関連記事

KEYWORD

TAG

もっとタグを見る

採用情報

SNS FOLLOW

GMOインターネットグループのSNSをフォローして最新情報をチェック