ページの先頭です

ページ内を移動するためのリンク
本文へ (c)

ここから本文です。

AI と自動化の融合: ChatGPT が生み出すAnsible Playbook の可能性

ライター:猪子 亮
2019年ネットワンシステムズに新卒入社。

社内/外 向けサービス開発、事業部門の支援などを行っています。
主にWeb アプリケーションのフロントエンド、バックエンド開発(オンプレ/AWS)。

他には社内の自動化推進(Ansible)、業務改善活動、開発エンジニア育成などに取り組んでいます。

目次

1. はじめに

この記事では、ChatGPT を使用してネットワーク機器からconfig を取得するAnsible Playbook を自動生成した結果について解説します。

ChatGPT はAnsible Playbook をどこまで書けるのか試してみました。

対象読者としては、Ansibleのインストール方法やネットワーク機器との接続など、最低限の知識を持っている方を想定しています。

また、モデルはGPT-4 を使用しており、2023年4月時点での内容になります。

1.1 ChatGPTとは

ChatGPTは、OpenAIが開発したGPT アーキテクチャに基づく大規模言語モデルです。

このAIは、あらゆる種類のテキストを生成する能力があり、技術文書の作成やソフトウェアコードの生成など、多岐にわたるタスクに対応できます。

今回は、このChatGPTを活用して、ネットワーク機器からconfig を取得するAnsible Playbook を自動生成してもらいました。

1.2. Ansible Playbook の概要

Ansible Playbook は、シンプルなYAML 形式で記述された設定ファイルであり、Ansible による自動化を定義する際に使用されます。

Playbook には、実行すべきタスクのリストが含まれており、各タスクは特定のモジュールを使用して機能を実現します。

今回のケースでは、ネットワーク機器からのconfig 取得を目的としています。

2. ChatGPT へ与えるプロンプト

ChatGPTは、人工知能による言語モデルであり、プロンプトとして与えられた文から適切な回答や情報を生成する能力を持っています。

2.1. プロンプトの質と出力の関係

プロンプトの質は、ChatGPT が生成する出力の精度や有用性に大きな影響を与えます。

明確で具体的なプロンプトを使用することで、より正確で関連性の高い回答が得られる可能性が高まります。

逆に、曖昧なプロンプトは、理解されにくい回答や不適切な情報が生成される原因となることがあります。

効果的なプロンプトは、疑問や要求が明確に表現され、ChatGPTが理解しやすい形で提示されます。

具体的な文脈や背景情報を提供することで、より適切な回答が得られることが多いです。

また、プロンプトに意図しないバイアスや誘導がないように注意することが重要です。

2.2. プロンプトの最適化

ChatGPT の性能を最大限に活用するためには、プロンプトの最適化が欠かせません。

繰り返し試行を行い、異なるプロンプトやフォーマットを試すことで、最適な出力を得ることができます。

これはプロンプトエンジニアリングとも呼ばれ、プロンプトを売買するプラットフォームも存在するほど重要な技術となっています。

プロンプトエンジニアリングに関しては、 DAIR.AI というAI 技術の民主化に取り組まれている団体が Prompt Engineering Guide を公開しています。

2.3. Playbook の生成に使用したプロンプト

今回は以下のプロンプトでPlaybook を作ってもらいます。

## 指示

Ansible Playbook を書いて、Arista ネットワーク機器の構成をバックアップしてください。

以下の要件を満たすようにしてください。

## 要件

  1. main.yml は各タスクファイルを読み込むだけの Playbook です。
  2. precheck-variable.yml で変数が定義済みか、適切な型であるかを assert モジュールでチェックしてください。
  3. その他必要なタスクファイルはmain.yml とは別で作成してください。
  4. ansible.builtin を含む全てのモジュール呼び出しに FQCN を使用してください。
  5. 機器名、ファイルパスなどは変数化してください。
  6. config の保存先はAnsible 実行サーバーとは別のサーバーを指定し、保存先のディレクトリも指定できるようにしてください。
  7. config 保存時のファイル名は、`ホスト名_config を取得した日時` としてください。
  8. リモートサーバーにconfig を保存する際、ansible.builtin.copy モジュールとdelegate_to を使用し、localhost に保存しないことに注意してください。
  9. 出力には、Playbook を実行するために必要なansible.cfg、inventoryファイル、変数定義ファイル(group_vars配下)のサンプルも含めてください。

## タスクの実行順序

  1. precheck-variable.yml による変数チェック
  2. 対象機器への疎通確認
  3. ホスト名の取得
  4. startup-config の取得
  5. config の保存

## 必要なファイルの例

  • ansible.cfg
  • inventory.ini
  • group_vars/all.yml
  • main.yml
  • precheck-variable.yml
  • arista_fetch_config.yml

3. ChatGPT が生成したAnsible Playbook の解説

3.1. Playbook の生成

先のプロンプトを実行したところ、以下のような結果となりました。

以下のファイルを作成して、要件に従った Ansible Playbook を実装します。

inventory.ini


        [defaults]
        inventory = inventory.ini
        host_key_checking = False
        timeout = 30
        

inventory.ini:


        [arista]
        arista01 ansible_host=192.168.1.1
        

group_vars/all.yml:


        ---
        remote_server: 192.168.10.1
        remote_directory: /backups/arista
        

group_vars/arista.yml


        ---
        ansible_user: user
        ansible_ssh_pass: pass
        ansible_become: true
        ansible_connection: network_cli
        ansible_network_os: eos
        ansible_become_method: enable
        

