fengjian
作者fengjian·2021-03-18 13:38
系统工程师·ips

用Ansible实现PowerVC虚机自动化部署

字数 7294阅读 2963评论 0赞 1

本文通过简单示例介绍如果使用Ansible实现PowerVC环境上的虚机自动部署。

Ansible 是一款功能强大且易于使用的自动化工具,他的特点主要有以下几个:

  • 基于 Python 开发,实现了批量系统配置、批量程序部署、批量运行命令等功能
  • 基于模块工作,各种功能的模块非常丰富
  • 不需要部署 server 和 agent ,对托管主机的要求低,基于 Python 和 SSH 工作,目前多数操作系统上是默认安装的
  • 使用 yaml 语言定制剧本 playbook ,可读性高 ,通俗易懂
  • ansible 在社区的活跃度高

PowerVC 是 K1 Power 上的高级 IaaS 云解决方案,使用 PowerVC 可以简化 Power Systems 环境资源虚拟化和高可用的管理,这里面包括统一管理 Power服务器、存储和网络资源。通过 PowerVC 可以实现:

  • 网络管理,存储管理,卷管理,虚机镜像管理(捕获,导入,导出)
  • 虚机全生命周期管理(创建,启停,维护)
  • 计划内动态分区迁移( LPM ),计划外远程分区重启( Remote Restart )
  • 云用户自服务管理,动态资源优化( DRO ),自动重新平衡主机组资源
  • PowerVC 提供丰富的接口,方便上层云管对接,轻松实现异构云 / 混合云 / 多云环境

PowerVC 是基于OpenStack 技术的,具有友好的 GUI 管理界面与丰富的 REST API ,可以很方便的和 Ansible 对接,实现从虚机配置到应用部署再到运维管理的全程自动化。使用 Ansible 实现 PowerVC 虚机自动化部署,既可以使用 Ansible 附带的 OpenStack 模块,也可以使用 Ansible uri 模块直接调用 PowerVC REST API ,下面就简单说明一下两种方法的使用。

使用 OpenStack 模块

Ansible 拥有丰富的 openstack 模块,但对 PowerVC 来说,并不是所有模块都支持。在创建虚机的实验过程中我们主要用的模块有以下这些:

  • openstack.cloud.compute_flavor
  • openstack.cloud.compute_flavor_info
  • openstack.cloud.network
  • openstack.cloud.network_info
  • openstack.cloud.port
  • openstack.cloud.port_info
  • openstack.cloud.server
  • openstack.cloud.server_info
  • openstack.cloud.volume
  • openstack.cloud.volume_info
  • openstack.cloud.server_volume
    ......

对于 openstack 模块的说明可以查询 Ansible 官网

我的测试环境使用的是 ansible 2.10.4 和 openstacksdk 0.49.0 。

测试准备工作如下:

复制 PowerVC 管理节点的 /etc/pki/tls/certs/powervc.crt 至本地,本例中为 /root/powervc_172.16.103.157.crt

根据 PowerVC 管理节点的 /opt/ibm/powervc/powervcrc 文件设置本例中的 vars.yml 文件如下:

### PowerVC Details
PowerVC_env:
  OS_IDENTITY_API_VERSION     : 3
  OS_AUTH_URL                 : "https://172.16.103.157:5000/v3/"
  OS_CACERT                   : "/root/powervc_172.16.103.157.crt"
  OS_REGION_NAME              : "RegionOne"
  OS_PROJECT_DOMAIN_NAME      : "Default"
  OS_PROJECT_NAME             : "ibm-default"
  OS_TENANT_NAME              : "ibm-default"
  OS_USER_DOMAIN_NAME         : "Default"
  OS_USERNAME                 : "root"
  OS_PASSWORD                 : "rootroot"
  OS_COMPUTE_API_VERSION      : 2.46
  OS_NETWORK_API_VERSION      : 2.0
  OS_IMAGE_API_VERSION        : 2
  OS_VOLUME_API_VERSION       : 2

创建虚机的 playbook 示例如下:

- hosts:
    - localhost
  vars_files:
    - ../vars/vars.yml 
  environment: "{{ PowerVC_env }}"
  tasks:
    - name: Create an SSH Key Pair
      openstack.cloud.keypair:
        state: present
        name: new-ssh-key
        public_key_file: "/root/.ssh/id_rsa.pub"
    
    - name: Create VM
      openstack.cloud.server:
        state: present
        availability_zone: "group980"
        image: "c0d022c0-d146-4553-ac20-7399e831f85a"
        flavor: "tiny"
        network: "demo_network"
        name: "new_vm"
        key_name: "new-ssh-key"
        timeout: 2000
      async: 2000
      poll: 0
      register: vm_sleeper
    
    - name: Check Status
      async_status: jid={{ vm_sleeper.ansible_job_id }}
      register: job_result
      until: job_result.finished
      retries: 2000
      delay: 10

其中:
availability_zone 为 PowerVC 中的主机组
image 为 PowerVC 中的镜像 ID
flavor 为 PowerVC 中定义的计算模板名称
network 为 PowerVC 中定义的网络名称

执行结果如下:

使用 PowerVC REST API

