• 将元数据存储在配置盘中
    • 使用本功能的要求,和本功能的几个注意事项
    • 启用和访问配置盘
    • 配置盘中的内容
    • OpenStack元数据格式
    • EC2元数据格式
    • 用户数据
    • 配置盘格式

    将元数据存储在配置盘中

    您可以让OpenStack将元数据写入到一个特殊的“配置盘”中,实例启动时可以挂载这个盘来读取配置信息。一般情况下,这些信息是由元数据服务提供的。注意,这里的元数据和用户数据不同。

    这个功能的一个用例是在没有DHCP的情况下给实例分配IP地址。例如,您可以通过配置盘将IP地址配置传给实例,实例挂载上这个盘以后,读取其中的IP信息,before you configure the network settings for the instance.

    使用本功能的要求,和本功能的几个注意事项

    要使用配置盘,您的主机和镜像必须满足以下要求。

    对主机的要求:

    • 以下虚拟机管理器支持配置盘:libvirt,XenServer,Hyper-V和VMware。
    • 如果要在libvirt,XenServer或者VMware中使用配置盘,您必须先在每个compute host上安装genisoimage。否则,实例无法正常启动。
      您需要用mkisofs_cmd来标记您安装genisoimage程序的路径。如果genisoimage和nova-compute服务在一个路径下,就不用设置了。
    • 如果您要在Hyper-V下使用配置盘,您必须用mkisofs_cmd来标记您安装的mkisofs.exe的全路径。此外,您还要在hyperv中设置qemu_img_cmd值,将其指向qemu-img这个命令的安装位置。

    对镜像的要求:

    • 带有新版本cloud-init包的镜像能够自动获取到配置盘中的元数据。0.7.1版本的cloud-init包能用在Ubuntu和Fedora系的操作系统上,比如说RHEL。
    • 如果镜像中没有安装cloud-init包,您必须定制一下这个镜像:写一个能执行各种动作的脚本,比如在启动的时候挂载配置盘,从盘中读数据,然后做一些诸如导入公钥的动作。您可以在本文档中读到更多配置盘中数据格式的内容。

    几个注意事项:

    • 不要依赖配置盘中的EC2元数据,因为这些内容在新版本中可能会被移除。例如,不要依赖ec2文件中的文件。

    • 在您创建可读取配置盘的镜像时,如果有openstack文件夹下有多个文件夹,您一定要选择用户支持的最高版本的API(以日期标注)。比如说,如果您的镜像支持2012-03-05,2012-08-05和2013-04-13版本,先尝试使用2013-04-13版本,如果该版本不存在,再尝试前面的版本。

    启用和访问配置盘

    1. 如果要启用配置盘,将--config-driver true参数传给nova boot命令即可。

    在下面的例子里,我们启用了配置盘,将用户数据,两个文件,以及两个键/值元数据对传给了它,这些都可以在配置盘中获取到。

    1. $ nova boot --config-drive true --image my-image-name --key-name mykey \
    2. --flavor 1 --user-data ./my-user-data.txt myinstance \
    3. --file /etc/network/interfaces=/home/myuser/instance-interfaces \
    4. --file known_hosts=/home/myuser/.ssh/known_hosts \
    5. --meta role=webservers --meta essential=false

    您也可以把Compute服务配置成每次都使用配置盘。在/etc/nova/nova.conf文件中配置如下条目:

    1. force_config_drive=true

    注意:
    如果某位用户将--config-drive true参数传递给了nova boot命令,连管理员也没法禁用。

    1. 如果您的实例支持通过标签来访问磁盘,您可以以/dev/disk/by-label/configurationDriveVolumeLabel来挂载配置盘。在下面的例子中,配置盘的标签是config-2
    1. # mkdir -p /mnt/config
    2. # mount /dev/disk/by-label/config-2 /mnt/config

    注意:
    为了对配置盘提供支持,您使用的CirrOS至少在0.3.1版本以上。
    如果您的客户机不用udev,是不会有/dev/disk/by-label的。
    您可以用blkid命令来查找配置盘对应的块设备。比如,如果您用CirrOS镜像,在m1.tiny的配置下启动了实例,配置盘应该是/dev/vdb

    1. # blkid -t LABEL="config-2" -odevice
    2. /dev/vdb
    3. # mkdir -p /mnt/config
    4. # mount /dev/vdb /mnt/config

    配置盘中的内容

    下面这个例子中,配置盘中的内容如下:

    1. ec2/2009-04-04/meta-data.json
    2. ec2/2009-04-04/user-data
    3. ec2/latest/meta-data.json
    4. ec2/latest/user-data
    5. openstack/2012-08-10/meta_data.json
    6. openstack/2012-08-10/user_data
    7. openstack/content
    8. openstack/content/0000
    9. openstack/content/0001
    10. openstack/latest/meta_data.json
    11. openstack/latest/user_data

    配置盘中有哪些内容取决于您使用nova boot时传入了哪些参数。

    OpenStack元数据格式

    下面的内容展示了openstack/2012-08-10/meta_data.jsonopenstack/latest/meta_data.json文件。这两个文件是完全一样的。为了方便阅读,内容已经做过排版。

    1. {
    2. "availability_zone": "nova",
    3. "files": [
    4. {
    5. "content_path": "/content/0000",
    6. "path": "/etc/network/interfaces"
    7. },
    8. {
    9. "content_path": "/content/0001",
    10. "path": "known_hosts"
    11. }
    12. ],
    13. "hostname": "test.novalocal",
    14. "launch_index": 0,
    15. "name": "test",
    16. "meta": {
    17. "role": "webservers",
    18. "essential": "false"
    19. },
    20. "public_keys": {
    21. "mykey": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDBqUfVvCSez0/Wfpd8dLLgZXV9GtXQ7hnMN+Z0OWQUyebVEHey1CXuin0uY1cAJMhUq8j98SiW+cU0sU4J3x5l2+xi1bodDm1BtFWVeLIOQINpfV1n8fKjHB+ynPpe1F6tMDvrFGUlJs44t30BrujMXBe8Rq44cCk6wqyjATA3rQ== Generated by Nova\n"
    22. },
    23. "uuid": "83679162-1378-4288-a2d4-70e13ec132aa"
    24. }

    请注意您使用nova boot参数时配置的参数--file /etc/network/interfaces=/home/myuser/instance-interfaces产生的效果。这个文件的内容被保存在了openstack/content/0000文件中,路径信息指定为/etc/network/interface/,保存在meta_data.json中。

    EC2元数据格式

    下面的内容展示了ec2/2009-04-04/meta_data.jsonec2/latest/meta_data.json文件。这两个文件是完全一样的。为了方便阅读,内容已经做过排版。

    1. {
    2. "ami-id": "ami-00000001",
    3. "ami-launch-index": 0,
    4. "ami-manifest-path": "FIXME",
    5. "block-device-mapping": {
    6. "ami": "sda1",
    7. "ephemeral0": "sda2",
    8. "root": "/dev/sda1",
    9. "swap": "sda3"
    10. },
    11. "hostname": "test.novalocal",
    12. "instance-action": "none",
    13. "instance-id": "i-00000001",
    14. "instance-type": "m1.tiny",
    15. "kernel-id": "aki-00000002",
    16. "local-hostname": "test.novalocal",
    17. "local-ipv4": null,
    18. "placement": {
    19. "availability-zone": "nova"
    20. },
    21. "public-hostname": "test.novalocal",
    22. "public-ipv4": "",
    23. "public-keys": {
    24. "0": {
    25. "openssh-key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDBqUfVvCSez0/Wfpd8dLLgZXV9GtXQ7hnMN+Z0OWQUyebVEHey1CXuin0uY1cAJMhUq8j98SiW+cU0sU4J3x5l2+xi1bodDm1BtFWVeLIOQINpfV1n8fKjHB+ynPpe1F6tMDvrFGUlJs44t30BrujMXBe8Rq44cCk6wqyjATA3rQ== Generated by Nova\n"
    26. }
    27. },
    28. "ramdisk-id": "ari-00000003",
    29. "reservation-id": "r-7lfps8wj",
    30. "security-groups": [
    31. "default"
    32. ]
    33. }

    用户数据

    openstack/2012-08-10/user_dataopenstack/latest/user_dataec2/2009-04-04/user-dataec2/latest/user-data这四个文件只有在您使用nova boot文件时传入了--user-data参数和用户数据文件时才会出现。

    配置盘格式

    默认的配置盘格式时ISO 9660。如果要显式地指定ISO 9660格式,请在/etc/nova/nova.conf文件中添加以下配置:

    1. config_drive_format=iso9660

    默认情况下,您只能将配置盘以硬盘的形式装载在实例上,而不能用光盘的形式。如果要以CD的形式装载,请在/etc/nova/nova.conf文件中添加以下配置:

    1. config_drive_cdrom=true

    为了提供对旧设备的支持,您还可以将配置盘设置为VFAT格式。您可能不会需要用到VFAT,因为ISO 9660已被绝大多数操作系统所支持。然而,要使用VFAT格式,请在/etc/nova/nova.conf文件中添加以下配置:

    1. config_drive_format=vfat

    如果您选择了VFAT,配置盘的大小将会是64 MB。

    注意:
    在当前的OpenStack版本中(Liberty),给用到config_drive的本地盘做热迁移的功能被禁用了,因为libvirt在复制只读盘时有bug。然而,如果我们使用VFAT格式作为config_drive的格式,热迁移的功能是可用的。