使用Ansible进行NetApp Solidfire存储器的配置

使用Ansible配置NetApp Solidfire存储

NetApp积极开发Ansible模块,并为NetApp Solidfire存储的ElementOS提供了大量的模块。
Solidfire可以通过GUI轻松操作,但在执行重复工作或添加大量卷时,使用API或Ansible会更方便。

在这篇文章中,我们以Ansible自动化存储操作为例,介绍了从引入Ansible到Linux服务器作为Ansible管理服务器的角色,并执行简单Playbook的过程。

假设

我正在以下环境中测试。

    • Cent 7.7

 

    • Solidfire 12.2

 

    • Ansible 2.10

 

    • Python 3.6.8

 

    solidfire-sdk-python 1.7.0.152

此外,本文中所述的步骤和PlayBook并不能保证其运作。
希望您在根据各个环境进行测试和确认后,以自己的责任使用。

尝试一下

    1. 在 Linux 服务器上安装 Ansible。

 

    1. 执行一个简单的 playbook。

 

    执行一个创建多个卷的 playbook。

1. 安装Ansible

首先,我们要准备一个用于执行Ansible的管理服务器。

我們可以參考 NetApp 網站上提供的解說,從安裝到執行 playbook 的步驟來進行操作。

NetApp Ansible “getting-install-ansible”页面可以被翻译为以下中文表达:

NetApp Ansible “安装 Ansible” 页面。

正如前提中提到的那样,本文将介绍使用CentOS 7的操作示例。

$ sudo yum install epel-release -y
$ sudo yum install python3 -y
$ sudo pip3 install --upgrade pip setuptools
$ sudo pip3 install ansible-base
$ sudo pip3 install netapp-lib solidfire-sdk-python requests

Ansible 2.10开始,除了一些Base模块外,大部分模块都是通过Ansible Collection提供的。
我们通过ansible-galaxy命令安装了用于NetApp的模块,并使其可以运行。

$ sudo ansible-galaxy collection install netapp.ontap netapp.elementsw -p /usr/share/ansible/collections
$ sudo chmod +rx /usr/share/ansible/collections

如果出现 “sudo: ansible-galaxy: 找不到命令” 的错误,则可能是因为“/usr/local/bin”路径未被正确设置到sudo的PATH中,请确认sudo PATH的设置。

现在,Ansible已经安装并且可以使用Solidfire模块(ElementSoftware)了。

试着执行简单的playbook。

我会创建一个简单的Ansible playbook来创建一个卷。

使用《na_elementsw_check_connections》模块,从安装了Ansible的Linux服务器上,进行与Solidfire的连接确认。

文件准备。

首先,创建一个操作目录来存放playbook文件。

$ mkdir -p ~/ansible/tasks ~/ansible/vars
$ cd ~/ansible/tasks/

在tasks目录下创建一个名为sample.yaml的文件。

---
- name: SF Playbook
  hosts: localhost
  connection: local
  gather_facts: no
  tasks:
    - name: sf check connection
      na_elementsw_check_connections:
        hostname: "<< Solidfire Management VIP >>"
        username: "<< Solidfire ユーザ名 >>"
        password: "<< Solidfire パスワード >>"
      register: result

执行playbook

我将尝试执行ansible-playbook命令。
下面是成功执行时的示例运行结果。

