ONTAP用Playbookの生成について修正項目の違い 【ChatGPTとBardで試してみる】 

## はじめに
Googleが開発するAIチャット「Bard」について、先日から日本でもベータテストに参加できるようになりました。
本記事では[Ansibleを使ってStorage(ONTAP)を管理する2【ChatGPTでVolume作成用Playbookを作成】](https://qiita.com/s_yosh1d/items/6774760fd046c0314618)に関連して、**Bardで、Volume作成の為のPlaybook作成ができるか試す内容**となります。

また、**ChatGPTのGPT-3.5、GPT-4でもコード生成を合わせて行い、それぞれどの程度修正すれば動くのか試してみたい**と思います。


## 何をしたい？できる？
- **AnsibleのPlaybookの作成にBardを使ってみる**
- **GPT-3.5、GPT-4で生成されたものを比較してみる**

## Bardについての前提
- 英語での記載が必要
- Codeingは以下のように未サポート
　<font color="Red">(でも動くのか試してみたい)
<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/bd189086-be05-95e8-ecc3-28caf4eb1617.png>

**一応、対応しているかBard自身に聞いてみると、やってくれるとの事ですので。。**

<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/6b2b992e-517e-d68d-aef7-d58f4f6bc866.png>


## 記事における構築環境
CIFS100というSVMへVolume作成を以下の設定値で実施します。
・サイズは5GB
・Volumeを切り出すAggregateはaggr1_node2
・Volume名はnfs100
・JunctionPathは/nfs100
・ExportPolicyはdefault
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/b3ad8deb-91a8-0c68-b20d-8f32c12aec1f.png>


## 実行手順
Bardの利用にあたってはGoogleアカウントが必要となります。
アカウント作成とブラウザ上でログインを実施しておきます。

#### 1. WaitlistへのJoin
[Bardのサイト](https://bard.google.com/?hl=en)へアクセスし、[Join waitlist]をクリックします。

<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/784142d6-8fde-5a66-49cb-3843e094c485.png>


チェックボックスにチェックを入れ、[Join waitlist]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/9597110d-0719-87b3-618f-30baa08e0995.png>

Waillistに追加されたことを確認します。あとは、[It’s your turn to try Bard]メールが来るのを待ってから利用可能となります。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/52ab0aea-76d1-720c-e2dd-86d5d956be0d.png>

4/20のAMで試した際には、10分以内に利用可能になってました。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/2adc5260-1bc7-7039-f693-14ee59cd64a0.png>

あとは、受信したメールのリンクをクリックし、注意事項等を確認して利用します。

<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/d211a433-7330-5afa-b7e8-003042d6eba0.png>

<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/cb3dc512-0ae6-5436-851f-7a84fa215f2e.png>

<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/d88a5252-be92-ebb1-75fa-cbe328631dac.png>


#### 2. 条件文を入力
本記事では、GPT-3.5、GPT-4向けに以下の文章を入力して作成しました。
```bash:
以下の条件でONTAPのVolume作成を行うAnsibleのPlaybookを作って下さい

・Vserver名はcifs100
・サイズは5
・size_unitはgb
・Aggregateはaggr1_node2
・Volume名はnfs100
・JunctionPathは/nfs100
・ExportPolicyはdefault
・use_restはAlways
・hostnameは172.16.10.147
・usernameはtestuser
・passwordはpass
```

**Bard用にはDeeplで英語に翻訳したものを使ってます。**
```bash:
Create an Ansible Playbook for ONTAP volume creation with the following conditions

Vserver name is cifs100
Size is 5
Size_unit is gb
Aggregate is aggr1_node2
Volume name is nfs100
JunctionPath is /nfs100
ExportPolicy is default
Use_rest is Always
hostname is 172.16.10.147
username is testuser
password is pass
```


入力時の表現次第で出力が変わってきますので、詳細な条件を与える方が上手く行きます。

##### <font color="Red">修正項目の比較
結論から言うと、以下のような修正を行う事で問題無く動く事が確認できました。
未サポートと言いつつ、思ったより修正項目は少なかったです。

||GPT3.5 |GPT4|Bard|
|:--------|:--------|:--------|:--------|
|**修正**|volume_name部分|無し|volume_name部分, aggr_name部分|
|**追加内容**|validate_certs: false|validate_certs: false|validate_certs: false|
|**特記事項**|汎用的な形|汎用性が低い形|汎用的+handler部分の追加あり|



#### 3. 出力結果の確認

##### Bardの出力
<font color="Red">**Bardでは、[View other drafts]で回答の候補が3つ確認できます。**


<img width="700" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/665aeb99-0b16-5bd1-ecbf-7e1a5513dca8.png>

なお、Draft1は以下の通り。

```bash:
---
- hosts: localhost
  gather_facts: no
  vars:
    vserver_name: cifs100
    size: 5
    size_unit: gb
    aggr_name: aggr1_node2
    volume_name: nfs100
    junction_path: /nfs100
    export_policy: default
    use_rest: Always
    hostname: 172.16.10.147
    username: testuser
    password: pass

  tasks:
    - name: Create ONTAP volume
      na_ontap_volume:
        vserver: "{{ vserver_name }}"
        size: "{{ size }}"
        size_unit: "{{ size_unit }}"
        aggr_name: "{{ aggr_name }}"
        volume_name: "{{ volume_name }}"
        junction_path: "{{ junction_path }}"
        export_policy: "{{ export_policy }}"
        use_rest: "{{ use_rest }}"
        hostname: "{{ hostname }}"
        username: "{{ username }}"
        password: "{{ password }}"

  handlers:
    - name: Wait for volume to be created
      wait_for:
        delay: 10
        state: started
        host: "{{ hostname }}"
        port: 443
        path: "/api/storage/volumes/{{ volume_name }}"
        method: GET
        status_code: 200
```

Draft2は以下の通り。
```bash:
---
- hosts: localhost
  vars:
    vserver_name: cifs100
    size: 5
    size_unit: gb
    aggr_name: aggr1_node2
    volume_name: nfs100
    junction_path: /nfs100
    export_policy: default
    use_rest: Always
    hostname: 172.16.10.147
    username: testuser
    password: pass

  tasks:
  - name: Create ONTAP volume
    netapp.ontap.na_ontap_volume:
      vserver: "{{ vserver_name }}"
      size: "{{ size }}"
      size_unit: "{{ size_unit }}"
      aggr_name: "{{ aggr_name }}"
      volume_name: "{{ volume_name }}"
      junction_path: "{{ junction_path }}"
      export_policy: "{{ export_policy }}"
      use_rest: "{{ use_rest }}"
      host: "{{ hostname }}"
      username: "{{ username }}"
      password: "{{ password }}"
```

##### GPT-3.5の出力


<img width="700" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/c551932b-9577-4959-59c2-81450714aa20.png>


出力の全体は以下の通り。
```bash:
---
- name: Create ONTAP Volume
  hosts: localhost
  gather_facts: no
  vars:
    vserver: cifs100
    size: 5
    size_unit: gb
    aggregate_name: aggr1_node2
    volume_name: nfs100
    junction_path: /nfs100
    export_policy: default
    use_rest: Always
    hostname: 172.16.10.147
    username: testuser
    password: pass

  tasks:
  - name: Create Volume
    na_ontap_volume:
      state: present
      vserver: "{{ vserver }}"
      volume: "{{ volume_name }}"
      aggregate_name: "{{ aggregate_name }}"
      size: "{{ size }}"
      size_unit: "{{ size_unit }}"
      junction_path: "{{ junction_path }}"
      export_policy: "{{ export_policy }}"
      use_rest: "{{ use_rest }}"
      hostname: "{{ hostname }}"
      username: "{{ username }}"
      password: "{{ password }}"

```

##### GPT-4の出力
<img width="700" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/e9d03a36-f953-e53e-d7b6-7c5256d2ad19.png>


出力の全体は以下の通り。
```bash:
---
- name: ONTAP Volume作成
  hosts: localhost
  gather_facts: no
  tasks:
    - name: Volume作成
      na_ontap_volume:
        state: present
        vserver: cifs100
        name: nfs100
        size: 5
        size_unit: gb
        aggregate_name: aggr1_node2
        junction_path: /nfs100
        export_policy: default
        use_rest: Always
        hostname: 172.16.10.147
        username: testuser
        password: pass
```

#### 3. Bardの出力結果を修正してPlaybookの実行
Taskの以下の部分を修正する事でVolume作成ができるようになりました。
- aggr_name => aggregate_name
- volume_name => name
- validate_certs: false を追加


```bash:
> cat bard_volume_playbook.yml
---
- hosts: localhost
  gather_facts: no
  vars:
    vserver_name: cifs100
    size: 5
    size_unit: gb
    aggr_name: aggr1_node2
    volume_name: nfs100
    junction_path: /nfs100
    export_policy: default
    use_rest: Always
    hostname: 172.16.10.147
    username: testuser
    password: XXXXXX

  tasks:
    - name: Create ONTAP volume
      na_ontap_volume:
        vserver: "{{ vserver_name }}"
        size: "{{ size }}"
        size_unit: "{{ size_unit }}"
        aggregate_name: "{{ aggr_name }}"
        name: "{{ volume_name }}"
        junction_path: "{{ junction_path }}"
        export_policy: "{{ export_policy }}"
        use_rest: "{{ use_rest }}"
        hostname: "{{ hostname }}"
        username: "{{ username }}"
        password: "{{ password }}"
        validate_certs: false

  handlers:
    - name: Wait for volume to be created
      wait_for:
        delay: 10
        state: started
        host: "{{ hostname }}"
        port: 443
        path: "/api/storage/volumes/{{ volume_name }}"
        method: GET
        status_code: 200
```

```bash:
> ansible-playbook -i inventory.yml -u user01 bard_volume_playbook.yml --ask-pass
SSH password:

PLAY [localhost] ******************************************************************************************************************

TASK [Create ONTAP volume] ********************************************************************************************************
changed: [localhost]

PLAY RECAP ************************************************************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

```

## 参考及びリンク
[Ansibleを使ってStorage(ONTAP)を管理する2【ChatGPTでVolume作成用Playbookを作成】](https://qiita.com/s_yosh1d/items/6774760fd046c0314618)