ironic对configdrive的支持

作者 Billy 日期 2017-04-20
ironic对configdrive的支持

ironic对configdrive的支持

openstack能为虚拟机设置网络、keypair、分区等等内容,但是对裸金属的支持如何呢?

对虚拟机的配置主要是用了cloud-init软件(官方推荐),当然亦可以自己写脚本来支持。

对裸金属节点也是一样,至少newton版本还是通过cloud-init来执行对主机的配置。既然如此,openstack又是如何将传入的密码、网络等参数传递到裸金属节点上的呢?

对ironic了解的人知道,ironic是独立于openstack的一套系统,有2个服务:openstack-ironic-api、openstack-ironic-conductor,他有自己的一套数据库。创建ironic云主机对ironic来说,仍然是由nova-compute传来的命令,这个nova-compute是支持ironic驱动的。

ironic云主机的创建时,会将node中instance_info字段更新为云主机的信息,格式为json,这其中就有configdrive。

大家不禁会想,configdrive不是个文件么?怎么通过存入一条数据来传递呢?这就体现了openstack的知识渊博。

首先,openstack会判断是否需要生成configdrive,如果需要,那么组装、生成文件(其实是一个不小的文件堆),然后用gzip压缩算法对其进行压缩,压缩成字符串后再用base64编码,通过rest接口传过来入库。

由于我们要自己实现一套conductor,所以我对这段configdrive编码进行了一系列研究。base64解码并gzip解压后,生成了一个文件,这个文件类型让我非常恼火,因为使用好压软件是可以打开的,但是用代码怎么也敲不开,试了许多种文件类型,最后将其传到linux后发现可挂载,终于意识到是iso类型… 但java对iso类型无爱,也只能是上传至tftp服务器后由裸金属节点主动下载挂载后操作了,当然这是由脚本执行的。

openstack-ironic-conductor正常会对其进行解码、解压,然后再挂载至裸金属节点上。

下面是configdrive文件的结构:

meta_data.json

{
    "admin_pass": "199001122373",
    "random_seed": "NQWogxECH5Y50kZf5X3+2rUNlEYrPSP5ZXpqD/0ej/pQCCKBjeBHBGoXqJK9CC6aVOIHzeNXPQgWG1gk5dX4V/iuOTGCpxTZMacMgB+c4jW9Flfn8948TlInuy7zK/cmkw9E1JwAv/4oaFc70RbJc3xkE9kwTxFAyECzEkfQ1xYDN6qz6b2unmoDHVsjUiMid5OxgVGjCiGFHIB4UWe943a7v+/odPxbMnhz/tHV3OTovbfbMacprp5gnUo1QwpjQvbMQGoygqSUBt8C1Oo+Xc+xwvZjhw1fQ0xw6ivwFw6PVqqSbVmJQWtGMTo6bfY+PLhNGbpBlKlUcCGkoMe4CE5hf03gdclC+4VEY+TXJ5s/wpxCsx/5xNtdc7FjVeewtQPxXY5apb3lpQuHK3pUIbwEmWJes9YVbuPwIRhLsDx1Zz4reufWD/9KWuAT4u8PEmJALmN4Gkc4SSUv92Uos2ILJSGGaFasbKOHaeu+EGWVYujxa8olH71+MoiVMnws4D2AbhSC77BXC1JdikxQni6TOJIAABvhNUg+K94Y+zkGEOPYikfZNuTK0zXet6fOmjdTE476X8Kjdl1qr/XimzzQ+ujn8ZY8PLTh6JkpLw0AAxqCPlo6Lng1WWRnV0nwSjzcnuGXei4YwFHf3nbO2JPulwtHyYicHbmC3+rcS5c=",
    "uuid": "ee26d71e-70da-4da8-9924-2883fe7d4003",
    "availability_zone": "nova",
    "hostname": "test.novalocal",
    "launch_index": 0,
    "devices": [],
    "project_id": "cf97c2d4b7634bb59bd2e4f8f128b54b",
    "name": "test"
}

network_data.json

{
    "services": [{
        "type": "dns",
        "address": "202.107.117.11"}],
    "networks": [{
        "network_id": "8db1ace5-e180-4735-a7db-3cc5a7474e1b",
        "link": "tap8bd5d063-60",
        "type": "ipv4_dhcp",
        "id": "network0"
    }],
    "links": [{
        "ethernet_mac_address": "90:fb:a6:06:17:dc",
        "mtu": 1500,
        "type": "ovs",
        "id": "tap8bd5d063-60",
        "vif_id": "8bd5d063-6075-4068-bf2b-94c12a22f891"
    }]
}