http://niusmallnan.github.io/_build/html/

在创建虚拟机时候,通常我们需要让用户填写虚机系统的初始化密码,因为很多人并不习惯使用秘钥方式ssh登录, 设置其用户密码有很多种方式,诸如早期的inject-password,或是借助cloud-init, 甚至L版的 libvirt-set-admin-password 等方式, 本文就来介绍一下这几种方案,以及他们对应的使用场景。
inject方式

inject-passwd默认是被禁用的,因为他的使用场景受限,目前来看只能支持Qcow2镜像格式。

在对应的compute节点上修改nova-compute-conf:

#/etc/nova/nova-compute.conf

[libvirt]
virt_type=kvm
inject_password = true #add
inject_partition = -1 #add

restart nova-compute

修改horizon的配置文件,添加设置密码的界面:

OPENSTACK_HYPERVISOR_FEATURES = {
'can_set_mount_point': False,
'can_set_password': True, #here
}

通常根据上面的步骤,一般是可以实现ROOT密码注入的,如果失败,可以按照下面的方法调试一下,确保你的机器是安装libguestfs-tools。

建一台虚拟机,然后关闭该虚拟机:

$ cd /var/lib/nova/instance/xxxxxxxx/
$ export LIBGUESTFS_DEBUG=1
$ export LIBGUESTFS_TRACE=1
$ guestfish -a disk

guestfish可以打开一个虚机镜像,如果打开失败,一般是权限问题,那么nova进行inject-passwd时候也不会成功,可以使用如下方法解决:

# root
$ update-guestfs-appliance
$ usermod -G kvm -a nova
$ usermod -G root -a nova
$ chmod 0644 /boot/vmlinuz*

$ restart nova-compute

大部分OpenStack部署通常会使用Ceph做统一存储支持,这意味着虚机镜像格式是Raw格式,这种情况下inject-password方式就失去作用了。
cloud-init方式

这种方式需要给你的guest os 中的cloud-init组件打个patch,这个patch是这样的:

diff --git a/cloudinit/config/cc_set_passwords.py b/cloudinit/config/cc_set_passwords.py
index 4ca85e2..5b5cae4 100644
--- a/cloudinit/config/cc_set_passwords.py
+++ b/cloudinit/config/cc_set_passwords.py
@@ -44,6 +44,12 @@ def handle(_name, cfg, cloud, log, args):
else:
password = util.get_cfg_option_str(cfg, "password", None)

+ # use the admin_pass available in the ConfigDrive
+ if not password:
+ metadata = cloud.datasource.metadata
+ if metadata and 'admin_pass' in metadata:
+ password = metadata['admin_pass']
+
expire = True
pw_auth = "no"
change_pwauth = False
@@ -59,6 +65,8 @@ def handle(_name, cfg, cloud, log, args):
(user, _user_config) = ds.extract_default(users)
if user:
plist = "%s:%s" % (user, password)
+ #add change root password
+ plist = plist + "\nroot:%s" % password
else:
log.warn("No default or defined user to change password for.")

由于目前cloud-init还不能读取openstack传进来的admin_pass数据,所以得扩展一下。同时cloud.cfg中也要添加:

chpasswd: { expire: False }

这个能保证修改的密码不时过期的,否则vm启动后输入密码,系统让你重新修改才能进入。

boot vm时候,会给你生成一个随机adminPass,使用命令行时候可以看到:

nova boot –flavor 1 –image cirros –nic net-id=8b052b4a-840c-4b45-b96e-7980f7fa4a74 –meta key1=test –meta key2=hello vm-meta-inject
+————————————–+—————————————+
| Property | Value |
+————————————–+—————————————+
| OS-EXT-STS:task_state | scheduling |
| image | cirros |
| OS-EXT-STS:vm_state | building |
| OS-EXT-SRV-ATTR:instance_name | instance-0000001d |
| OS-SRV-USG:launched_at | None |
| flavor | m1.tiny |
| id | e82bf7a2-176e-4f9f-83d5-c3542a7ed48e |
| ................................
| adminPass | aPduEQ56Yu3t |
| ................................
| tenant_id | 1e888eccf99845f8bcf9a9730c83a669 |
| created | 2014-03-14T07:00:48Z |
| os-extended-volumes:volumes_attached | [] |
+————————————–+—————————————+

虚机在通过cloud-init获取元数据时可以使用api-metadata、ConfigDrive等方式,而借助cloud-init方式来初始化虚机密码则必须选择ConfigDrive方式, 因为ConfigDrive方式才会把adminPass字段传递给虚机。
libvirt-set-admin-password

这是L版的新特性,这种方式的本质是在虚拟机内部安装qemu-guest-agent来接受相关修改密码的指令,当然这种特性对我们各个中间件的版本是有要求的:

libvirt 1.2.16+ 宿主机
python-libvirt 1.2.16+ 宿主机
qemu-guest-agent 2.3+ 虚机内部

使用ubuntu安装L版nova-compute,nova-compute对应的第一个版本是2:12.0.0-0ubuntu2~cloud0,这个版本的依赖包略有瑕疵,不能满足该特性, 主要是python-libvirt的版本太低,升级python-libvirt步骤如下:

apt-get install python-dev pkg-config libvirt-dev
mkdir /opt/source/ && cd /opt/source
git clone https://github.com/libvirt/libvirt-python.git && cd libvirt-python
git checkout v1.2.16 -b v1.2.16
python setup.py build
python setup.py install

检查此时该包的版本:

python -c"import libvirt;print libvirt.getVersion()"
output:1002016

虚机内部的qemu-guest-agent版本对应的安装包这里可以找到 https://launchpad.net/ubuntu/+source/qemu

