Ontap S3をAnsibleで自動構成してAWS CLIでアクセスしてみる

# Ontap S3をAnsibleで自動構成してAWS CLIでアクセスしてみる
ONTAPのAnsibleモジュール "[netapp.ontap](https://github.com/ansible-collections/netapp.ontap)"も頻繁に更新されていて 気がついたら [ONTAP S3](https://docs.netapp.com/ja-jp/ontap/s3-config/index.html) 設定に利用できるモジュールも実装されてました。 オンプレでも オブジェクトストレージが利用できると何かと便利ということで、AnsibleでのONTAP S3 自動構成を試してみましたのでその内容を記載します。 構成した環境は AWS CLI (S3コマンド)でアクセスして利用できることを確認してみます。

なお、Ansibleを実行可能な環境を構成済みの前提で記載しています。環境準備の手順などは[Ansibleのサイト](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html)などを参考にしてください。

## 前提
以下の環境で試しています

- ansible 2.10.6
- Ansible Collection
    - netapp.ontap 21.23.0
- CentOS 7.7
- Python 3.6.8
- Ontap 9.9.1

なお、ONTAPの初期セットアップは実施済みで [ONTAP S3のライセンス](https://kb.netapp.com/Advice_and_Troubleshooting%2FFlash_Storage%2FAFF_Series%2FHow_to_get_S3_license_to_configure_ONTAP_S3)は適用済みの前提としています。
また、この記事で書かれている 手順やPlayBookは動作を保証されたものではありません。
各環境に合わせてテスト・確認をしたうえで自己責任にて利用していただければと思います。

## やってみること
1. ONTAP S3構成用の Ansible Playbook を準備
2. Ansibleを実行してONTAP S3を自動構成する
3. ONTAP S3の バケットにAWS CLI(s3コマンド)をつかって アクセスしてみる 


## 1. ONTAP S3構成用の Ansible Playbook を準備
新規に ONTAP S3用 SVMを作成し、S3を構成する Ansible Playbook を準備します。
今回は試したものをgithubにアップしているので そのファイルを取得して内容を確認します。

```shell:
$ git clone git@github.com:NetAppJpTechTeam/ontap_s3.git
Cloning into 'ontap_s3'...
remote: Enumerating objects: 17, done.
remote: Counting objects: 100% (17/17), done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 17 (delta 3), reused 17 (delta 3), pack-reused 0
Receiving objects: 100% (17/17), 5.63 KiB | 0 bytes/s, done.
Resolving deltas: 100% (3/3), done.
$ ls ontap_s3/
tasks  templates
$ mkdir ontap_s3/outputs ontap_s3/vars
$ ls ontap_s3/
outputs  tasks  templates  vars
$ ls ontap_s3/tasks/
main.yml  ontap_s3.yml  ontap_svm.yml  template.yml
$  
```
これで事前準備は完了となります。

可変パラメータは、 実行時の質問に回答することで動的に設定(var_prompt+ templateモジュール)されます。事前にパラメータファイル等を編集する必要はありません。



***
#### 参考：ディレクトリ・ファイル構成
参考までに、取得したPlaybookファイルについてですが、ディレクトリ構成は以下になります。

```shell:ディレクトリ・ファイル構成
~/ontap_s3
├─ outputs
├─ tasks
|   ├─ main.yml
|   ├─ ontap_svm.yml
|   ├─ ontap_s3.yml
|   └─ template.yml
├─ templates
|   ├─ ontap.yml.j2
|   └─ s3user.yml.j2
└─ vars
```

tasks/template.ymlファイルで、 var_promptの default値 を設定しておくと 繰り返し 同じ値を使う場合 入力が楽になりますが、必須ではないので今回はその部分の手順は割愛しています。


## 2. Ansibleを実行してONTAP S3を自動構成する
Ansible Playbookを実行します。

ansible-playbookコマンドで"main.yml"を実行すると vars_prompt機能により パラメータ入力を求めるプロンプトが表示されます。パラメータの入力を求められますので、対象のONTAP環境にあわせた値を設定します。
 



```shell:
$ cd ontap_s3/tasks/
$ ansible-playbook main.yml
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
Please enter , on_cluster_lif []: 10.128.211.35
Please enter , on_cluster_admin []:　admin
Please enter , on_cluster_pass []: "cluster adminユーザのパスワードを入力"
Please enter , on_aggregate_list []: soc_ontap2_01_SSD_1 
Please enter , on_aggregate_name []: soc_ontap2_01_SSD_1
Please enter , svm_name []: svm48h
Please enter , svm_lif_mgmt_ip []: 10.128.211.48
Please enter , svm_lif_mgmt_subnet []: 255.255.255.0
Please enter , svm_lif_mgmt_home_node []: soc-ontap2-01
Please enter , svm_lif_mgmt_home_port []: e0a
Please enter , svm_lif_data_ip []: 10.128.211.49
Please enter , svm_lif_data_subnet []: 255.255.255.0
Please enter , svm_lif_data_home_node []: soc-ontap2-01
Please enter , svm_lif_data_home_port []: e0a
Please enter , s3_bucket []: s48bucket
Please enter , s3 bucket size(Byte) []: 107374182400

PLAY [create a file from Jinja2 Template] *****************************************************************************************************************************************

〜 省略 〜

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

$  
```

処理が正常に完了すると、ONTAP S3 用の LIF / SVM / Bucket / S3 userなどが作成されます。

また、 outputs ディレクトリ配下に S3 User用のアクセスキー、シークレットキーなどの情報を出力したファイルが作成されます。

※ 参考： 実行例で入力している主なパラメータ
|パラメータの項目 | 値 | 備考 |
|:---|---|---|
|クラスタ管理LIF|10.128.211.35 | 
|aggregate名| soc_ontap2_01_SSD_1| SVMに割り当てるAggregate名
|svm名|svm48h| ONTAP S3用 新規SVM名
|svm管理LIF|10.128.211.48 | 新規SVM用管理LIF
|svmデータLIF|10.128.211.49| 新規SVM用データLIF
|LIF Home Node|soc-ontap2-01| 管理・データLIF共通 
|LIF Home Port|e0a| 管理・データLIF共通
|bucket名|s48bucket| ONTAP S3新規バケット名
|bucket size(Byte)|107374182400| バケットサイズ(100GB)

## 3. ONTAP S3の バケットに AWS CLI(s3コマンド)をつかって アクセス
作成されたバケットに [AWS CLI で aws s3コマンド](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-services-s3-commands.html)を利用して アクセスしてみます。

なお、AWS ClIのインストール手順などについては、[AWSのサイト](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html)を参照ください。 

#### 3-1. 事前準備：アクセスキー、シークレットキーの設定
まずは、aws configureコマンドで profileを設定します。
S3 User の アクセスキー と シークレットキー は、 "../outputs/s3user_s48bucket_user1"ファイルに格納されていますのでその値を設定します。


```plaintext:
$  cat ../outputs/s3user_s48bucket_user1.out
# S3 user info  s3 server : svm48h_s3 / bucket name : s48bucket
  user name    : s48bucket_user1
  access_key   : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  secret_key   : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ aws configure --profile s3user01
AWS Access Key ID [None]: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Default region name [None]:
Default output format [None]: json
$ aws configure list --profile s3user01
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                 s3user01           manual    --profile
access_key     ****************xxxx shared-credentials-file
secret_key     ****************xxxx shared-credentials-file
    region                               config-file    ~/.aws/config
$ 

```
#### 3-2. Bucketへのファイルのアップロード

次に、AWS CLIの aws s3コマンドを利用して、ファイルをBucketにコピーできることを確認します。

```plaintext:
$ date > testfile
$ cat testfile
2022年 10月 24日 月曜日 14:44:56 JST
$ aws s3 cp testfile s3://s48bucket --endpoint-url https://10.128.211.49/ --no-verify-ssl --profile s3user01
urllib3/connectionpool.py:1013: InsecureRequestWarning: Unverified HTTPS request is being made to host '10.128.211.49'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
upload: ./testfile to s3://s48bucket/testfile
$ aws s3 ls s3://s48bucket --endpoint-url https://10.128.211.49/ --no-verify-ssl --profile s3user01
urllib3/connectionpool.py:1013: InsecureRequestWarning: Unverified HTTPS request is being made to host '10.128.211.49'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
2022-10-24 14:44:58         43 testfile
$
```

#### 3-3. Bucketからのファイルのダウンロード
次に、 Bucketにコピーしたファイルを ローカルの/tmpディレクトリ配下にダウンロードできることを確認します。


```plaintext:
$ aws s3 cp  s3://s48bucket/testfile /tmp --endpoint-url https://10.128.211.49/ --no-verify-ssl --profile s3user01
urllib3/connectionpool.py:1013: InsecureRequestWarning: Unverified HTTPS request is being made to host '10.128.211.49'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
urllib3/connectionpool.py:1013: InsecureRequestWarning: Unverified HTTPS request is being made to host '10.128.211.49'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
download: s3://s48bucket/testfile to ../../../tmp/testfile
$ diff testfile /tmp/testfile
$ cat /tmp/testfile
2022年 10月 24日 月曜日 14:44:56 JST
```

#### 3-3. Bucketからのファイルの削除
次に、 ONTAP S3 Bucketにアップロードした testfile を削除してしてみます。

```plaintext:
$ aws s3 rm s3://s48bucket/testfile --endpoint-url https://10.128.211.49/ --no-verify-ssl --profile s3user01
urllib3/connectionpool.py:1013: InsecureRequestWarning: Unverified HTTPS request is being made to host '10.128.211.49'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
delete: s3://s48bucket/testfile
$ aws s3 ls s3://s48bucket --endpoint-url https://10.128.211.49/ --no-verify-ssl --profile s3user01
urllib3/connectionpool.py:1013: InsecureRequestWarning: Unverified HTTPS request is being made to host '10.128.211.49'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
$  
```

ONTAP S3に 作成されたバケットに 、AWS CLI で aws s3コマンドを利用して アクセスできることが確認できました。


## まとめ
ONTAP S3の自動構成を試してAWS CLIでアクセスしてみました。オブジェクトストレージを手軽にオンプレで自動構成できれば何かと便利なのではないかなと思います。  AWS CLIでアクセスできるのも ちょっとした確認などに利用できて便利かなと思います。ONTAP S3で構成した環境は [Astra Control Center](!https://www.netapp.com/ja/cloud-services/astra/) 用の オブジェクトストレージとして使用することも可能です。


また、自分で作ったPlaybookでも久しぶりに使おうとすると パラメータの変更箇所がうろ覚えとなることがあるかと思います。ちょっとしたPlaybookを作るときに 動的パラメータ設定できるようにしておくと 設定が必要な項目の質問に入力していけば良いだけとなり、便利な手段なのではないかと思います。


なお、Ansible Runnerを利用したい場合 Ansible-builderで NetAppのAnsibleモジュール用 Ansible実行環境を 準備する方法を[別記事](https://qiita.com/yoihoka/items/7ab852bb9346ef6fe5b5)で紹介しています。興味ありましたら参照してもらえればと思います。