Ansibleを使ってStorage(ONTAP)を管理する2【ChatGPTでVolume作成用Playbookを作成】 

## はじめに
本記事では[Ansibleを使ってStorage(ONTAP)を管理する1【Rocky LinuxへAnsible Install編】](https://qiita.com/s_yosh1d/items/f437b8ea284a6e90936f)の続きとして、Volume作成の為のPlaybook作成に関する内容となります。
また、**Twitter等で話題となっている[OpenAI](https://openai.com/)によって開発されたChatGPTを使ってPlaybookの作成を試し、どの程度修正すれば動くのか試してみたい**と思います。


## 何をしたい？できる？
- Ansibleを使ってSVM上にVolumeを作成
- **Playbookの作成にChatGPTを使ってみる**

## 記事における構築環境
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>



## 実行手順
ChatGPTの利用にあたってはまずOpen AIにアカウント作成が必要になります。

#### 1. OpenAIのアカウント作成
[ChatGPT](https://chat.openai.com/chat)のサイトにアクセスし、[Sign UP]をクリックします。
<img width="400" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/16b5fad1-8e67-a7be-5e77-cfc7803949ac.png>

次に表示された画面で、メールアドレスを入力し、[I'm not a robot]にチェックを入れ、画面に表示される質問に従って、適切な画像を選択し[Verify]をクリック後[Continue]を選択します。
<img width="400" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/263c895d-fbe8-4b3b-15a4-f607a4b6632c.png>

パスワード設定後に、[Continue]を選択します。
<img width="400" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/4bd4525f-322e-3c0f-ce0f-72b7cf14072f.png>

アカウント作成時に入力したメールアドレスに確認メールが飛ぶので、メール上の[Verify email address]をクリックします。
<img width="400" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/b045fe71-d78f-b400-1b33-634c1be297c5.png>
<img width="400" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/441ccae9-4da5-c50d-5ec4-6b583f6af3e9.png>


表示された画面下方に文章を入力する事で会話やコード生成が実施されます。
<img width="400" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/66b10747-00e4-458d-c70a-c68c570ddee5.png>




#### 2. 条件を入力
本記事では以下の文章を入力して作成しています。
```bash:
ONTAPのSVMに接続してVolume作成を行うAnsibleのPlaybookを作って

Volume作成の条件は以下の通り
・Vserver名はcifs100
・サイズは5GB
・Aggregateはaggr1_node2
・Volume名はnfs100
・JunctionPathは/nfs100
・ExportPolicyはdefault
```
結果は以下の画像のような形ですが、画像生成AIのStable Diffusionのように入力時の表現次第で出力が変わってくるので、色々と試してみることが良いと思います。



![014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/3acc95bd-80ec-9c8e-4303-918ae654a0dd.png)

　

**ChatGPTが生成したPlaybook**は以下の通りです。
```bash:
---
- name: Create volume on ONTAP SVM
  hosts: localhost
  connection: local
  gather_facts: false
  
  vars:
    svm_host: "{{ svm_host }}"
    svm_user: "{{ svm_user }}"
    svm_password: "{{ svm_password }}"
    svm_protocol: "{{ svm_protocol }}"
    vserver: cifs100
    size: 5
    size_unit: GB
    aggregate_name: aggr1_node2
    volume_name: nfs100
    junction_path: /nfs100
    export_policy: default
  
  tasks:
  - name: Create volume
    na_ontap_volume:
      state: present
      hostname: "{{ svm_host }}"
      username: "{{ svm_user }}"
      password: "{{ svm_password }}"
      https: "{{ svm_protocol == 'https' }}"
      vserver: "{{ vserver }}"
      size: "{{ size }}"
      size_unit: "{{ size_unit }}"
      aggregate_name: "{{ aggregate_name }}"
      volume_name: "{{ volume_name }}"
      junction_path: "{{ junction_path }}"
      export_policy: "{{ export_policy }}"

```


**3. Playbookの修正**
生成されたPlaybookに、以下環境情報部分のみ修正して試すとエラーが確認できました。
- SVMのホスト名またはIPアドレス
- SVMに接続するためのユーザー名
- SVMに接続するためのパスワード
- SVMに接続するためのプロトコル (SSHまたはHTTPS)

**動作する為に実際に修正した部分は以下の項目です。**
vars:の部分について
- 環境に合わせたIPやアカウント、プロトコルに変更
- size_unitの単位は小文字

task:について
-引数が誤っている部分を修正
　volume_name: => name:
- ZAPI(REST APIを使わない)や認証エラーにならないように以下を追記
  validate_certs: false
  use_rest: Always


**修正後のPlaybookは以下の通りです。**
```bash:
> cat playbook_volume_create.yml
---
- name: Create volume on ONTAP SVM
  hosts: localhost
  connection: local
  gather_facts: false

  vars:
    svm_host: 172.16.10.147
    svm_user: testuser
    svm_password: XXXXXXX
    svm_protocol: https
    vserver: cifs100
    size: 5
    size_unit: gb
    aggregate_name: aggr1_node2
    volume_name: nfs100
    junction_path: /nfs100
    export_policy: default

  tasks:
  - name: Create volume
    na_ontap_volume:
      state: present
      hostname: "{{ svm_host }}"
      username: "{{ svm_user }}"
      password: "{{ svm_password }}"
      https: "{{ svm_protocol == 'https' }}"
      vserver: "{{ vserver }}"
      size: "{{ size }}"
      size_unit: "{{ size_unit }}"
      aggregate_name: "{{ aggregate_name }}"
      name: "{{ volume_name }}"
      junction_path: "{{ junction_path }}"
      export_policy: "{{ export_policy }}"
      validate_certs: false
      use_rest: Always
```

**修正後は以下のように問題無く挙動します。**
```bash:
> ansible-playbook -i inventory.yml -u user01 playbook_volume_create.yml --ask-pass -v
No config file found; using defaults
SSH password:

PLAY [Create volume on ONTAP SVM] ***************************************************************************************************

TASK [Create volume] ****************************************************************************************************************
changed: [localhost] => {"actions": ["create"], "changed": true}

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

　

**4. 生成されたPlaybookの修正部分の確認方法**
**とりあえず、何度も実行してエラーメッセージから確認してます。**
例えば、以下のような結果となれば、volume作成に必要なnameという項目が使われてないので、生成されたPlaybookのVolume名の部分を修正することを試して行くといった形です。


```bash:
> ansible-playbook -i inventory.yml -u user01 playbook_volume_create.yml --ask-pass -v
(中略)
TASK [Create volume] ****************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "missing required arguments: name"}
```

他に生成されたPlaybookではVolumeのサイズの単位がGBと大文字になってましたが、この場合は以下のエラーが出るので、小文字を使うという事が推測できます。

```bash:
> ansible-playbook -i inventory.yml -u user01 playbook_volume_create.yml --ask-pass -v
(中略)
TASK [Create volume] ****************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "value of size_unit must be one of: bytes, b, kb, mb, gb, tb, pb, eb, zb, yb, got: GB"}
```





## 参考及びリンク
[Ansibleを使ってStorage(ONTAP)を管理する1【Rocky LinuxへAnsible Install編】](https://qiita.com/s_yosh1d/items/f437b8ea284a6e90936f)