前回の記事で、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でアクセスリストの設定変更が自動化にも成功しました。
この組み合わせを応用していけば、だいたいのコンフィグは自動生産できてしまうのでは…?
気が付けばネットワーク設定変更自動化の世界は手元まで来ていたんですね…。そのうちネットワークエンジニアのコンフィグ作業は世の中からなくなってしまうかもしれません。
私の仕事なくなっちゃう!?こわっ!
ご拝読ありがとうございました!


ブログの著者欄
採用情報
関連記事
KEYWORD
CATEGORY
-
技術情報(479)
-
イベント(176)
-
カルチャー(43)
-
デザイン(28)
TAG
- 5G
- Adam byGMO
- AI
- AWX
- BIT VALLEY
- blockchain
- ChatGPT
- cloudflare
- cloudnative
- CloudStack
- CM
- CNDO
- CNDT
- CODEGYM Academy
- ConoHa
- ConoHa、Dify
- CS
- CSS
- CTF
- DC
- Designship
- Desiner
- DeveloperExper
- DeveloperExpert
- DevRel
- DevSecOpsThon
- Dify
- DNS
- Docker
- DTF
- Expert
- GitLab
- GMO AIR
- GMO Developers Day
- GMO Developers Night
- GMO Developers ブログ
- GMO GPUクラウド
- GMO Hacking Night
- GMO kitaQ
- GMO SONIC
- GMOアドパートナーズ
- GMOアドマーケティング
- GMOイエラエ
- GMOクラウド]
- GMOグローバルサイン
- GMOサイバーセキュリティ大会議
- GMOサイバーセキュリティ大会議&表彰式
- GMOソリューションパートナー
- GMOデジキッズ
- GMOブランドセキュリティ
- GMOペイメントゲートウェイ
- GMOペパボ
- GMOリサーチ
- Go
- GTB
- Hardning
- Harvester
- HCI
- iOS
- IoT
- ISUCON
- JapanDrone
- Java
- JJUG
- K8s
- Kaigi on Rails
- Kids VALLEY
- LLM
- MetaMask
- MySQL
- NFT
- NVIDIA
- NW構成図
- NW設定
- OpenStack
- Perl
- perplexity
- PHP
- PHPcon
- PHPerKaigi
- PHPカンファレンス
- QUIC
- Rancher
- RPA
- Ruby
- Selenium
- Slack
- Slack活用
- Spectrum Tokyo Meetup
- splunk
- SRE
- SSL
- Terraform
- TLS
- TypeScript
- UI/UX
- VLAN
- VS Code
- アドベントカレンダー
- インターンシップ
- オブジェクト指向
- オンボーディング
- お名前.com
- カルチャー
- コンテナ
- サイバーセキュリティ
- スクラム
- スペシャリスト
- セキュリティ
- ソフトウェアテスト
- チームビルディング
- デザイン
- ドローン
- ネットのセキュリティもGMO
- ネットワーク
- ヒューマノイドロボット
- プログラミング教育
- ブロックチェーン
- マルチプレイ
- ミドルウェア
- モバイル
- ゆめみらいワーク
- リモートワーク
- レンタルサーバー
- 京大ミートアップ
- 人材派遣
- 協賛レポート
- 基礎
- 多拠点開発
- 大学授業
- 宮崎オフィス
- 応用
- 技育プロジェクト
- 技術広報
- 新卒
- 暗号
- 業務効率化
- 業務時間削減
- 機械学習
- 決済
- 物理暗号
- 視覚暗号
- 高機能暗号
PICKUP
-
【NW設定自動化】Ansible+ChatGPTでネットワーク機器の設定変更はできるのか?試してみた【後編】
技術情報
-
デザインコンテスト「GMO DESIGN AWARD 2025」 開催決定!
デザイン
-
IETF122 @Bangkok参加レポート|PQCとAIが交差する“暗号技術の今”【現地レポ+技術解説】
技術情報
-
【Hack-1グランプリ2025 キックオフレポート】学生100名が本気で挑む、AI時代のものづくり
イベント
-
【協賛決定】JJUG CCC 2025 Springに「fincode byGMO」が登場!ブース&セッションでJavaトークしませんか?
イベント
-
DESIGN LEAD 1on1にGMOインターネットグループエキスパート・デザイナー3名の登壇が決定!
イベント