使用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编写自动化代码,或者使用开源工具。

003.png

想干什么?可以吗?

    • Rocky LinuxへのAnsibleのInstall

 

    • Ansibleを使ってONTAPの管理

 

    Ansibleを使い基本的な疎通確認

Ansible是什么?

通过Python制作的配置管理工具,可以自动化服务器、网络交换机、存储等设备的配置更改和构建工作,从而提高各种流程的效率。
其特点包括以下几点:

    • YAML形式で記述する事による設定ファイルの可読性の高さ (Simple)

SSH接続介して接続する事によるエージェントレス構成 (Agentless)

多くのOSや製品をコントロールできるマルチレイヤ対応 (Powerful)

在下图中的Ansible Galaxy是一个用于下载和共享角色和集合(模块、插件、角色)的网站,您还可以从这里下载和使用管理NetApp存储的集合。

qiita-square

YAML文件的基本书写方式

在Ansible中,用于描述对受控主机执行的操作的Playbook采用了YAML格式进行编写。以下是YAML的基本书写规则:

    • — で開始して、… で終わらせる(任意)

 

    • タブは使用できないため、代わりにスペースを使用

 

    • Pythonと同じ様に括弧を使わない入れ子構造

 

    • キーバリュー型である”キー: 値”でデータを表す

 

    -を並べることでリスト表現が可能
002.png

在文章中的构建环境

本文使用的是以下版本来构建。

    • Rocky Linux : 9.1

 

    • Python : 3.9.14

 

    • Ansible (Core): 2.14.1

 

    • netapp-lib : 2021.6.25

 

    netapp.ontap : 22.1.0

以下是对环境的描述:

qiita-square

设定步骤

创建适用于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存储。

广告
将在 10 秒后关闭
bannerAds