目录结构:

引出

采用 nova get-password 方式

采用 libvirt-set-admin-password

采用 nova rebuild instance 的方式

采用 cloud-init 的方式

引出

  • 要解决的问题很明确:就是如果虚拟机的连接采用用户名密码登录的方式,而密码忘记的话,需要采取什么手段解决。
  • 其实解决方案是要取决于真实的生产环境,虚拟化方式的不同,初始化虚拟机密码方式的不同,openstack版本的不同,都会造成某个方案的可行不可行。以下几种方案可能或多或少会出现无法实现的情况,楼主尽量把条件讲清楚。

采用 nova get-password 方式

  • 利用nova 提供的这个接口可以获取instance的password,就不用密码reset了。
  • 适用条件:虚拟化方式为XEN,不支持libvirt.

采用 libvirt-set-admin-password

  • Openstack L 版本新加入的功能,直接使用 “nova set-password “(或早期版本client的”nova root-password”) 就可以,之前的版本该命令不支持Libvirt,仅支持XEN。
  • 适用条件:Openstack Libvirt+ 版本,宿主机libvirt版本1.2.16+,虚拟机镜像安装2.3+ 版本的qemu-guest-agent,详见虚拟机系统密码的修改方案¶
  • 博主试验了linux 几个主要版本(debian,ubuntu,centos),只要满足以上的限制条件,都能修改成功,不过官网提供的cloud 版本镜像大都没有安装 qemu-guest-agent,或者版本太低,需要自己安装并制作成镜像。windows 的镜像相对比较麻烦点,宿主机装的virtio-win,通过文件挂载的方式给guest安装对应驱动和QGA,其实不用安装也可以,实现最终都是guest 安装virtio-serial驱动,然后安装quemu-guest-agent就可以了,还有一点就是要设置镜像的property ,例如:hw_qemu_guest_agent=yes,os_type=windows。
    参考Running the QEMU Guest Agent on a Windows GuestCan I have virtio-win package on CentOS

CentOS 7.1 QEMU guest agent 安装 与 使用 (注:这篇文章有点过时了,因为QGA以及驱动的版本已经升级了好几版,大部分功能都已经实现,比如密码修改等,但是整个流程是一致的)

采用 nova image-create / nova rebuild的方式

  • 如果虚拟机是根据user-data来设定初始密码的,那么cloud-init只在第一次创建虚拟机执行一次,以后不会执行(reboot也不会执行)。那么我们也只能再次launch一下,方法如下。
  • 首先对当前虚拟机做一次snapshot.

  • 利用该snapshot ,设定好user-data重新boot 一个新的虚拟机

  • 注意:此处只是保证系统盘数据是不变的,如果是数据盘的话还要将对应的数据盘detach再attch到新建的虚拟机中。当然,如果虚拟机是直接用的adminPass的话(即injectPassword的方式)也可以直接利用rebuild命令(rebuild只能用于image启动的instance,而不能用于volume
    启动的instance)。

  • 这种方法其实比较笨拙,不到万不得已一般不会这么做。

采用 cloud-init 的方式

  • 这种方法算是所有方法里面最轻便的,但坏处是需要自己定制脚本。对于cloud-init,不熟悉的话可以先翻一下官方手册
  • 原理很简单:借助cloud-init,在虚拟机启动的时候开启一个服务,用来监测metadata中设定的某个值,如果该值发生改变(或者满足其他条件)即做出密码更改的动作并reboot。
  • 可喜的是,我在github找到了类似的代码openstack-password-reset ,不过这个代码只是考虑了RH7系列,而且密码是随机生成的,如果再推给openstack,可能更复杂了。我又更改一下脚本,支持更多Linux版本,且把重设后的密码定死了。年后会把改过的代码挂到github上。
  • 这里面的reset Python程序是通过外链获取的,于是干脆在nova里加了一个API,用来获取该程序。
  • 如果是传递多个文件给cloud-init的话,需要使用MIME的格式,tips:一般是把多个脚本/cloud-config文件 打包成MIME格式文件,然后压缩成gzip格式,传给cloud-init。

参考文章

Password Reset

虚拟机系统密码的修改方案

CloudInit & User-Data

 

END

