openstack ironic ipa 以及用户镜像制作
ironic ipa 以及用户镜像制作
Openstack中的centos和ubuntu操作系统的镜像可以直接从社区直接下载下来使用,但是总是感觉有问题,cloud-init初始化程序是通用的,启动速度很慢,查了一下相关信息,发现是cloud-init进程会去访问外网一个地址,感觉使用起来用户体验很差。手工制作镜像是最符合实际使用需求的,想定制什么样的镜像都可以,但是有些费时费力。这里我尝试使用自动化镜像生成工具disk-image-builder(DIB)生成镜像,这个工具可以很方便的生成fedora和ubuntu系列的linux操作系统,对于windows不支持。
DIB是一个OpenStack工具,可以从https://git.openstack.org/cgit/openstack/diskimage-builder/tree/或 https://pypi.python.org/pypi/diskimage-builder/0.1.38 下载 。
DIB使用chroot的环境来构建镜像。目标是建立一个拥有Nova所需的所有组件的镜像,如trove所需的数据库镜像,ironic所需的支持硬件裸机的镜像。
Ironic Python Agent:简称 IPA,是一个运行在 RAMDisk 之上的 Python 服务,暴露 RESTful API 接收 Ironic Inspector 和 Ironic Conductor 的远程访问,完成裸机的自省与操作。
这里设计到两个镜像,一个是引导ramfs(ipa)镜像,一个是用户的系统镜像
基于一台CentOS 8 服务器 上面操作如下,diskimage-builder==3.6.0 对应生成的是centos8 的用户镜像 ,2.25.0 对应生成centos7的用户镜像。用户的镜像完全可以自己制作,不用走diskimage-builder。
#cd /opt/
#yum -y install python3 python3-devel qemu-img sudo git kpartx libguestfs-tools-c gcc gcc-c++ make #提供virt-sysprep
#pip3 install diskimage-builder==3.6.0 ironic-python-agent-builder==5.0.0
#export DIB_DEV_USER_USERNAME=devuser #初始用户名devuser
#export DIB_DEV_USER_PASSWORD=password #初始密码password
#export DIB_DEV_USER_PWDLESS_SUDO=YES #允许sudo
#export DIB_CLOUD_INIT_DATASOURCES="ConfigDrive, OpenStack" #cloud-init 的datasource是ConfigDrive, OpenStack
#export AUTHORIZE_SSH=true
#export DIB_PYTHON_VERSION=3
#export DIB_PYTHON=python3
构建IPA引导镜像(这里好像只能用8了,7好像不支持了),用于引导进入initramfs,后面再下载镜像写入磁盘
#ironic-python-agent-builder -o centos8-ipa-x86 --release 8 centos -e "devuser dynamic-login dhcp-all-interfaces"
构建裸机的用户系统镜像
#centos 7 (社区的好像制作不了7了)
#disk-image-create centos7 -o CentOS7.qcow2 dhcp-all-interfaces grub2 install-static cloud-init-datasources
#centos 8 +
#disk-image-create centos -o CentOS8.qcow2 dhcp-all-interfaces grub2 install-static cloud-init-datasources
问题排查
- 上面原来我是build centos7 的时候发现,无法构建,总是报错:/tmp/dib_build.IGfPWgcM/hooks/bin/extract-image: line 15: $4: unbound variable,原因是cloud.centos.org 官网改版了。所以最后我直接build centos8 的ipa了
#更改/usr/local/lib/python3.6/site-packages/diskimage_builder/elements/centos/root.d/10-centos-cloud-image
#将DIB_CLOUD_IMAGES和BASE_IMAGE_FILE为如下
DIB_CLOUD_IMAGES=${DIB_CLOUD_IMAGES:-https://cloud.centos.org/centos/7/images}
BASE_IMAGE_FILE=${BASE_IMAGE_FILE:-$(head -1 < <(curl -s https://cloud.centos.org/centos/7/images/ | grep -o "CentOS-.*${DIB_FLAVOR}-.*.qcow2" | awk -F'>' '{print $1}'|grep -v qcow2c|tr -d '"'| sort -r))}
- yum源问题
改用aliyun,中途遇到那里yum/dnf install失败就改成aliyun就行
- 提示 NetworkManager-initscripts-updown 找不到,把这个包改成ifup命令对应的包就行
{
"family": {
"redhat": {
"dhcp-client": "dhclient",
"ifupdown": "NetworkManager-initscripts-updown",
"ndisc6": ""
},
"gentoo": {
"dhcp-client": "net-misc/dhcpcd",
"ndisc6": "net-misc/ndisc6"
},
"suse": {
"dhcp-client": "dhcp-client"
},
"debian": {
"ifupdown": "ifupdown",
"ndisc6": "ndisc6"
}
},
"default": {
"dhcp-client": "isc-dhcp-client",
"ifupdown": "",
"ndisc6": ""
}
}
- python3.6 好像不支持了,所以我在 60-ironic-python-agent-ramdisk-install 里面把python3.6 源码升级到3.9.5 了
最终成功了,这真的是够费劲的,遇到各种问题,各种改脚本兼容。。。。。。。