要说ironic可以用来干什么,最简单最接近的一句话,我认为就是装机!当然还有一些其他的功能,从框架上也可以扩展,但目前看起来hardware provision最主要做的事都是
围绕装机做的,给裸机部署操作系统,以后ironic会不会发展成openstack家族里的hardware management不得而知,看HP会怎么发力。
rest 入口进来到/node/uuid/provision, 在ironic.api.controllers.v1.node.NodeStateController调用provision方法,根据PUT方法传进来的target,
到底是active,rebuild,deleted进行不同的动作:
如果“already being provisioned or decommissioned” 就raise exception,否则,active或者rebuild就执行do_node_deploy,是deleted就执行do_node_tear_down
看看do_node_deploy的过程:
在看之前先把PXE启动过程搞明白,从PXE启动部署OS的步骤是:
1. set 从PXE启动,向DHCP server索要ip,并得到引导程序的位置(tftp server),在prepare阶段生成的config文件会通过_link_mac_pxe_configs函数link到
PXE启动的mac address上
2.向tftp server索要引导程序,运行引导程序pxelinux.0,并从tftpserver上下载deploy_kernel和deploy_ramdisk运行,执行ramdisk(initrd)中
的脚本80-deploy-ironic,脚本内容可以在下面的链接找到:
https://github.com/openstack/diskimage-builder/blob/master/elements/deploy-ironic/init.d/80-deploy-ironic
3.“这个脚本运行在目标机上,它会找第一个找到的磁盘,然后用lvm那一套(tgt+iscsi工具)将磁盘挂在网上,同时写权限还是设置为ALL的。之后脚本会用curl通知ironic conductor可以写入镜像”(引用文章末尾自华为的link), 在脚本中会执行“do_vendor_passthru_and_wait”函数,其中使用curl call ironic的rest:
"$IRONIC_API_URL/nodes/$DEPLOYMENT_ID/vendor_passthru/$vendor_passhru_name",其中$vendor_passhru_name是”pass_deploy_info“方法,对应到
PXE的VendorPassthru中的方法
4.之后就能说通_continute_deploy方法为什么会执行这一系列动作:iscsi命令扫描新增的盘,接着会将镜像从conductor这一边写入目标机器的硬盘上,写完镜像后,会朝着目标机器的10000端口发一个通知。目标机收到通知后,会从lvm上卸载掉磁盘。ironic conductor接着会让目标机器重新pxe,此时给目标机器的kernel和initrd会改为和它磁盘镜像配套的那一份(程序中可追踪)
5.我们可以理解为将本地盘作为一个iscsi设备挂在后,将镜像传到iscsi设备上并做一些分区之类的工作
通过RPC将消息发到对应conductor上执行manager中ConductorManager的do_node_deploy,deploy之前要判断一下传入的是active还是rebuild,同时当前node的
provision state是active,error,deployfailed时,才能rebuild,当前不是nostate时不能进行active,当前node不能在maintenance状态
task.set_spawn_error_hook(self._provisioning_error_handler,node, previous_prov_state,previous_tgt_provision_state)
#前面提到这个是python with的语法糖,执行_do_node_deploy失败时执行操作_provisioning_error_handler
task.spawn_after(self._spawn_worker, self._do_node_deploy, task)
#执行_do_node_deploy
task.driver.deploy.prepare(task) #deploy前准备
判断是否是ipxe启动
_get_image_info 得到ramdisk和kernel,这里分为ramdisk和deploy_ramdisk, kernel和deploy_kernel在,kernel是配置时的xx.vmlinuz文件,ramdisk则是xx.initrd文件
(kernel和initrd必须使用社区的disk-image-builder工具来创建。因为ironic要在deploy用的initrd里面塞一点脚)其中ramdisk和kernel为在glance中的id,tftp server中的路径,
根据是否使用uefi,得到不同的template
create_pxe_config:生成PXE boot configuration file, 将pxe_config中的value代替template中的value,使用了jinjia2(python的template engine)
_cache_ramdisk_kernel :将ramdisk和kernel文件,使用了TFTPImageCache(传入image service为glance image_service, ironic/common/glance_service/v1/image_service, 跟进去可以发现使用的是glance client调用), 继承自ImageCache,调用fetch_image,最终fetch到本地
new_state = task.driver.deploy.deploy(task)#deploy
cache_instance_image:从glance上拿到image的镜像,比如centos的镜像,并check一下镜像是否满足大小要求
token = task.context.auth_token,创建一个token file写到tftpboot下的token-node.uuid文件中
拿到dhcp的provider,此处默认为neutron,同时指明tftpserver
设置从boot方式为pxe
执行reboot操作,reboot之后的操作就看前面PXE启动后过程中的讲解。
http://blog.csdn.net/canxinghen/article/details/41908959 这篇华为的文章讲的不错,顺便mark一下。