openstack重设虚拟机实例密码的更多相关文章

  1. mysql重设root的密码 mac

    创建: 2017/09/14    第一步: 关闭已开启的mysql服务器  mysql.server stop  第二步: 关闭密码识别模式   /usr/local/bin/mysqld_safe ...

  2. 重设域管理员密码-window server 2008 R2

    How to Reset Your Forgotten Domain Admin Password on Server 2008 R2 Forgetting your password is alwa ...

  3. 重设Windows 7密码 z

    Restart the computer to boot using the CD. Once the GUI loads, press SHIFT+F10 to bring up the comma ...

  4. 忘记树莓派pi账户密码简单重设

    网上搜到的教程多是要修改cmdline.txt,非常繁琐,其实树莓派本身的root账户还没有启用,在root账户下重设pi的密码是很容易的,下面教你启用root账户,一切都需要在树莓派本机上操作 打开 ...

  5. Ubuntu 12.04 root账户开启及密码重设

    以普通用户登录,root账号的开启.关闭和密码设置,命令如下: sudo passwd -u root # 启用root账户 sudo passwd root # 设置root 密码(包括重设) su ...

  6. 忘记root密码时如何重设密码

    哈哈,太久没用linux了,把自己的登陆密码给忘了.今天找了下方法如何重设密码以登陆系统. 此文仅以作备忘. 忘记linux密码时,可以使用单用户模式进入linux,修改root密码.1.在linux ...

  7. 重设msyql数据库root密码

    重设密码的方法: 具体方法是: 1.先在安装目录找到my.ini配置文件,打开配置文件, 找到[mysqld]一行,在下面添加skip-grant-tables后保存该文件 重新启mysql动服务; ...

  8. OpenStack实践系列⑥构建虚拟机实例

    OpenStack实践系列⑥构建虚拟机实例 四.创建一台虚拟机图解网络,并创建一个真实的桥接网络 创建一个单一扁平网络(名字:flat),网络类型为flat,网络适共享的(share),网络提供者:p ...

  9. MySQL5.7使用错误解决:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)【取消或重设root密码】

    解决方法: 最简单方法: ⑴打开mysql中的my.ini(如果没有就将my-default.ini复制一份,并修改为my.ini): ⑵在[mysqld]下面空白行直接添加skip-grant-ta ...

随机推荐

  1. Java JAR包

    JAR文件全称 Java Archive File,意为Java档案文件.JAR文件是一种压缩文件,也被成为JAR包. 运行程序时,JVM会自动在内存中解压要用的JAR包. 使用JAR包的优点:1.安 ...

  2. js计算两个时间差 天 时 分 秒 毫秒

    // 计算两个时间差 dateBegin 开始时间 function timeFn(dateBegin) { //如果时间格式是正确的,那下面这一步转化时间格式就可以不用了 var dateEnd = ...

  3. MySQL Case--优化OR语句踩坑记录

    问题描述 研发同事反馈某应用执行较慢,对应SQL为: UPDATE bs_serial_trac , LOCK_VALUE = '', UPDATE_USER = 'transSys' ' AND ( ...

  4. Ubuntu安装Gitlab Runner

    第一步: 添加GitLab的官方存储库:    curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runne ...

  5. Activity知识点详解

    Activity知识点详解 一.什么是Activity 官方解释: The Activity class is a crucial component of an Android app, and t ...

  6. Python语言防坑小技巧

    Python语言防坑小技巧 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.赋值即定义  1>.运行以下代码会出现报错 #!/usr/bin/env python #_*_ ...

  7. OpenStack核心组件-glance镜像服务

    1. glance介绍 Glance是Openstack项目中负责镜像管理的模块,其功能包括虚拟机镜像的查找.注册和检索等. Glance提供Restful API可以查询虚拟机镜像的metadata ...

  8. NODE简易综合应用服务器搭建

    node搭建简易服务器 querystring和url模板学习地址 querystring&url 1. 目录结构 2. 代码结构 const http = require('http'); ...

  9. Python +appium logger

    封装日志模块 import logging def get_log(): # 配置日志参数 logger = logging.getLogger() logger.setLevel(logging.I ...

  10. PAT甲级1004题解——并查集思想改

    题目分析:本题开始一直在考虑如何将每一个节点通过一种合适的数据结构存储起来(一对多的关系),最后发现借助并查集的思想可以用一个数组p,p[i]存放i节点的父节点,每次查询编号为i的节点属于第几层且判断 ...