使用Ansible来管理Storage(ONTAP)的方法,第一步是在Rocky Linux上进行Ansible安装
首先
当管理对象设备增加时,配置和运营管理工作的负担也会增加。针对这一问题的解决方案之一是通过标准化和自动化工作,以少量人手执行更多任务,并防止人为错误的发生。
然而,即使要自動化日常任務,引入新工具或重新學習也是一個學習成本的障礙。因此,本文將介紹如何在Red Hat Enterprise Linux(RHEL)的克隆版Rockey Linux上安裝構建管理工具Ansible,以實現對NetApp Storage的操作系統ONTAP的自動化和效率化。我們將從安裝部分開始進行說明。
此外,NetApp在提供的ONTAP自动化管理工具中,存在一个名为OnCommand Workflow Automation(简称WFA)的工具。但是,WFA将在2022年1月停止提供。关于最新的WFA 5.1.1,将在2025年1月之前得到完全支持。然而,如果要使用2025年之后的自动化工具,则需要单独使用API编写自动化代码,或者使用开源工具。

想干什么?可以吗?
-
- Rocky LinuxへのAnsibleのInstall
-
- Ansibleを使ってONTAPの管理
- Ansibleを使い基本的な疎通確認
Ansible是什么?
通过Python制作的配置管理工具,可以自动化服务器、网络交换机、存储等设备的配置更改和构建工作,从而提高各种流程的效率。
其特点包括以下几点:
-
- YAML形式で記述する事による設定ファイルの可読性の高さ (Simple)
SSH接続介して接続する事によるエージェントレス構成 (Agentless)
多くのOSや製品をコントロールできるマルチレイヤ対応 (Powerful)
在下图中的Ansible Galaxy是一个用于下载和共享角色和集合(模块、插件、角色)的网站,您还可以从这里下载和使用管理NetApp存储的集合。

YAML文件的基本书写方式
在Ansible中,用于描述对受控主机执行的操作的Playbook采用了YAML格式进行编写。以下是YAML的基本书写规则:
-
- — で開始して、… で終わらせる(任意)
-
- タブは使用できないため、代わりにスペースを使用
-
- Pythonと同じ様に括弧を使わない入れ子構造
-
- キーバリュー型である”キー: 値”でデータを表す
- -を並べることでリスト表現が可能

在文章中的构建环境
本文使用的是以下版本来构建。
-
- Rocky Linux : 9.1
-
- Python : 3.9.14
-
- Ansible (Core): 2.14.1
-
- netapp-lib : 2021.6.25
- netapp.ontap : 22.1.0
以下是对环境的描述:

