示例:
import httplib
import json
import base64 tenant_id='xxx'
token='xxx'
compute_host="xxx"
compute_port=""
name="xzcloud"
flavorRef="984017df-6cac-4020-8cdd-f284d89a331c"
imageRef="45f8ac31-0c1c-4f7c-8144-0c561d4de98f"
user_data="""#!/bin/bash
env
echo "export AAAAAA=1234567890" >> ~/.bashrc
echo "export BBBBBB=0123456789" >> ~/.bashrc
source ~/.bashrc
env
""" user_data = base64.encodestring(user_data) conn = httplib.HTTPConnection(compute_host+":"+compute_port)
headers = {"Content-type":"application/json","X-Auth-Token":token}
params = ({
"server": {
"availability_zone": "nova", # 写死
"name": name, # 虚拟机名字
"flavorRef": flavorRef, # 虚拟机规格ID,虚拟机预置之后提供
"user_data": user_data, # 虚拟机启动之后需要执行的脚本,需要base64编码
"config_drive": True, # 写死
"imageRef": imageRef # 虚拟机镜像ID,虚拟机预置之后提供
}
})
conn.request("POST", "/v2/"+tenant_id+"/servers", body=json.JSONEncoder().encode(params), headers=headers)
response = conn.getresponse()
data = response.read()
data = json.loads(data,encoding='UTF-8')
print data

有的时候我们希望在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章节。

  1. $ curl 169.254.169.254
  2. 1.0
  3. 2007-01-19
  4. 2007-03-01
  5. 2007-08-29
  6. 2007-10-10
  7. 2007-12-15
  8. 2008-02-01
  9. 2008-09-01
  10. 2009-04-04
  11. 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和端口上, 如下所示

  1. 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:8775

10.11.0.16  是metadata api listen ip address

注意两个相关的配置项

/etc/nova/nova.conf

  1. metadata_listen=10.11.0.16

/etc/neutron/metadata_agent.ini

  1. nova_metadata_ip = 10.11.0.16

Nova boot :上传user-data,并cloud-init注入数据

把我们需要的脚本、参数配置等等写入文本文件, 通过--user-data 上传到nova metadata server上,然后利用镜像的cloud init注入数据, nova中语法为:

  1. nova boot  --user-data /filepath/filename ...

首先找个已安装cloud init包的镜像,本文使用Fedora 20, 可以在http://cloud.fedoraproject.org/ 下载,

第一步:glance 创建image

  1. 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的一个例子, 为一段脚本,其他格式可参见文章末尾的参考资料

  1. #!/bin/bash
  2. echo "one test about user data" >>userdata
  3. chmod 777 userdata
  4. useradd -m me
  5. echo -e 'me\tALL=(ALL)\tNOPASSWD: ALL' >> /etc/sudoers

第三步:boot虚拟机, 注入初始化数据

注意:本例中利用--key-name参数传入公钥, 实现无密码ssh, 用户名为fedora,本例中root_key为一keypair,用nova keypair-add 添加。

  1. nova boot --key-name root_key  --user-data ./user-data.txt --flavor 2 --image aad51d83-6398-4d18-89c8-5302993363b5 test_f20

第四步:ssh 进入虚拟机进行验证

  1. [root@chen ~]# ssh fedora@10.20.1.33
  2. Last login: Thu Apr  3 02:07:24 2014 from 10.20.1.3
  3. [fedora@test-f20 ~]$ curl 169.254.169.254/latest/user-data
  4. #!/bin/bash
  5. echo "one test about user data" >>userdata
  6. chmod 777 userdata
  7. useradd -m me
  8. echo -e 'me\tALL=(ALL)\tNOPASSWD: ALL' >> /etc/sudoers
  9. [fedora@test-f20 ~]$ cat /userdata
  10. one test about user data
  11. [fedora@test-f20 ~]$ ll /userdata
  12. -rwxrwxrwx. 1 root root 25 Apr  3 02:07 /userdata
  13. [fedora@test-f20 ~]$ su me
  14. Password:

也可以check下/etc/sudoers

其他相关参考资料:

user-data的支持格式:https://help.ubuntu.com/community/CloudInit

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

参考资料:
http://cloudinit.readthedocs.io/:http://cloudinit.readthedocs.io/en/latest/index.html

云平台openstack中,cloudinit安装使用:http://www.it165.net/os/html/201404/7848.html

用cloud-init制作的镜像root无法登陆问题:http://linuxfun.me/?p=1552

Basic Hardening with User Data / Cloud-Init:http://openstack.prov12n.com/basic-hardening-with-user-data-cloud-init/

OpenStack Nova:虚拟机初始化user-data & Cloud-init:http://blog.csdn.net/juvxiao/article/details/22664457

CloudInit:https://help.ubuntu.com/community/CloudInit

OpenStack解决非UEC镜像的虚拟机cloud-init不工作不能自动修改主机名称不能注入user data:http://blog.csdn.net/networm3/article/details/8559504

 

