2017年3月22日星期三

OpenStack虚拟机信息注入

虚拟机上如果跑业务,启动时不可避免的要从外界获取一些信息,在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的途径:
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,在虚拟机启动时自动配置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保持一致

地点: 中国杭州市西湖区西湖 邮政编码: 310000