【OpenStack 虚拟机初始化user-data & Cloud-init】

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

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

[html] view plain copy

  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

[html] view plain copy

  1. metadata_listen=10.11.0.16

/etc/neutron/metadata_agent.ini

[html] view plain copy

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

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

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

第一步:glance 创建image

[html] view plain copy

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

[plain] view plain copy

  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 添加。

[html] view plain copy

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

  1. [[email protected] ~]# ssh [email protected]
  2. Last login: Thu Apr  3 02:07:24 2014 from 10.20.1.3
  3. [[email protected] ~]$ 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. [[email protected] ~]$ cat /userdata
  10. one test about user data
  11. [[email protected] ~]$ ll /userdata
  12. -rwxrwxrwx. 1 root root 25 Apr  3 02:07 /userdata
  13. [[email protected] ~]$ 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

时间: 2024-10-13 05:17:53

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

openstack虚拟机修改IP地址

1).查找虚拟机的网络端口 mysql> use neutron; mysql> select * from ports where device_id="3ab73261-82ce-4b9a-9a1c-519624e19dc2"; +----------------------------------+--------------------------------------+------+--------------------------------------+-

openstack虚拟机内文件遭破坏的急救方案

一.场景: openstack虚拟机存放于ceph存储,由于用户将系统的grub误删除,导致系统无法正常引导.现在用户要求抢救文件. 二.可行的方案: 1.将虚拟机保存为镜像,将镜像转换成云硬盘,将云硬盘挂载到其他虚拟机上镜像抢救. 优点:依赖默认的dashboard就能完成操作,较为简单,不需要openstack命令行基础: 缺点:只能抢救文件,不能修复原系统. 2.将ceph中 虚拟机对应的rbd映射到到本地,挂载为本机的一个目录,进行抢救工作 优点:可以直接修复原虚拟机的系统: 缺点:需要

Openstack 虚拟机修改error状态为active

OpenStack虚拟机由于一些特殊原因导致进入error状态,比如宿主机宕机,docker容器故障等等, 此时我们无法在界面上对虚拟机进行其他操作了,只能删除重建,但是如果是已经在用的虚拟机,那就要想办法恢复,有一些人是直接通过后台数据库直接修改数据,这种方式总觉得不安全,有一个方法更安全,就是直接通过nova命令的 reset-state子命令,这里要特别注意,子命令后面还可以加状态参数,比如 --active ,原来一直不知道,以为这个命令没有办法修改状态,后面发现可以加参数,这个问题就好

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

1 快照的概念一般对快照的理解就是能够将系统还原到某个瞬间,这就是快照的作用.快照针对要保存的数据分为内存快照和磁盘快照,内存快照就是保存当前内存的数据,磁盘快照就是保存硬盘的数据.快照针对保存方式又分为内部快照和外部快照.内部快照:是指快照信息和虚拟机存在同一个qcow2镜像中,使用单个的 qcow2 的文件来保存快照和快照之后的改动.这种快照是 libvirt 的默认行为,现在的支持很完善(创建.回滚和删除),但是只能针对 qcow2 格式的磁盘镜像文件,而且其过程较慢等.外部快照:是指做快

别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(3)

四.Nova-compute 步骤17:nova-compute接收到请求后,通过Resource Tracker将创建虚拟机所需要的资源声明占用 步骤18:调用Neutron API配置Network,虚拟机处于Networking的状态 需要注意的是,这一步虽然是配置Network,但是主要是数据结构的准备,真正的设备并没有创建. 由于在创建虚拟机的时候,我们指定了将虚拟机放到哪个private network里面,因而在创建真正的设备之前,所有的信息都需要准备好. 这里的知识点设计Netw

别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(2)

二.nova-api 步骤3:nova-api接收请求 nova-api接收请求,也不是随便怎么来都接收的,而是需要设定rate limits,默认的实现是在ratelimit的middleware里面实现的. 然而有时候,我们希望实现distributed rate-limiting,从而Turnstile是一个不错的选择. https://github.com/klmitch/turnstilehttp://pypi.python.org/pypi/turnstile 步骤4:对Token的

虚拟机下 solr7.1 cloud 集群搭建 (手动解压和官方脚本两种方式)

准备工作: vmware workstation 12,OS使用的是ubuntu16.04,三台虚拟机搭建一个solr集群,zookeeper共用这三台虚拟机组成zookeeper集群. zookeeper的版本为3.4.10,solr版本为7.1,不使用tomcat,使用solr自带的jetty.jdk版本为1.8.0_151. 第一步:虚拟机的建立 选择默认配置即可,内存我配置的2G一台,1CPU,网络采用NAT,DHCP自动分配.建好一台虚拟机后,我们可以去配置一些基本环境,如Jdk等,然

十二、openstack虚拟机创建流程

一.创建虚拟机拓扑图 二.流程讲解 虚拟机创建过程: 界面或命令行通过RESTful API向keystone获取认证信息. keystone通过用户请求认证信息,并生成auth-token返回给对应的认证请求. 界面或命令行通过RESTful API向nova-api发送一个boot instance的请求(携带auth-token). 4.   nova-api接受请求后向keystone发送认证请求,查看token是否为有效用户和token. keystone验证token是否有效,如有效

如何修改openstack虚拟机密码

1.虚拟机创建时设置密码 计算节点安装以下软件包 yum install libguestfs python-libguestfs libguestfs-tools-c 配置计算节点nova配置文件/etc/nova/nova.conf,添加如下选项 [libvirt] inject_password=true inject_key=true inject_partition=-1 重启计算节点的nova服务 systemctl restart openstack-nova-compute li