虚机镜像除了要安装qemu-guest-agent外,镜像本身还要设置hw_qemu_guest_agent属性
../../_images/update_image_metadata.png

环境准备完毕后,启动虚拟机,使用方式如下:

root@l-controller-1:~# nova list
+--------------------------------------+------------+--------+------------+-------------+---------------------------------------+
| ID | Name | Status | Task State | Power State | Networks |
+--------------------------------------+------------+--------+------------+-------------+---------------------------------------+
| b8b59244-72bc-4c7a-9d7c-79a14b4bf91e | t72 | ACTIVE | - | Running | niu-net-1=10.10.0.10, 192.168.252.142 |
| 840fd90a-ee5b-422c-aa8f-c1c1c61bbaed | virtio-blk | ACTIVE | - | Running | niu-net-1=10.10.0.11, 192.168.252.145 |
+--------------------------------------+------------+--------+------------+-------------+---------------------------------------+
root@l-controller-1:~# nova root-password t72
New password:
Again:

libvirt-set-admin-password 最大的优势在于他可以在任何时候去修改虚机系统密码,而不像前两种方式, 只能在初始化阶段做,但是对相关依赖组件的版本要求也是硬伤。

openstack changePassword的更多相关文章

  1. 视频 - 在 VirtualBox 中部署 OpenStack

    大家新年好,CloudMan 今天给大家带来一件新年礼物. 一直以来大家都反馈 OpenStack 学习有两大障碍:1. 实验环境难搭2. 体系复杂,难道大今天我就先帮大家解决环境问题.前两天我抽空在 ...

  2. 启用 Open vSwitch - 每天5分钟玩转 OpenStack(127)

    Linux Bridge 和 Open vSwitch 是目前 OpenStack 中使用最广泛的两种虚机交换机技术. 前面各章节我们已经学习了如何用 Linux Bridge 作为 ML2 mech ...

  3. Openstack Periodic Task

    Openstack Periodic Task 周期性任务在各个模块的manager.py(computer,scheduler,cell,network)中添加. 添加方法:在模块manager类实 ...

  4. 超千个节点OpenStack私有云案例(1):CERN 5000+ 计算节点私有云

    CERN:欧洲核子研究组织 本文根据以下几篇文章整理而来: https://www.openstack.org/summit/tokyo-2015/videos/presentation/unveil ...

  5. 完整部署CentOS7.2+OpenStack+kvm 云平台环境(1)--基础环境搭建

    公司在IDC机房有两台很高配置的服务器,计划在上面部署openstack云平台虚拟化环境,用于承载后期开发测试和其他的一些对内业务.以下对openstack的部署过程及其使用做一详细介绍,仅仅依据本人 ...

  6. 添加 Pool Member - 每天5分钟玩转 OpenStack(123)

    我们已经有了 Load Balance Pool "web servers"和 VIP,接下来需要往 Pool 里添加 member 并学习如何使用 cloud image. 先准 ...

  7. 理解 Neutorn LBaaS - 每天5分钟玩转 OpenStack(120)

    Load Balance as a Service(LBaaS)是 Neutron 提供的一项高级网络服务.LBaaS 允许租户在自己的网络中创建和管理 load balancer. load bal ...

  8. 每天5分钟 玩转OpenStack 目录列表

    最近在学习 OpenStack 的相关知识,一直苦于 OpenStack 的体系庞大以及复杂程度,学习没有进度,停滞不前.偶然机会在 51CTO 上发现了一个热点的专题关于 OpenStack 的,题 ...

  9. openstack七大模块概述

    前言 OpenStack主要由七部分组成,分别是Identify, Image, Network, Compute, Block Storage, Object Storage, Dashboard, ...

随机推荐

  1. java通过反射取得一个类的完整结构

    首先我们在person包中新建一个Person.java: package person; import sex.Sex; public class Person{ private String na ...

  2. 1月11日,HTML学习笔记

    <ul> <li>coffee</li> <li>tea</li> <li>mile</li> </ul> ...

  3. 【转载】.NET模拟POST登录并保持登录状态

    好了,还是由于工作需要 要登录一个网站并且模拟点击下载某些东西 原理就是先对一个地址(地址是用户名和密码输入框所在的form的action对应的页面)进行POST提交用户名和密码(不考虑验证码,当然验 ...

  4. [课程设计]Scrum 1.5 多鱼点餐系统开发进度

    1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅到店点餐系统WEB 5.Sprint 1时间:11.14-11.23 重案 ...

  5. 从Eclipse转移到IntelliJ IDEA一点心得

    http://www.ituring.com.cn/article/37792 本人使用IntelliJ IDEA其实并不太久,用了这段时间以后,觉得的确很是好用.刚刚从Eclipse转过来的很多人开 ...

  6. logrotate机制与原理[转载]

    http://blog.lightxue.com/how-logrotate-works/ 日志实在是太有用了,它记录了程序运行时各种信息.通过日志可以分析用户行为,记录运行轨迹,查找程序问题.可惜磁 ...

  7. jquery之css操作

    HTML示例代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  8. split 转义

    问题:str.split("?");报错了 原因: .?*+!^$[]()\在正则里需要转义 转义需双反斜线.splt("\\+");

  9. mysql 5.7.11 yum 安装步骤

    直接上步骤 首先你得有一台能够上外网的linux服务器 1:rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el6-5.noarch ...

  10. 【学】React的学习之旅5-组件的嵌套

    复习 [array].map(function(item,index){})方法,传参里的函数需要有return值,一般用map()后都要用一个变量接一下,这个返回的还是一个数组,只是把每次遍历到的数 ...