Ansibleを使ってStorage(ONTAP)を管理する4【変数編2】

## はじめに

本記事では[Ansibleを使ってStorage(ONTAP)を管理する3【変数編1](https://qiita.com/s_yosh1d/items/62b2c89250ccc7698e70)】の続きとして、ONTAP管理の為のインベントリファイルやPlaybook作成に関する内容となります。
今回は**主にPlaybook内に記載する変数(主にvars)について記載を致します。**

## 何をしたい？できる？
- PlaybookのVarsセクションで変数の設定を行う
- コマンドラインから変数を指定して実行する
- 変数を別ファイルとして作成し、Playbook内で変数用ファイルを指定して実行
- 変数の値を対話的に入力して処理を実行する


## ONTAPの Ansibleモジュールについて
AnsibleからONTAPのVolume作成やNFSサービスの開始を実施する際には、認証情報や対象のSVMなどのオブジェクトを指定して実行が必要になります。
(省略できない)

以下の図のように、仮にVolume作成とNFSサービス開始を同一のPlaybookに記載して実行しようとしても認証情報やSVM名を夫々記載しなくてはいけない為、各タスクに直接記載するのは冗長な形になります。

|<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/82c7259f-7ae7-ebcd-2ecb-68eaa7d50a83.png>
|:-:|

この記事では、その手間を減らすために、PlayBookのVarsセクションに変数を記載して動作を確認してみるといった内容となります。


## 記事における環境情報
本記事では、以下の環境で実施した内容となります。
- Rocky Linux : 9.1
- Python      : 3.9.14
- Ansible (Core): 2.14.1
- netapp-lib    : 2021.6.25
- netapp.ontap  : 22.1.0

環境のイメージとしては以下の通りです。
|<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/6384ee71-5ab1-ca65-e444-f51aad7fc43b.png>
|:-:|

## 設定手順


### 1. Varsセクションによる変数指定(Play変数)

ONTAPにVolumeを作成するTaskを記載したPlaybookを以下のように記載して実行します。
tasksの部分には値を直接記載せずに、上方にあるvarsの部分に纏めて記載しています。

**Volume名を例にすると、taskにはname: "{{ volume_name }}"と記載し、
vars部分に volume_name: nfs100することで、nfs100というVolumeを作成する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: XXXXXX
    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
```


Playbookを実行後、varsに記載された値でvolumeが作成されているのがStorage上で確認することができます。

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

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

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

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

Storage上の確認では以下の通り、nfs100というVolumeが5GBで作成されています。
```bash:
vol show -vserver cifs100
Vserver   Volume       Aggregate    State      Type       Size  Available Used%
--------- ------------ ------------ ---------- ---- ---------- ---------- -----
cifs100   cifs100_root aggr1_node2  online     RW          1GB    972.0MB    0%
cifs100   cifsvol100   aggr1_node1  online     RW          3GB     2.03GB   28%
cifs100   nfs100       aggr1_node2  online     RW          5GB     4.75GB    0%
3 entries were displayed.
```

### 2. コマンドによる変数指定(extra変数)
そのまま続けて、Volume名とVolumeサイズをPlaybookとは別の値にしてコマンド上で指定して実行してみます。
(名前をnfs123で、サイズは45、junction_pathは/nfs123を指定しています)
ansible-playbookコマンドに-eを使用することで変数の指定が可能になります。

```bash:
>  ansible-playbook -i inventory.yml  -u user01 playbook_volume_create.yml -e "volume_name=nfs123 size=45 junction_path=/nfs123"  --ask-pass
SSH password:

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

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

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

```


Storage側で作成結果を見てみると、コマンドラインで指定した値が優先されている為、45GBのVolumeが作成されているのが確認できます。
```bash:
> vol show -vserver cifs100
Vserver   Volume       Aggregate    State      Type       Size  Available Used%
--------- ------------ ------------ ---------- ---- ---------- ---------- -----
cifs100   cifs100_root aggr1_node2  online     RW          1GB    971.9MB    0%
cifs100   cifsvol100   aggr1_node1  online     RW          3GB     2.03GB   28%
cifs100   nfs100       aggr1_node2  online     RW          5GB     4.75GB    0%
cifs100   nfs123       aggr1_node2  online     RW         45GB    42.75GB    0%
4 entries were displayed.
```

### 3. 変数を別ファイルにしてPlaybookの実行

手順２までに作成したVolumeを削除後に、Playbookのvarsの部分を別ファイルに記載して、Playbookではvars_filesの部分に、変数を記載した別ファイルを指定して実行します。
ファイルの構成は以下の通りです。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/b621e4c6-98ce-f21a-7306-29d6ba119c34.png>


Playbookは以下のようにvarsではなく、vars_filesを使い変数用ファイルのパスを記載します。

```bash:
>  cat playbook_volume_create2.yml
---
- name: Create volume on ONTAP SVM
  hosts: localhost
  connection: local
  gather_facts: false

  vars_files:
    - vars/vol_create_vars.yml

  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:
>  cat vars/vol_create_vars.yml
svm_host: 172.16.10.147
svm_user: testuser
svm_password: XXXXXX
svm_protocol: https
vserver: cifs100
size: 5
size_unit: gb
aggregate_name: aggr1_node2
volume_name: nfs100
junction_path: /nfs100
export_policy: default
```

Playbookを実行します。
```bash:
>  nsible-playbook -i inventory.yml  -u user01 playbook_volume_create2.yml --ask-pass
SSH password:

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

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

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

Storage側で作成結果を見てみると、別ファイルで指定した内容のVolumeが作成されている事が確認できます。
```bash:
> vol show -vserver cifs100
Vserver   Volume       Aggregate    State      Type       Size  Available Used%
--------- ------------ ------------ ---------- ---- ---------- ---------- -----
cifs100   cifs100_root aggr1_node2  online     RW          1GB    971.8MB    0%
cifs100   cifsvol100   aggr1_node1  online     RW          3GB     2.03GB   28%
cifs100   nfs100       aggr1_node2  online     RW          5GB     4.75GB    0%
3 entries were displayed.
```




### 4. 変数を対話的に入力してPlaybookの実行
パスワードや実行環境によって異なる値を入れたい場合にPlaybookの実行のタイミングで変数を入力することができます。
利用するにはPlaybook上でvars_promptに対話的に入力したい変数を指定します。
指定可能な主な要素は以下の通りです。

|要素|概要|
|:---|:---|
|name|変数名を入力|
|prompt|入力する時にプロンプトに表示される文字列|
|private|trueの時は入力中の値が画面に表示されない|
|confirm|trueの時は値の再入力が必要|


**ここではSVMのユーザ名とパスワードを対話的に入力する為に、変数用のファイル上の記載を削除しておきます。**
ファイルの内容は以下の通りで、変数用のファイルからはsvm_user: testuserとsvm_password: XXXXXXが無くなっているのが確認でき、Playbookには対話的にsvm_userとsvm_passwordを入力するようにvars_promptの記載を行います。

```bash:
>  cat playbook_volume_create2.yml
---
- name: Create volume on ONTAP SVM
  hosts: localhost
  connection: local
  gather_facts: false

  vars_files:
    - vars/vol_create_vars.yml

  vars_prompt:
    - name: svm_user
      prompt: Enter SVM User Name!
      private: false

    - name: svm_password
      prompt: Enter SVM Password!
      private: true

  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:
> cat vars/vol_create_vars.yml
svm_host: 172.16.10.147
svm_protocol: https
vserver: cifs100
size: 5
size_unit: gb
aggregate_name: aggr1_node2
volume_name: nfs100
junction_path: /nfs100
export_policy: default
```

Playbookの実行を行うと、vars_promptに記載したprompt表示("Enter SVM User Name!"の部分)
が確認できるので、変数の値を入力します。
```bash:
> ansible-playbook -i inventory.yml -u user01 playbook_volume_create2.yml --ask-pass
SSH password:
Enter SVM User Name!: testuser
Enter SVM Password!:

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

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

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

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

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

[Ansibleを使ってStorage(ONTAP)を管理する3【変数編1】](https://qiita.com/s_yosh1d/items/62b2c89250ccc7698e70)