$ cd ~/ansible/tasks
$ ansible-playbook  sample.yaml
[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'

PLAY [SF Playbook] *****************************************************************************************************

TASK [sf check connection] *********************************************************************************************
ok: [localhost]

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

$ 

3. 执行创建多个卷的playbook。

然后,我们将创建一个 playbook 来执行以下操作,以便为 Linux 服务器提供 iSCSi 卷。

    1. 创建两个iSCSI卷

 

    创建VAG(卷访问组),将Linux服务器的Initiator与卷进行关联

使用的参数值如下所示。

パラメータ名値備考ボリューム名sfvol01 , sfvol02
ボリュームサイズ100GB
VAG名sfvag01
Initiatoriqn.1994-05.com.redhat:fc7281d07007

Ansible的参数也可以放在另一个文件中。
将通用参数和可变参数放在单独的文件中是非常方便的。

准备文件

这次我们将在~/ansible目录下的vars目录下创建三个参数文件,在tasks目录下创建一个playbook文件。

~/ansible
├─ tasks
|  └─ main.yaml
└─ vars
   ├─ sf-common.yaml
   ├─ sf-volume.yaml
   └─ sf-vag.yaml

首先,在/ansible/vars目录下创建三个参数文件:sf-common.yaml、sf-volume.yaml和sf-vag.yaml。

cluster_mvip      : "<< Solidfire Management VIP >>"
cluster_login     : "<< Solidfire ユーザ名 >>"
cluster_pass      : "<< Solidfire パスワード >>"

sf_volume_create_list:
  - { name: sfvol01, size: 100 }
  - { name: sfvol02, size: 100 }

vag_create_list:
  - { name: sfvag01, ini: "iqn.1994-05.com.redhat:fc7281d07007", volid: [ sfvol01,sfvol02 ] }

下一步,在~/ansible/tasks目录下准备main.yaml文件。

---
- name: SF Volume Create
  hosts: localhost
  connection: local
  gather_facts: no
  vars:
    volume_account_id : "1"
  vars_files:
    - ../vars/sf-common.yaml
    - ../vars/sf-vag.yaml
    - ../vars/sf-volume.yaml
  tasks:
    - name: Create Volume
      na_elementsw_volume:
        hostname: "{{ cluster_mvip }}"
        username: "{{ cluster_login }}"
        password: "{{ cluster_pass }}"
        state: present
        name: "{{ item.name }}"
        account_id: "{{ volume_account_id }}"
        qos: {minIOPS: 100, maxIOPS: "15000", burstIOPS: "15000"}
        size: "{{ item.size }}"
        size_unit: gb
        enable512e: True
      with_items:
        - "{{ sf_volume_create_list }}"

    - name: Create Volume Access Group
      na_elementsw_access_group:
        hostname: "{{ cluster_mvip }}"
        username: "{{ cluster_login }}"
        password: "{{ cluster_pass }}"
        state: present
        name: "{{ item.name }}"
        initiators: "{{ item.ini }}"
        volumes: "{{ item.volid }}"
        account_id: "{{ volume_account_id }}"
      with_items:
        - "{{ vag_create_list }}"

现在已经准备好执行playbook了。

执行playbook

使用准备好的文件来执行ansible-playbook命令。

$ cd ~/ansible/tasks
$ ansible-playbook main.yaml
[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'

PLAY [SF Volume Create] *******************************************************************************************************************

TASK [Create Volume] **********************************************************************************************************************
changed: [localhost] => (item={'name': 'sfvol01', 'size': 100})
changed: [localhost] => (item={'name': 'sfvol02', 'size': 100})

TASK [Create Volume Access Group] *********************************************************************************************************
changed: [localhost] => (item={'name': 'sfvag01', 'ini': 'iqn.1994-05.com.redhat:fc7281d07007', 'volid': ['sfvol01', 'sfvol02']})

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

$

经过此步骤,已成功创建了卷,并且已经实施了来自已注册的Initiator的访问权限。

在playbook中,有两个任务被执行,每个任务分别执行以下两个模块。
使用”na_elementsw_volume”模块创建新卷,
使用”na_elementsw_access_group”模块将初始器和卷关联并注册到VAG中。

由于Solidfire的准备工作已经完成,所以可以从服务器端检测到iSCSI卷,并且已经处于可以挂载和使用的状态。
这次只为一个服务器关联和注册了一个Initiator,但是如果增加参数文件的卷或VAG列表,也可以批量创建和注册多个Initiator用于多台服务器的卷。

总结

我试图自动化存储端在Linux服务器上挂载iSCSI卷所需的最低必要工作。这次主要考虑使用Ansible模块来保持简单,但实际上考虑将其角色化可能更合适。

如果你对此感兴趣的话,还有很多其他模块可供选择,并且它们都在Ansible的集合页面上公开发布。请务必尝试一下。

广告
将在 10 秒后关闭
bannerAds