【Ansible】Ansible Lightspeedを使ってみた

## はじめに

2023/07/20に開催された、[Red Hat Ansible Automates 2023 Japan][1]にて紹介された、
Ansible Lightspeedを実際に使ってみたので紹介します。  
AIがPlaybookの開発を支援してくれるようで、開発スピードの向上に繋がるかもしれません。

## TL;DR

- Ansible Lightspeedは、AIがPlaybookの開発を支援してくれる
- Visual Studio CodeとGitHubアカウントがあれば利用可能
- テクニカルプレビュー版では、1つのタスクのみ生成可能

---

## 1. Ansible Lightspeedの機能

2023/07時点のテクニカルプレビュー版では、主に以下のような機能が備わっています

- AIによるPlaybookの開発支援
  - Ansible Galaxyサイトのコンテンツを中心に学習
  - 生成するのは、1つのタスクのみ
- 生成したコンテンツの情報源を表示
- 日本語入力に対応

## 2. Ansible Lightspeedの準備

### 2-1. 事前に必要なもの

Ansible Automation Platformのサブスクリプションは不要で、以下があれば利用可能です

- GitHubアカウント
- Visual Studio Code

### 2-1. 利用可能にするための設定手順

1. Visual Studio CodeにAnsibleエクステンションをインストール
2. Lightspeedを有効化
    - `settings.json`に以下の設定を入れます

      ```json
      {
      "ansible.lightspeed.enabled": true,
      "ansible.lightspeed.suggestions.enabled": true,
      }
      ```
3. 画面左のAnsibleアイコンから[Connect]を選択し、GitHubアカウントでログインする
    - 利用規約に同意する必要があります

      ![github_login_add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/9b190275-c567-127b-486e-46270fb8f945.png)

## 3. Ansible Lightspeedを利用したタスクの作成

### 3-1. 作成するタスク

今回は、以下2パターンのタスクを作ってみます

1. localhostにあるファイルをTarget Nodeにコピー
    - 想定される出力

      ```yaml
      - name: Copy file on localhost to Target Node
        ansible.builtin.copy:
          src: /tmp/sample.txt
          dest: /tmp
      ```

2. Junosに対してvlanを追加する
    - 想定される出力

      ```yaml
      - name: Add vlan to Junos
        junipernetworks.junos.junos_vlans:
          config:
            - name: vlan1
              vlan_id: 1
          state: merged
      ```

### 3-2. パターン1: localhostにあるファイルをTarget Nodeにコピー

- Lightspeedでは、タスク名を記入すると自動でタスクの詳細が記述されます。
ここでは、タスク名を「Copy file on localhost to Target Node」にしました。  
タスク名を書くとタスクの詳細がグレーアウトした状態で出力されるので、[Tab]キーを押すと反映されます。出力された結果と、想定される出力にほとんど違いはありません。

  ![playbook1_ok.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/0dae6e96-eb04-dc71-df0b-f4c9f2b83eac.png)


- ターミナル画面を見ると、「Ansible: LIGHTSPEED TRAINING MATCHES」というタブが
追加されており、生成したコンテンツの情報源が表示されます。

  ![playbook1_terminal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/aafb132a-2099-3f95-2996-7f1e5a3fcf04.png)

- ちなみに、タスク名を「Copy file to Target Node」と少し省略した形で書くと、
出力されるタスクの詳細も異なります。タスク名は具体的に書かないと、想定と異なる結果が
出力されてしまうようです。

  ![playbook1_ng.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/677c66ea-fb7d-58c4-eecb-2188c461705e.png)

### 3-3. パターン2: Junosに対してvlanを追加

- ここでは、タスク名を「Add vlan to Junos」にしました。使用するモジュールが`junos_config`であり、
想定される出力とは異なりますが、処理内容としては問題なさそうです。

  ![playbook2_ng.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/c32f54ef-4bd2-d83d-6ed8-d7bb5a002c3d.png)

- では、タスク名をどうすれば想定される結果が出力されるのでしょうか？
Ansible Galaxyの[junos_vlans][2]モジュールのドキュメントを確認します。
このドキュメントの記入例は以下のようになっていました。

  ```yaml
  - name: Merge provided Junos vlans config with running-config
    junipernetworks.junos.junos_vlans:
      config:
      - name: vlan1
        vlan_id: 1
      - name: vlan2
        vlan_id: 2
        l3_interface: irb.12
      state: merged
  ```

- そこで、タスク名を「Merge provided Junos vlans config with running-config」にして、
Lightspeedにタスクの詳細を出力されると、想定通り`junos_vlans`モジュールを使用するようになりました。

![playbook2_ok.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/232ba359-f838-f18a-e45a-4d888a7e1586.png)

## まとめ

- Ansible Lightspeedは、タスク名から自動的にタスクの詳細を書いてくれるので便利
- タスク名は具体的に書いた方が、タスクの詳細の精度が上がる
- 出力されるタスクの詳細が想定と異なる場合、Ansible Galaxyにあるmoduleの記入例を  
参考にすると、想定の出力に近づく場合がある
  - 逆にいうと、今後のAnsible Collectionの開発では、AIにPlaybookの書き方を学習させるために、  
  タスク名を具体的に書く必要があるのかもしれない

---

## 参考URL

- [Red Hat Ansible Automates 2023 Japan][1]
  - Red Hat Ansible Automates 2023 Japanのセッション一覧

---

[1]: https://www.redhat.com/ja/explore/ansible-automates-2023-japan
[2]: https://github.com/ansible-collections/junipernetworks.junos/blob/main/docs/junipernetworks.junos.junos_vlans_module.rst