PowerVC 提供了丰富的 REST API ,可以实现所有管理功能。 Ansible 可以通过 uri 模块调用 PowerVC REST API ,实现虚机自动化的安装部署。

关于 PowerVC REST API 可以参考官方文档
https://www.ibm.com/support/knowledgecenter/SSVSPA_1.4.4/com.ibm.powervc.cloud.help.doc/powervc_pg_kickoff_cloud.html

本例中的 vars.yml 文件内容如下:

### PowerVC Details
PowerVC_env:
  OS_IDENTITY_API_VERSION     : 3
  OS_AUTH_URL                 : "https://172.16.103.157:5000/v3/"
  OS_CACERT                   : "/root/powervc_172.16.103.157.crt"
  OS_REGION_NAME              : "RegionOne"
  OS_PROJECT_DOMAIN_NAME      : "Default"
  OS_PROJECT_NAME             : "ibm-default"
  OS_TENANT_NAME              : "ibm-default"
  OS_USER_DOMAIN_NAME         : "Default"
  OS_USERNAME                 : "root"
  OS_PASSWORD                 : "rootroot"
  OS_COMPUTE_API_VERSION      : 2.46
  OS_NETWORK_API_VERSION      : 2.0
  OS_IMAGE_API_VERSION        : 2
  OS_VOLUME_API_VERSION       : 2

### Host Group
openstack_availability_zone   : "group980"

### Network
network_id                    : "5d85efd9-c7e8-4a5b-b74a-8fa6c56f4abd"

### Storage Connectivity Groups
scg_id                        : "f0344fa3-ab6f-496e-802c-f84680437390"

### Compute Templates
flavor_id                     : "e6a7aeab-7141-4f22-a48d-c239bc16c04f"

### Image
image_id                      : "c0d022c0-d146-4553-ac20-7399e831f85a"

### VM info
vm_name                       : "new_vm_restapi"

创建虚机的 playbook 文件如下:

- hosts:
    - localhost
  vars_files:
    - ../vars/vars.yml 
  environment: "{{ PowerVC_env }}"
  tasks:

    - name: Set Variable POWERVC
      set_fact: POWERVC="{{ PowerVC_env.OS_AUTH_URL.split('/')[2] }}"
    
    - name: Get PowerVC Token
      uri:
        url: "{{ PowerVC_env.OS_AUTH_URL }}/auth/tokens"
        method: POST
        validate_certs: no
        headers:
          Content-Type: "application/json"
          Accept: "application/json"
          Vary: "X-Auth-Token, X-Subject-Token"
        body_format: json
        body: "{{ lookup('template', '../templates/body_auth.json.j2') }}"
        return_content: yes
        status_code: 201
      register: token
    
    - name: Set Variable TOKEN
      set_fact: TOKEN="{{ token['x_subject_token'] }}"
    
    - name: Set Variable TENANT
      set_fact: TENANT="{{ token['json'].token.project.id }}"

    - name: Create VM
      uri:
        url: "https://{{ POWERVC }}/powervc/openstack/compute/v2.1/{{ TENANT }}/servers"
        method: POST
        validate_certs: no
        headers:
          Content-Type: "application/json"
          X-Auth-Token: "{{ TOKEN }}"
        body_format: json
        body: "{{ lookup('template', '../templates/body_server_new.json.j2') }}"
        return_content: yes
        status_code: 202
      register: serverinfo
    
    - name: Get VM status
      uri:
        url: "{{ serverinfo.location }}"
        method: GET
        validate_certs: no
        headers:
          Content-Type: "application/json"
          X-Auth-Token: "{{ TOKEN }}"
        return_content: yes
        status_code: 200
      register: result
      until: result.json.server.status == "ACTIVE"
      retries: 200
      delay: 10

其中引用了两个 template 文件,内容分别如下:

body_auth.json.j2:

{  
   "auth":{  
      "scope":{  
         "project":{  
            "domain":{  
               "name":"{{ PowerVC_env.OS_PROJECT_DOMAIN_NAME }}"
            },
            "name":"{{ PowerVC_env.OS_PROJECT_NAME }}"
         }
      },
      "identity":{  
         "password":{  
            "user":{  
               "domain":{  
                  "name":"{{ PowerVC_env.OS_PROJECT_DOMAIN_NAME }}"
               },
               "name":"{{ PowerVC_env.OS_USERNAME }}",
               "password":"{{ PowerVC_env.OS_PASSWORD }}"
            }
         },
         "methods":[  
            "password"
         ]
      }
   }
}

body_server_new.json.j2:

{
  "server":{
    "name":"{{ vm_name }}",
    "imageRef":"{{ image_id }}",
    "availability_zone":"{{ openstack_availability_zone |default('Default Group') }}",
    "flavorRef":"{{ flavor_id }}",
    "networks":[
      {
        "uuid":"{{ network_id }}"
      }
    ]
  }
}

执行结果:

以上简单示例了如何使用 Ansible 实现 PowerVC 虚机自动部署,其它功能的实现与示例类似。由于目前PowerVC对Ansible openstack模块的支持上有一定限制,还是建议使用 REST API 方式来实现。 REST API 的功能更全也更灵活。

后续会介绍更多 Ansible 与 K1 Power 结合的自动化管理实践。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广