设定步骤
创建适用于ansible的用户
我们将创建一个用于Ansible安装和配置的用户。此外,我们将将用户添加到wheel组以授予sudo权限。
> sudo useradd -m ansible_user10
[sudo] ansible_user10 のパスワード:
> sudo usermod -aG wheel ansible_user10
2. 安装Ansible
使用上述创建的用户登录,并进行添加附加组件包和安装pip。
> sudo dnf install epel-release -y
> sudo dnf install python3-pip -y
在Ansible中,通常使用公钥认证进行连接,但我想要实现密码认证,所以我会引入sshpass。
> sudo dnf install sshpass
我們將進行Ansible的導入。
> sudo pip install ansible
引入NetApp原生的Python模块。
> sudo pip install netapp-lib solidfire-sdk-python six requests
我们将引入Ansible集合以管理NetApp存储,并进行集合目录的设置。
> sudo ansible-galaxy collection install netapp.ontap netapp.elementsw -p /usr/share/ansible/collections
> sudo chmod +rx /usr/share/ansible/collections
我会确认安装是否成功。
> ansible --version
ansible [core 2.14.1]
config file = None
configured module search path = ['/home/ansible_user10/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/lib/python3.9/site-packages/ansible
ansible collection location = /home/ansible_user10/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/local/bin/ansible
python version = 3.9.14 (main, Nov 7 2022, 00:00:00) [GCC 11.3.1 20220421 (Red Hat 11.3.1-2)] (/usr/bin/python3)
jinja version = 3.1.2
libyaml = True
> ansible-galaxy collection list
(中略)
# /usr/share/ansible/collections/ansible_collections
Collection Version
---------------- -------
netapp.elementsw 21.7.0
netapp.ontap 22.1.0
3. 创建设定文件
首先我想使用Ansible命令在Linux上执行ping操作,但在执行之前需要以下两种文件。
-
- Inventory (管理対象について記載)
- Playbook (実行する操作について記載)
创建库存
创建作业文件夹。
> mkdir anansible_work
> cd anansible_work
进行库存的创建。
本文旨在通过复制粘贴加编辑进行连接确认,故省略文件格式和详细写作方式的说明。
Inventory的格式有两种,如果是ini格式,如下所示。
在这个例子中,我们描述了连接目标作为自己和受控Linux,但由于没有准备DNS引用或hosts文件,所以我们包含了用于通信的IP地址。
文件名可以任意,没有问题。
> cat inventory.ini
Ansible ansible_host=172.16.10.180
Linux ansible_host=172.16.10.148
如果以YAML格式进行编写,则如下所示。
在YAML中,您可以选择使用—进行开头,并以… 结束。
> cat inventory.yml
---
all:
hosts:
Ansible:
ansible_host: 172.16.10.180
Linux:
ansible_host: 172.16.10.148
...
为了避免在使用ansible命令操作时被询问是否要保存主机的指纹,我们会先通过ssh登录并连接到受管理的目标。
> ssh user01@172.16.10.148
The authenticity of host 172.16.10.148 (172.16.10.148) can’t be established.
ED25519 key fingerprint is SHA256:XXXXX.
This key is not known by any other names
\\Are you sure you want to continue connecting (yes/no/[fingerprint])? #<=yesを入力
如果您想在进行SSH登录时不要求确认首次显示的指纹并建立连接,我们可以在Ansible操作用户的配置文件中进行无效设置。
从安全的角度来看,为了避免身份冒充,保留主机的指纹是更推荐的做法。
> mkdir ~/.ssh
> sudo vi ~/.ssh/config #以下のcatで表示された内容を記載
> cat ~/.ssh/config
host *
StrictHostKeyChecking no
> sudo chmod 600 ~/.ssh/config
以下是一种可能的汉语表述:
这段话的含义是什么?
创建Playbook
使用Ansible将想要在被管理的目标上执行的内容以YAML格式写入Playbook中。在本文中,我们将执行针对受管理的Linux和我自己(安装了Ansible的服务器)的ping操作。
> cat playbook_ping.yml
---
- hosts: Ansible
tasks:
- ping:
- hosts: Linux
tasks:
- ping:
如果在写有YAML格式的inventory.yml文件中,将两个主机名分为all组,请指定inventory.yml并执行以下此Playbool代码也可以实现将处理应用于这两个主机。
---
- hosts: all
tasks:
- ping:
...
4. 执行Playbook
使用ansible-playbook命令来执行Playbook。
使用-i选项可以指定Inventory文件。
在此示例中,我们使用密码认证而不是公钥认证来操作,因此在-u后面指定了连接目标终端上创建的用户名,并通过–ask-pass选项进行密码认证。
在本环境示例中,我们创建了一个名为”user01″的用户,分别在管理目标的两个主机上创建,并且密码相同。
只要每个受管对象有”ok=2″的输出,就可以确认通讯正常,就像下面的执行示例一样。
> ansible-playbook -i inventory.ini -u user01 playbook_ping.yml --ask-pass
SSH password: <=管理対象のSSH接続パスワードを入力
PLAY [Ansible] **********************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************
ok: [Ansible]
TASK [ping] *************************************************************************************************************************
ok: [Ansible]
PLAY [Linux] ************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************
ok: [Linux]
TASK [ping] *************************************************************************************************************************
ok: [Linux]
PLAY RECAP **************************************************************************************************************************
Ansible : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Linux : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
只需更改-i后面的指定,即可创建一个使用YAML格式的Inventory文件的示例,产生类似的行为。
ansible-playbook -i inventory.yml -u user01 playbook_ping.yml --ask-pass
创作用户以访问ONTAP(SVM)的API。
如果已经存在用户,可以使用该用户,但在ONTAP的集群管理中,我们会为目标SVM创建一个专门用于API访问的用户。这里以创建名为testuser的用户,并将其设为SVM的管理员角色cifs100为例。
> security login create -vserver cifs100 -user-or-group-name testuser -application http -authentication-method password -role vsadmin
Please enter a password for user 'testuser':
Please enter it again:
#以下のhttpのみのアクセスで利用できます。
> security login show -vserver cifs100 -user-or-group-name testuser
Vserver: cifs100
Second
User/Group Authentication Acct Authentication
Name Application Method Role Name Locked Method
-------------- ----------- ------------- ---------------- ------ --------------
testuser http password vsadmin no none
确认连接到ONTAP(SVM)。
撰写记录对ONTAP操作的Playbook时,有以下注意事项需要提及。
-
- collections:セクションを追加し利用するAnsibleコレクションを定義し、コレクションの場所をチェックできるようにする
-
- Interpreterの指定の追加
- Playbookが実行されるホストとしてlocalhost(もしくはAnsibleのInstallされているホスト名)を定義
在与服务器进行操作时,这一行将包含操作目标主机的主机名。然而,ONTAP(以及Element OS)不能使用ssh进行模块通信,而是会通过使用http或https从本地主机开始。
以下是样本Playbook,但需要修改的项目有以下4个点。
-
- hosts: AnsibleのInstallされているホスト名(localhost等)
-
- hostname: SVMのHTTPSアクセス用LIFのIP
-
- username: SVMへのAPIアクセス用のユーザ名
- password: SVMへのAPIアクセス用のユーザのパスワード
> cat playbook_svm_info.yml
- name: ONTAP Info
hosts: Ansible
collections: netapp.ontap
gather_facts: no
become: no
vars:
ansible_python_interpreter: /usr/bin/python3
tasks:
- name: run ONTAP gather facts for vserver info
na_ontap_rest_info:
hostname: 172.16.10.147
username: testuser
password: XXXXXX
https: true
validate_certs: false
use_rest: Always
gather_subset:
- svm/svms
执行Playbook。使用-v参数,SVM信息将作为执行结果显示。(使用-vvv参数可以查看更详细的信息)
> ansible-playbook -i inventory.yml -u user01 playbook_svm_info.yml --ask-pass -v
No config file found; using defaults
SSH password:
PLAY [ONTAP Info] *******************************************************************************************************************
TASK [run ONTAP gather facts for vserver info] **************************************************************************************
ok: [Ansible] => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"}, "changed": false, "ontap_info": {"svm/svms": {"_links": {"self": {"href": "/api/svm/svms?max_records=1024&fields="}}, "num_records": 1, "records": [{"_links": {"self": {"href": "/api/svm/svms/XXXXXXX"}}, "name": "cifs100", "uuid": "XXXXXXX"}]}}}
PLAY RECAP **************************************************************************************************************************
Ansible : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
参考和链接 jí
在NetApp公司网站中有关Ansible的信息
开始使用NetApp和Ansible:理解Playbooks
开始使用 NetApp 和 Ansible:第一个 Playbook 示例
使用Ansible来配置NetApp ONTAP存储。