OpenStack中虚拟机信息注入

2014-02-05

本博客所有文章采用的授权方式为 自由转载-非商用-非衍生-保持署名 ,转载请务必注明出处,谢谢。

声明:
本博客欢迎转发,但请保留原作者信息!
新浪微博:@Lingxian_kong;
博客地址:孔令贤的博客;
内容系本人学习、研究和总结,如有雷同,实属荣幸!

虚拟机上如果跑业务,启动时不可避免的要从外界获取一些信息,在OpenStack中,这些信息通常是,密钥信息, 网络信息,metadata, root密码,自定义文件等。这些信息获取来源有如下几种。

Config Drive

Nova可以配置为,将userdata和metadata信息写入一种特殊的配置驱动–config drive,当虚拟机启动时自动挂载,虚拟机可以从该驱动获取信息(比如虚拟机id,主机名或user data),当DHCP服务不可用时,通常使用Config Drive传递网络配置信息(IP地址,掩码,或者网关)。

config drive可以被任何允许挂载ISO 9660或VFAT文件系统的镜像使用。特别的,如果一个镜像内包含cloud-init,就会自动从config drive中获取userdata和metadata;否则,必须使用自定义脚本完成挂载和读取操作。

cloud-init的数据源通常有:EC2(169.254.169.254)、Config Drive(OpenStack)、Alt cloud(RHEVm和vSphere)等

使用config drive的2种途径:
1、在nova boot命令中显式的指定--config-drive=true,如下,使用config drive传递userdata,2个文件,2对metadata

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

登录到虚拟机config drive目录下看到如下内容(忽略ec2文件夹):

$ ls
openstack/2013-08-10/meta_data.json 
openstack/2013-08-10/user_data 
openstack/content/0000 
openstack/content/0001 
openstack/latest/meta_data.json 
openstack/latest/user_data

meta_data.json中的内容:

{
    "availability_zone": "nova",
    "files": [
        {
            "content_path": "/content/0000",
            "path": "/etc/network/interfaces"
        },
        {
            "content_path": "/content/0001",
            "path": "known_hosts"
        }
    ],
    "hostname": "test.novalocal",
    "launch_index": 0,
    "name": "test",
    "meta": {
            "role": "webservers"
            "essential": "false"
    },
    "public_keys": {
        "mykey": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDBqUfVvCSez0/Wfpd8dLLgZXV9GtXQ7hnMN+Z0OWQUyebVEHey1CXuin0uY1cAJMhUq8j98SiW+cU0sU4J3x5l2+xi1bodDm1BtFWVeLIOQINpfV1n8fKjHB+ynPpe1F6tMDvrFGUlJs44t30BrujMXBe8Rq44cCk6wqyjATA3rQ== Generated by Nova\n"
    },
    "uuid": "83679162-1378-4288-a2d4-70e13ec132aa"
}

2、或者,在nova配置文件/etc/nova/nova.conf中配置force_config_drive=true(或者是always),在虚拟机启动时自动配置config drive

需要注意的是,如果使用config drive的默认配置,每个计算节点上必须安装genisoimage程序

config drive默认使用 ISO 9660 文件系统,如果要配置为VFAT(不常用),需要配置config_drive_format=vfat

附1,自定义脚本修改root密码,允许ssh登录,cloud-config版本:

#cloud-config
chpasswd:
list: |
   root:passw0rd
expire: False
ssh_pwauth: True
hostname: host001
runcmd:
- [ service, ssh, restart ]

附2,自定义脚本修改ubuntu密码,允许ssh登录,bash版本

#!/bin/sh
passwd ubuntu<<EOF
passw0rd
passw0rd
EOF
sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
service ssh restart

Neutron Metadata Service

前面提到cloud-init的数据源,第一个便是EC2,在OpenStack中是通过metadata service实现,关于metadata service的具体实现,可以参见我之前的博客

相关的配置
nova.conf:
service_neutron_metadata_proxy: 如果使用namespace,配置为True,默认是False
neutron_metadata_proxy_shared_secret: 必须与Neutron的metadata_agent.ini文件中的配置项一致,用于对消息的签名进行认证

从安全角度考虑,即使配置了neutron_metadata_proxy_shared_secret,也尽量避免使用nova-api实例暴露metadata服务。建议针对metadata服务,运行单独的nova-api,仅允许从内部管理网络访问。在nova.conf中的enabled_apis中配置。

neutron metadata_agent.ini:
nova_metadata_ip: Nova metadata server的IP地址
nova_metadata_port: 服务端口,默认8775
metadata_proxy_shared_secret: 与nova保持一致


参考链接:
officical documentation: http://docs.openstack.org/user-guide/content/config-drive.html
Red Hat Enterprise Linux OpenStack Platform 4: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux_OpenStack_Platform/4/html/End_User_Guide/config-drive.html
很详细的一篇blog,基于Havana版本: http://kimizhang.wordpress.com/2014/03/18/how-to-inject-filemetassh-keyroot-passworduserdataconfig-drive-to-a-vm-during-nova-boot/

文章评论

comments powered by Disqus


章节列表