试用Amazon FSx for NetApp ONTAP与Ansible

尝试使用Amazon FSx for NetApp ONTAP来测试NetApp Ansible模块。

中国网站亚马逊 FSx for NetApp ONTAP支持通过AWS控制台或NetApp的CloudManager使用图形界面进行操作,同时也可以使用Ansible实现自动化管理操作。我已经亲自尝试过了,现在将介绍具体步骤。

此外,Amazon FSx for NetApp ONTAP提供了部署后操作的说明。虽然可以在AWS控制台上轻松部署Amazon FSx for NetApp ONTAP,但也可以利用Terraform进行自动化部署。有关使用Terraform进行部署的步骤在另一篇文章中介绍。

# 前提条件
我正在以下环境下进行测试。

    • Amazon Linux v2

 

    • Ansible 2.9.23

 

    • Python 3.7.10

 

    • NetApp-lib : 2021.6.25

 

    netapp.ontap:21.14.1

顺便提一下,本文所提到的步骤和文件并不能保证其可行性。
我建议根据各自的环境进行测试和确认,然后自行承担责任使用。

作业简介

在EC2实例(Linux服务器)上安装Ansible,并在Amazon FSx for NetApp ONTAP上创建卷,然后在EC2实例(Linux服务器)上执行Ansible playbook来从中挂载NFS卷。

image.png

需要注意的是,在运行Ansible的EC2实例(Linux服务器)和FSx for NetApp ONTAP之间将发生TCP 22 / 443端口的通信。请根据需要事先进行安全组的配置等设置。

【作业流程】
1. 将Ansible引入EC2实例(Linux服务器)
2. 准备Ansible playbook
3. 执行Ansible(创建卷并进行NFS挂载)
4. 执行Ansible(删除卷并取消NFS挂载)

1. 在EC2实例(Linux服务器)中引入Ansible

将Ansible以及所需的库引入。
由于此次使用的是Amazon Linux,因此使用amazon-linux-extras来安装Ansible。
同时,还引入了Ansible集合以及所需的Python库。

$ sudo amazon-linux-extras install ansible2 -y
Installing ansible
〜〜出力省略〜〜
完了しました!
$ sudo pip3 install NetApp-Lib
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Collecting NetApp-Lib
〜〜出力省略〜〜
Installing collected packages: lxml, six, xmltodict, NetApp-Lib
Successfully installed NetApp-Lib-2021.6.25 lxml-4.6.4 six-1.16.0 xmltodict-0.12.0
$ sudo ansible-galaxy  collection install netapp.ontap -p /usr/share/ansible/collections
Process install dependency map
Starting collection install process
Installing 'netapp.ontap:21.14.1' to '/usr/share/ansible/collections/ansible_collections/netapp/ontap'
$ sudo ansible-galaxy  collection install ansible.posix -p /usr/share/ansible/collections

2. 准备 Ansible playbook

创建Ansible的清单文件和playbook文件等。

以下是每个目录和文件的构成和布置计划。

~/work
   ├─ inventory
   ├─ ontap_volume.yaml
   ├─ volume_delete.yaml
   └─ vars.yaml

首先,创建一个库存和两个Playbook文件。

$ mkdir ~/work
$ cat <<EOF > ~/work/inventory
ansitest01 ansible_host=127.0.0.1

[all:vars]
ansible_ssh_port=22
ansible_ssh_user=ec2-user
become=yes
ansible_ssh_common_args='-o StrictHostKeyChecking=no'
EOF
$ cat <<EOF > ~/work/ontap_volume.yaml
- name: ONTAP SVM NFS Volume Create
  hosts: ansitest01
  gather_facts: no
  become: yes
  vars_files:
    vars.yaml
  tasks:
    - name: make volume.
      na_ontap_volume:
        state          : present
        validate_certs : no
        https          : yes
        hostname: "{{ cluster_mgmt_ip }}"
        username: "{{ cluster_username }}"
        password: "{{ cluster_password }}"
        vserver: "{{ nfs_svm_name }}"
        name: "{{ nfs_volume_name }}"
        size: "{{ nfs_volume_size  }}"
        size_unit: gb
        space_guarantee: none
        aggregate_name: "{{ aggregate_name }}"
        volume_security_style: unix
        type: rw
        is_online: yes
        junction_path: "/{{ nfs_volume_name }}"
        snapshot_policy: none
      delegate_to: localhost

    - name: directory create
      ansible.builtin.file: path="{{ nfs_mount_dir }}" state=directory owner=ec2-user group=ec2-user mode=775

    - name: vm mount disk
      ansible.posix.mount:
        path: "{{ nfs_mount_dir }}"
        src: "{{ svm_nfs_ip }}:/{{ nfs_volume_name }}"
        fstype: nfs
        opts: _netdev
        state: mounted

    - name: directory modify
      ansible.builtin.file: path="{{ nfs_mount_dir }}" state=directory owner=ec2-user group=ec2-user mode=775
EOF
$ cat <<EOF > ~/work/volume_delete.yaml
- name: ONTAP SVM NFS Volume Delete
  hosts: ansitest01
  gather_facts: no
  become: yes
  vars_files:
    vars.yaml
  tasks:
    - name: unmount nfs volume
      ansible.posix.mount:
        path: "{{ nfs_mount_dir }}"
        src: "{{ svm_nfs_ip }}:/{{ nfs_volume_name }}"
        fstype: nfs
        opts: _netdev
        state: absent

    - name: delete directory
      ansible.builtin.file: path="{{ nfs_mount_dir }}" state=absent owner=ec2-user group=ec2-user mode=775

    - name: delete volume
      na_ontap_volume:
        state          : absent
        validate_certs : no
        https          : yes
        hostname: "{{ cluster_mgmt_ip }}"
        username: "{{ cluster_username }}"
        password: "{{ cluster_password }}"
        vserver: "{{ nfs_svm_name }}"
        name: "{{ nfs_volume_name }}"
        aggregate_name: "{{ aggregate_name }}"
      delegate_to: localhost
