OpenStack Nova:虚拟机初始化user-data & Cloud-init
2014-04-03 11:40
435 查看
有的时候我们希望在boot虚拟机的时候能够对虚拟机做些配置, 比如配置网络, 写入文件, 下载一些包并安装等等, openstack中提供了实现这些的方法, 就是user-data 和Cloud-init。
user-data
在说user-data之前, 要先说下nova 的metadata api, 所谓metadata就是关于虚拟机的元数据,提供这个api主要是为了能够在虚拟机启动的时候能够实现一些信息的初始化。
在虚拟机内部使用curl命令, 可以得到如下结果, 它们是表示不同版本, 每个版本中包含meta-data和user-data, meta-data 中是包括虚拟机的各种基本信息, 如ip,磁盘,内存,hostname,public key, 安全组等设置, user-data主要是做一些参数设置, 和一些脚本, 如python脚本, 当用heat boot虚拟机,可以看到这样的user-data例子, user-data是能够实现instance个性化定制的基础, 它书写的格式有很多, 详细看cloud-init章节。
接下来将实际使用这些技术做个测试。
注意两个相关的配置项
/etc/nova/nova.conf
/etc/neutron/metadata_agent.ini
第一步:glance 创建image
第二步:创建user-data file
下面为user-data的一个例子, 为一段脚本,其他格式可参见文章末尾的参考资料
第三步:boot虚拟机, 注入初始化数据
注意:本例中利用--key-name参数传入公钥, 实现无密码ssh, 用户名为fedora,本例中root_key为一keypair,用nova keypair-add 添加。
第四步:ssh 进入虚拟机进行验证
OpenStack解决非UEC镜像的虚拟机cloud-init不工作不能自动修改主机名称不能注入user data
下面这篇文章讲了如何以cirros为例安装cloud init包,并使用的例子http://eccp.csdb.cn/blog/?p=68
file/meta/user-data注入数据http://docs.openstack.org/grizzly/openstack-compute/admin/content/instance-data.html#inserting_sshkeys
user-data
在说user-data之前, 要先说下nova 的metadata api, 所谓metadata就是关于虚拟机的元数据,提供这个api主要是为了能够在虚拟机启动的时候能够实现一些信息的初始化。在虚拟机内部使用curl命令, 可以得到如下结果, 它们是表示不同版本, 每个版本中包含meta-data和user-data, meta-data 中是包括虚拟机的各种基本信息, 如ip,磁盘,内存,hostname,public key, 安全组等设置, user-data主要是做一些参数设置, 和一些脚本, 如python脚本, 当用heat boot虚拟机,可以看到这样的user-data例子, user-data是能够实现instance个性化定制的基础, 它书写的格式有很多, 详细看cloud-init章节。
$ curl 169.254.169.254 1.0 2007-01-19 2007-03-01 2007-08-29 2007-10-10 2007-12-15 2008-02-01 2008-09-01 2009-04-04 latest关于metadata的相关信息, 也可以详细看EC2 文档 Instance Metadata and User Data
Cloud-init
数据准备好, 完成最后action的工作就必须cloud-init出马了, 它能够把这些数据在虚拟机boot的时候执行起来。关于cloud-init相关介绍与其所使用的user-data格式, 请看Ubuntu Cloudinit。接下来将实际使用这些技术做个测试。
保证能够与nova metadata api连通
回到OpneStack本身,要把user-data使用起来,要先保证能够在创建的虚拟机内部能够连接到nova的metadata api IP 地址,metadata app IP 沿用了亚马逊所用的169.254.169.254. 在OpenStack生产环境中, 我们是没有这个IP的, 需要利用以下命令把到169.254.169.254的请求路由到nova的metadata api实际的监听IP和端口上, 如下所示sudo iptables -t nat -A PREROUTING -d 169.254.169.254/32 -p tcp -m tcp--dport 80 -j DNAT --to-destination 10.11.0.16:877510.11.0.16 是metadata api listen ip address
注意两个相关的配置项
/etc/nova/nova.conf
metadata_listen=10.11.0.16
/etc/neutron/metadata_agent.ini
nova_metadata_ip = 10.11.0.16
Nova boot :上传user-data,并cloud-init注入数据
把我们需要的脚本、参数配置等等写入文本文件, 通过--user-data 上传到nova metadata server上,然后利用镜像的cloud init注入数据, nova中语法为:nova boot --user-data /filepath/filename ...首先找个已安装cloud init包的镜像,本文使用Fedora 20, 可以在http://cloud.fedoraproject.org/ 下载,
第一步:glance 创建image
glance image-create --name F20 --disk-format=qcow2 --container-format=bare --is-public=true --file=Fedora-x86_64-20-20131211.1-sda.qcow2
第二步:创建user-data file
下面为user-data的一个例子, 为一段脚本,其他格式可参见文章末尾的参考资料
#!/bin/bash echo "one test about user data" >>userdata chmod 777 userdata useradd -m me echo -e 'me\tALL=(ALL)\tNOPASSWD: ALL' >> /etc/sudoers
第三步:boot虚拟机, 注入初始化数据
注意:本例中利用--key-name参数传入公钥, 实现无密码ssh, 用户名为fedora,本例中root_key为一keypair,用nova keypair-add 添加。
nova boot --key-name root_key --user-data ./user-data.txt --flavor 2 --image aad51d83-6398-4d18-89c8-5302993363b5 test_f20
第四步:ssh 进入虚拟机进行验证
[root@chen ~]# ssh fedora@10.20.1.33也可以check下/etc/sudoers
Last login: Thu Apr 3 02:07:24 2014 from 10.20.1.3
[fedora@test-f20 ~]$ curl 169.254.169.254/latest/user-data
#!/bin/bash echo "one test about user data" >>userdata chmod 777 userdata useradd -m me echo -e 'me\tALL=(ALL)\tNOPASSWD: ALL' >> /etc/sudoers
[fedora@test-f20 ~]$ cat /userdata
one test about user data
[fedora@test-f20 ~]$ ll /userdata
-rwxrwxrwx. 1 root root 25 Apr 3 02:07 /userdata
[fedora@test-f20 ~]$ su me
Password:
其他相关参考资料:
user-data的支持格式:https://help.ubuntu.com/community/CloudInitOpenStack解决非UEC镜像的虚拟机cloud-init不工作不能自动修改主机名称不能注入user data
下面这篇文章讲了如何以cirros为例安装cloud init包,并使用的例子http://eccp.csdb.cn/blog/?p=68
file/meta/user-data注入数据http://docs.openstack.org/grizzly/openstack-compute/admin/content/instance-data.html#inserting_sshkeys
相关文章推荐
- Openstack 实现技术分解 (2) 虚拟机初始化工具 — Cloud-Init & metadata & userdata
- 【OpenStack 虚拟机初始化user-data & Cloud-init】
- CloudInit & User-Data
- android 修改ramdisk.img和init.rc && android启动后设置/data权限为770
- 错误:SQL Error: 1406, SQLState: 22001____Data truncation: Data too long for column 'add_user' at row 1
- 通过KVM_SET_USER_MEMORY_REGION操作虚拟机内存(Kernel 3.10.0 & qemu 2.0.0)
- [Angular & Web] Retrieve user data from Session
- art虚拟机:预编译->oat文件 /data/dalvik-cache/ art支持多dex-oat文件支持多dex
- userData && sessionStorage
- 在 AllUserData table 中查找 "people or group"
- MFC_为MFC对话框建立初始化函数BOOL HistoryData::OnInitDialog()
- 使用cloudbase-init初始化windows虚拟机
- 虚拟机开机报错:telling init to go to single user mode. init:rc main process killed by term signal init:rcs
- data too long for column 'Auser' at row 1
- Flex Application初始化顺序:pre ->init ->creat->app
- delphi 开发的系统在win7下出现的 'Invalid data type for 'UserPreferencesMask'的解决
- Android应用自定义User Data管理(将Settings下的"清除数据"变成"管理空间")
- 通过KVM_SET_USER_MEMORY_REGION操作虚拟机内存(Kernel 3.10.0 & qemu 2.0.0)
- android 修改ramdisk.img和init.rc && android启动后设置/data权限为770