main.yml:


        ---
        - name: Backup Arista network device configuration
          hosts: arista
          gather_facts: no
          tasks:
            - name: Precheck variables
              include_tasks: precheck-variable.yml
            - name: Include Arista fetch config tasks
              include_tasks: arista_fetch_config.yml
        

precheck-variable.yml:


        ---
        - name: Check if required variables are defined
          ansible.builtin.assert:
            that:
              - remote_server is defined
              - remote_directory is defined
            fail_msg: "Please make sure arista_username, arista_password, remote_server, and remote_directory variables are defined."
        

backup-config.yml: (CMS のレンダリング不良により、一部" を` に置き換えています。)


        ---
        - name: Test connectivity to the devices
          ansible.netcommon.cli_command:
            command: "ping 127.0.0.1"
        - name: Get hostname
          arista.eos.eos_command:
            commands: show hostname
          register: result
        - name: Set hostname
          set_fact:
            arista_hostname: `{{ result.stdout_lines[0][1].strip() }}`
        - name: Get startup-config
          arista.eos.eos_command:
            commands: show startup-config
          register: config_result
        - name: Save config to a file
          ansible.builtin.copy:
            content: `{{ config_result.stdout[0] }}`
            dest: `{{ remote_directory }}/{{ arista_hostname }}_config_{{ ansible_date_time.date }}_{{ ansible_date_time.time }}`
            remote_src: no
          delegate_to: `{{ remote_server }}`
        

これで、Arista ネットワーク機器の構成をバックアップする Ansible Playbook が完成しました。Playbook を実行するには、各ファイルを適切なディレクトリに配置し、ansible-playbook main.yml コマンドを実行します。

かなりそれっぽいものが出てきました。

変数を実際の値にセットし、実行してみます。

エラーが出ました。

このエラーをそのままChatGPT に貼り付けてみます。

見事に直してくれました。

しかし、直してもらったPlaybook にもまだバグがあり、エラーが続いたため、同様の作業を繰り返し、Playbook を修正していきました。

なお、うっかり出してはいけない情報をChatGPT に貼り付けないよう注意しましょう。

3.2. Playbook の構造と動作

今回作成したPlaybook の動作イメージです。

保存先のサーバーとディレクトリを指定しPlaybook を実行すると、ネットワーク機器のホスト名 + 取得日時の形式でconfig が保存されます。


    ---
    remote_server: 192.168.10.1
    remote_directory: /backups/arista
    

4. ChatGPT でPlaybook を作成してみた所感

4.1. 自動生成されたPlaybook の正確性

ChatGPT はプロンプトに従って単純なPlaybook を生成することができました。

しかし、そのPlaybook の正確性は実際のネットワーク環境や機器によって異なります。

そのため、生成されたものをそのまま使うといったやり方には向いていないと感じました。

また、ChatGPT はプロンプトにない情報も上手いこと補完してくれます。
ところが、Ansible Playbook の生成に関して、その効果は限定的だと感じました。

そのため、今回はある程度Ansible のベストプラクティスのような詳細な要素をプロンプトで与えていました。

これにはいくつか理由が考えられますが、Playbook 自体の学習量が他の言語と比較して少ないと推測されることや、環境に依存するという要素が大きいのではないかと考えます。

しかしながら、コネクションタイプやネットワーク機器のOSを指定する変数はきちんと記述されていました。
その点で、ネットワーク機器に対するAnsibleの実行ポイントは押さえられていると感じました。

4.2. カスタマイズと最適化のポイント

今回生成したPlaybook をさらに最適化する場合、以下のような観点があります。

  • 認証情報の管理
  • エラーハンドリング
  • 可読性の向上

認証情報の管理

今回のケースでは、スイッチに接続するための認証情報を変数に直で指定してしまっています。

認証情報を平文で保存することにはリスクがあるので、Ansible Vault による暗号化が推奨されます。

また、Automation controller などのGUI 管理ツールを使う場合、実行時に入力させることも可能です。

エラーハンドリング

作成したプレイブックの内容や題材がシンプルなため、今回のケースにおいては、エラーハンドリングを実装することの優先度は低いと考えられます。

しかし、より複雑な題材や規模の大きなPlaybook を作成する場合、適切なエラーハンドリングを実装することが望ましいです。

可読性の向上

コードの可読性は、プログラミングの世界において最も重要な要素の一つであり、Playbook 開発でも同様です。

可読性の高いコードは、他の開発者が理解しやすく、保守や拡張が容易になります。

特にチームでの開発や、プロジェクトの寿命が長い場合には、可読性は欠かせません。

可読性の高いコードがあれば、バグの発見や修正もスムーズに行えます。

5. まとめ

本記事では、ChatGPT を利用してネットワーク機器からconfig を取得するAnsible Playbook を生成し、その精度について検討しました。

今回はChatGPT に全てを丸投げしてPlaybook を作らせましたが、使い方を工夫することでPlaybook 開発にも十分生かせると感じました。

例えば、以下のような使い方が上げられます。

  • 行いたい自動化の内容をChatGPT に相談し、実装手順について相談する
  • GitHub Copilot を使い、エディタ上でPlaybook 開発を支援してもらう
  • 開発時における実行エラー解決のためのヒントをもらう

他にも様々な使い方があると思いますが、ChatGPT のようなAI と共存することで、自身の業務や自社のプロダクトがより良くできると考えます。

おまけ

このブログ記事のタイトルや一部文章もChatGPT に書いてもらっています!

また、冒頭「はじめに」の章で出てきたイメージ画像は、Midjourney という画像生成AI にAnsible Playbook をキーワードに出力してもらった絵です。

※本記事の内容は執筆者個人の見解であり、所属する組織の見解を代表するものではありません。

RECOMMEND