使用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并不能保证其运作。
希望您在根据各个环境进行测试和确认后,以自己的责任使用。
尝试一下
-
- 在 Linux 服务器上安装 Ansible。
-
- 执行一个简单的 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 卷。
-
- 创建两个iSCSI卷
- 创建VAG(卷访问组),将Linux服务器的Initiator与卷进行关联
使用的参数值如下所示。
ボリュームサイズ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的集合页面上公开发布。请务必尝试一下。