本文通过简单示例介绍如果使用Ansible实现PowerVC环境上的虚机自动部署。
Ansible 是一款功能强大且易于使用的自动化工具,他的特点主要有以下几个:
PowerVC 是 K1 Power 上的高级 IaaS 云解决方案,使用 PowerVC 可以简化 Power Systems 环境资源虚拟化和高可用的管理,这里面包括统一管理 Power服务器、存储和网络资源。通过 PowerVC 可以实现:
PowerVC 是基于OpenStack 技术的,具有友好的 GUI 管理界面与丰富的 REST API ,可以很方便的和 Ansible 对接,实现从虚机配置到应用部署再到运维管理的全程自动化。使用 Ansible 实现 PowerVC 虚机自动化部署,既可以使用 Ansible 附带的 OpenStack 模块,也可以使用 Ansible uri 模块直接调用 PowerVC REST API ,下面就简单说明一下两种方法的使用。
使用 OpenStack 模块
Ansible 拥有丰富的 openstack 模块,但对 PowerVC 来说,并不是所有模块都支持。在创建虚机的实验过程中我们主要用的模块有以下这些:
对于 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 条评论