设为首页 收藏本站
查看: 1133|回复: 0

[经验分享] 【OpenStack 虚拟机初始化user-data & Cloud-init】

[复制链接]
发表于 2017-6-26 21:08:19 | 显示全部楼层 |阅读模式
示例:
import httplib
import json
import base64
tenant_id='xxx'
token='xxx'
compute_host="xxx"
compute_port="8774"
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章节。






[html] view plain copy




  • $ 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和端口上, 如下所示






[html] view plain copy




  • 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






[html] view plain copy




  • metadata_listen=10.11.0.16  
  /etc/neutron/metadata_agent.ini






[html] view plain copy




  • nova_metadata_ip = 10.11.0.16  

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






[html] view plain copy




  • nova boot  --user-data /filepath/filename ...
  首先找个已安装cloud init包的镜像,本文使用Fedora 20, 可以在http://cloud.fedoraproject.org/ 下载,
  第一步:glance 创建image






[html] view plain copy




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






[plain] view plain copy




  • #!/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 添加。






[html] view plain copy




  • nova boot --key-name root_key  --user-data ./user-data.txt --flavor 2 --image aad51d83-6398-4d18-89c8-5302993363b5 test_f20
  第四步:ssh 进入虚拟机进行验证






[plain] view plain copy




  • [iyunv@chen ~]# ssh fedora@10.20.1.33
  • 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:
  也可以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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-388394-1-1.html 上篇帖子: Openstack的HA解决方案【mysql集群配置】 下篇帖子: 7.openstack之mitaka搭建dashboard
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表