【OpenStack 虚拟机初始化user-data & Cloud-init】的更多相关文章

  1. openstack cloud init set password

    设置代理和password #!/bin/bash cd /home/ubuntu wget otcloud-gateway.bj.intel.com/script.tar.gz ]; then cu ...

  2. OpenStack 虚拟机冷/热迁移功能实践与流程分析

    目录 文章目录 目录 前文列表 虚拟机迁移的应用场景 需要迁移的虚拟机数据类型 虚拟机迁移的存储场景 文件存储 块存储 非共享存储 迁移的类型 迁移的方式 执行虚拟机冷迁移 冷迁移日志分析 执行虚拟机 ...

  3. 使用salt-cloud创建openstack虚拟机

    salt-cloud也是基于openstack来做的,它可以支持多种云的使用.比如:Aliyun.Azure.DigitalOcean.EC2.Google Compute Engine.HP Clo ...

  4. 自开发Web应用和SAP Customer Data Cloud Identity服务的集成

    今天的文章继续由SAP成都研究院的云时代女王,Aviva给大家分享关于SAP Customer Data Cloud的一些使用经验. Aviva之前的文章可以在本文末尾处获得. 下面是她的正文. 大家 ...

  5. OpenStack 虚拟机冷/热迁移的实现原理与代码分析

    目录 文章目录 目录 前文列表 冷迁移代码分析(基于 Newton) Nova 冷迁移实现原理 热迁移代码分析 Nova 热迁移实现原理 向 libvirtd 发出 Live Migration 指令 ...

  6. OpenStack 虚拟机的磁盘文件类型与存储方式

    目录 文章目录 目录 虚拟机的磁盘文件类型 虚拟机磁盘文件的存放方式 QCOW2 镜像格式与 qemu-img 指令 参考文章 虚拟机的磁盘文件类型 Nova 虚拟机的虚拟磁盘主要包含有 Root D ...

  7. OpenStack虚拟机冷迁移与热迁移

    一.虚拟机迁移分析 openstacvk虚拟机迁移分为冷迁移和热迁移两种方式. 1.1冷迁移: 冷迁移(cold migration),也叫静态迁移.关闭电源的虚拟机进行迁移.通过冷迁移,可以选择将关 ...

  8. OpenStack虚拟机快照和增量备份实现

    1 快照的概念一般对快照的理解就是能够将系统还原到某个瞬间,这就是快照的作用.快照针对要保存的数据分为内存快照和磁盘快照,内存快照就是保存当前内存的数据,磁盘快照就是保存硬盘的数据.快照针对保存方式又 ...

  9. openstack 镜像初始化root登录密码

    在创建虚拟机的时候 如下: #!/bin/sh passwd root<<EOF engine engine EOF huangyi替换成你的密码 注意下面的配置驱动一定要勾上,不然虚拟机 ...

随机推荐

  1. android ARM 汇编学习—— 在 android 设备上编译c/cpp代码并用objdump/readelf等工具分析

    学习 android 逆向分析过程中,需要学习 Arm 指令,不可避免要编写一些 test code 并分析其指令,这是这篇文档的背景. 在目前 android 提供的开发环境里,如果要编写 c / ...

  2. 嵌入式上 iscsi实现

    前言 去年公司设备(haisi3516)上需要提供iscsi的功能,于是花了几天时间探究了下.linux内核(2.6.xx)支持iscsi,只是我发现当时我们设备的内核编译时没有选上,于是重新编译了内 ...

  3. IpmiTool常见问题解决办法

    IpmiTool常见问题解决办法 http://blog.csdn.net/c9h8o4/article/details/17138029 关于IPMI的几个问题 http://blog.csdn.n ...

  4. TCP的可靠性

    原因: 1.确认和重传机制 2.序列号 3.流量控制(窗口) 4.拥塞控制(慢启动,拥塞避免,快速重传,快速恢复) http://blog.csdn.net/baidu_35692628/articl ...

  5. lucene api

    设置重新打开索引目录(清空) IndexWriterConfig conf = new IndexWriterConfig(new WhitespaceAnalyzer());conf.setOpen ...

  6. DevExpress控件-GridControl根据条件改变单元格/行颜色(Dev GridControl 单元格着色) z

    DevExpress控件-数据控件GridControl,有时我们需要根据特定条件改变符合条件的行或者单元格颜色达到突出显示目的,现在动起鼠标跟我一起操作吧,对的,要达到这个目的您甚至都不用动键盘. ...

  7. JAVA MAC 配置

    1下载对应的JDK,并安装 查看是否成功 java -version 2配置环境变量 sudo vim /etc/profile 入一下内容: JAVA_HOME="/Library/Jav ...

  8. Codeforces 626 B. Cards (8VC Venture Cup 2016-Elimination Round)

      B. Cards   time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  9. [POJ1801]Formula Racing(模拟)

    Formula Racing Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 289   Accepted: 77 Descr ...

  10. [BZOJ 3233] 找硬币

    Link: BZOJ 3233 传送门 Solution: 在本蒟蒻看来算是一道比较神的$dp$了 一开始转移方程都没看出来…… 首先,如果确定了最大面值,是能推出其他面值的所有可能值的 从而发现最大 ...