EOF
$

接下来,创建一个vars.yaml文件来描述参数。

根据FSxN环境,请更新vars.yaml文件上述的值并创建该文件。

需要更新的参数:
– 文件系统管理终端IP地址
– fsxadmin用户密码
– 存储虚拟机SVM名称
– 存储虚拟机NFS IP地址

$ cat <<EOF > ~/work/vars.yaml
# vars
    ansible_python_interpreter: /usr/bin/python3
    aggregate_name: aggr1
    cluster_mgmt_ip: <<ファイルシステムの管理エンドポイント IPアドレスを入力>>
    cluster_username: fsxadmin
    cluster_password: <<fsxadminのパスワードを入力>>
    nfs_svm_name: <<ストレージ仮想マシンのSVM名を入力>>
    svm_nfs_ip: <<ストレージ仮想マシンのNFS IPアドレスを入力>>
    nfs_volume_name: ansi_nfsvol01
    nfs_volume_size: 3
    nfs_mount_dir: "/home/ec2-user/mnttest"
EOF
$ 

3. 执行Ansible(创建卷和NFS挂载)

运行Ansible,在FSx for NetApp ONTAP上创建一个NFS卷。
在运行过程中,将显示执行目标信息的输入提示,通过输入所需信息,将在FSx for NetApp Ontap上创建一个NFS卷。

另外,我正在EC2实例上进行配置,以便在~/.ssh/id_rsa文件中进行公钥认证的ssh连接。如果使用密码认证,请在执行时添加–ask-pass选项来应对。

$ cd ~/work
$ ansible-playbook -i inventory ontap_volume.yaml

PLAY [ONTAP SVM NFS Volume Create] *************************************************************************************************************************************************************

TASK [make volume.] ****************************************************************************************************************************************************************************
changed: [ansitest01]

TASK [directory create] ************************************************************************************************************************************************************************
changed: [ansitest01]

TASK [vm mount disk] ***************************************************************************************************************************************************************************
changed: [ansitest01]

TASK [directory modify] ************************************************************************************************************************************************************************
changed: [ansitest01]

PLAY RECAP *************************************************************************************************************************************************************************************
ansitest01                 : ok=4    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

$ df -h |grep mnttest
<<NFS IPアドレス>>:/ansi_nfsvol01   2.9G  320K  2.9G    1% /home/ec2-user/mnttest
$ cd /home/ec2-user/mnttest
$ echo "test" >> testfile
$ cat testfile
test
$ 

如果在执行Ansible时出现“连接超时”的错误,可能是因为TCP 443端口的通信被阻止了。您可以检查安全组的设置来解决此问题。

当你确认 Ansible 执行完之后,可以看到已经创建了 NFS 卷,并在你创建的目录中进行了 NFS 挂载。

4. 使用 Ansible 执行(删除卷 & 取消 NFS 挂载)

这次我们将使用Ansible,执行一个playbook来卸载并删除卷。


$ cd ~/work
$ ansible-playbook -i inventory volume_delete.yaml

PLAY [ONTAP SVM NFS Volume Delete] *************************************************************************************************************************************************************

TASK [unmount nfs volume] **********************************************************************************************************************************************************************
changed: [ansitest01]

TASK [delete directory] ************************************************************************************************************************************************************************
ok: [ansitest01]

TASK [delete volume] ***************************************************************************************************************************************************************************
changed: [ansitest01]

PLAY RECAP *************************************************************************************************************************************************************************************
ansitest01                 : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

$ df -h |grep mnttest
$ ls  /home/ec2-user/mnttest
ls: /home/ec2-user/mnttest にアクセスできません: No such file or directory
$

可以确认卷已被卸载,并且已删除为挂载而创建的目录。

参考资料:每个存储虚拟机的用户创建

在创建新的卷作为参考时,可以创建一个FSx for NetApp ONTAP的存储虚拟机用户。在使用Ansible执行时,可以使用在此处创建的用户而不是使用fsxadmin来运行Ansible的playbook。

$ ssh <<ファイルシステムの管理エンドポイント IPアドレス>> -l fsxadmin
$ security login role create -role <<Role名>> -cmddirname volume -access all -query "" -vserver <<SVM名>>
$ security login role create -role <<Role名>> -cmddirname "event generate-autosupport-log" -access all -query "" -vserver <<SVM名>>
$ security login create -user-or-group-name <<ユーザ名>> -application ssh -authentication-method password -role <<Role名>> -vserver <<SVM名>>
$ security login create -user-or-group-name <<ユーザ名>> -application ontapi -authentication-method password -role <<Role名>> -vserver <<SVM名>>

如果要使用创建的用户,请在vars.yaml文件中的值中进行反映。除了用户名和密码之外,还需要将文件系统管理终端IP地址更改为存储虚拟机管理IP地址。

总结

我将介绍如何使用Ansible在Amazon FSx for NetApp ONTAP上自动创建和挂载NFS卷的步骤。

这次我们使用了fsxadmin用户,但根据介绍的参考资料,也可以为每个FSx for NetApp Ontap存储虚拟机创建用户并运行Ansible。在这种情况下,用户可以自动化进行卷创建、挂载操作等,并进行操作以实现自动化使用。

我认为,将存储单元本身的自动化与服务器端的设置等一系列自动化机制整合在一起,可以使使用更加方便。