定制和开发 Chef cookbook 实现部署多 Cinder LVM 节点
ICM 4.1 提供了方便快捷的方式允许用户定制自己的节点部署策略,同时也支持更新现有的配置策略到已经部署的节点上。 默认安装完 ICM 4.1 后,可以在 /opt/ibm/cmwo/chef-repo 目录找到 Chef 的 cookbook、role、recipe 以及 attribute 等相关目录。
ICM 4.1 的目前自带的 Cinder cookbook 支持用户创建一个指定大小的 Loop Device 作为 Cinder 的卷组。这个方法无法满足我们想将本地的整个硬盘或者整个分区作为目标卷,同时 Loop Device 的读写性能也无法和直接访问本地硬盘相比。
为了满足以上的需求,用户可以到目录/opt/ibm/cmwo/chef-repo/cookbooks/openstack-block-storage/下更改 attributes/default.rb 文件增加属性定义;然后在 recipes/volume.rb 文件中增加实现使用磁盘或者分区的处理逻辑。
首先我们需要定义两个默认的属性值。
use_local_disk: 指定是否采用 LVM 物理卷并指定本地硬盘的策略来创建 Cinder 卷组
local_disk: 指定具体利用哪个分区作为 Cinder 物理卷。
请参看如下代码改动:
.......
default['openstack']['block-storage']['volume']['create_volume_group'] = false
default['openstack']['block-storage']['volume']['iscsi_helper'] = 'tgtadm'
default['openstack']['block-storage']['volume']['iscsi_ip_address'] = node['ipaddress']
default['openstack']['block-storage']['volume']['iscsi_port'] = '3260'
default['openstack']['block-storage']['volume']['use_local_disk'] = false
default['openstack']['block-storage']['volume']['local_disk'] = nil
# Ceph/RADOS options
default['openstack']['block-storage']['rbd_pool'] = 'rbd'
default['openstack']['block-storage']['rbd_user'] = 'cinder'
default['openstack']['block-storage']['rbd_secret_uuid'] = nil
.......
接下来完善现有 cookbook 里面关于 LVM 部分的处理逻辑。 原来的逻辑指明当使用 LVMISCSIDriver 时,创建一个指定大小 (volume_size) 的 loop 设备文件。这点不符合我们的需求,我们的目标是希望指定磁盘或者分区做为 Cinder 的存储卷组。通过 local_disk_name 来指定磁盘或者分区信息,利用 pvcreate 命令来创建一个卷组,作为 Cinder 的存储卷组。
具体实现参考如下代码:
......
when 'cinder.volume.drivers.lvm.LVMISCSIDriver'
if node['openstack']['block-storage']['volume']['use_local_disk']
vg_name = node['openstack']['block-storage']['volume']['volume_group']
local_disk_name = node['openstack']['block-storage']['volume']['local_disk']
execute 'Create Cinder volume group' do
command "pvcreate #{local_disk_name}; vgcreate #{vg_name} #{local_disk_name}"
action :run
not_if "vgs #{vg_name}"
end
end
if node['openstack']['block-storage']['volume']['create_volume_group']
volume_size = node['openstack']['block-storage']['volume']['volume_group_size']
.......
如上 cookbook 更新完毕后,接下来,我们需要在/opt/ibm/cmwo/chef-repo/roles 目录定义一个新的 role 文件 ibm-os-block-storage-node.rb。通过定义新的 role,可以帮助我们通过指定 role 快速部署 Cinder LVM 节点。在这个文件中,我们会使用到上面更改后的 cookbook。具体内容如下:
name 'ibm-os-block-storage-node'
description 'IBM OpenStack storage node role
run_list(
'role[ibm-os-base]',
'role[os-base]',
'role[ibm-os-database-client-node]',
'role[os-block-storage-volume]',
'role[os-telemetry-agent-compute]'
)
将修改后的 cookbook 和 role 更新到 Chef 服务器中。
#knife cookbook upload openstack-block-storage
#knife role from file ibm-os-block-storage-node.rb