OpenStack安装信息

  • 安装工具:kolla ansible
  • 安装版本:Train版
  • 虚拟化层:qemu
  • Nova配置:默认配置,未做修改

官方镜像地址

密码注入:Cloud Init

推荐使用该方式修改root密码,适用性强。

创建实例时,在配置项填写定制化脚本,并勾选配置驱动(默认不勾选,不勾选会出现密码不生效的问题)

支持两种形式内容,一种是cloud-init配置文件,另一种是脚本文件。

  • 传入cloud-init配置文件,内容参考如下,有以下几点要特别注意:

    • #cloud-config 井号和cloud-config中间不能有空格,有空格就会注入失败

    • root:123456 中间不能有空格,有空格就会注入失败

    • Windows使用cloudbase-init工具进行初始化,传入的userdata与linux中的cloud-init格式有差距,具体使用方法可参考:Cloudbase-init官方文档:Userdata

Linux Userdata密码注入

1
2
3
4
5
6
#cloud-config
chpasswd:
list: |
root:123456
expire: false
ssh_pwauth: true

Windows Userdata密码注入

1
2
3
4
5
#cloud-config
users:
-
name: Administrator
passwd: StrongPassw0rd
  • 传入脚本文件,内容参考如下:
1
2
3
4
5
#!/bin/sh
passwd root << EOF
1234qwer
1234qwer
EOF

Horizon修改root密码

密码修改:qemu-guest-agent

镜像内部需要安装:qemu-guest-agent

组件 版本 位置
libvirt 1.2.16+ 宿主机
python-libvirt 1.2.16+ 宿主机
qemu-guest-agent 2.3+ 虚机内部

cirros镜像不适用该方式,版本:cirros-0.4.0-x86_64-disk.img。
centos镜像适用。版本:CentOS-7-x86_64-GenericCloud-2003.qcow2。

原理

qemu guest agent,简称qga,是一个运行在虚拟机内部的普通应用程序,可实现宿主机libvirt和虚拟机的通信,宿主机可通过向虚机中的qga发送命令控制虚机。这种通信不依赖网络,而是通过virtio-serial的方式。使用virtio传递消息,对虚拟机和主机的网络设置没有任何要求,且效率更高,类似于VMware Tools。虚机xml文件内 virtio-serial 代码段如下:

1
2
3
4
5
<channel type='unix'>
<source mode='bind' path='/var/lib/libvirt/qemu/org.qemu.guest_agent.0.instance-00000180.sock'/>
<target type='virtio' name='org.qemu.guest_agent.0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>

Libvirt层面修改流程

1
virsh set-user-password <domain> <user> <password>

OpenStack层面修改流程

步骤1:修改image元数据

方式1:前端修改

编辑镜像,在元数据 - libvirt Driver Options for Images - QEMU Guest Agent,设置为yes即可

Horizon设置image元数据

方式2:后端修改

1
2
3
# 增加image元数据信息
openstack image list
openstack image set --property hw_qemu_guest_agent=yes <image id or name>

image信息

不设置该参数,修改密码时会报QEMU guest agent is not enabled (HTTP 409),错误如下:

修改root密码409

步骤2:使用更新后的镜像创建虚机

步骤3:后端修改虚机密码

1
2
openstack server list
openstack server set --root-password <server id or name>

密码修改:virt-edit

原理

通过 libguestfs-tools ,可直接访问虚机磁盘,通过修改虚机磁盘内的 /etc/shadow 文件,达到修改密码的目的。

libguestfs is a set of tools for accessing and modifying virtual machine (VM) disk images. You can use this for viewing and editing files inside guests, scripting changes to VMs, monitoring disk used/free statistics, creating guests, P2V, V2V, performing backups, cloning VMs, building VMs, formatting disks, resizing disks, and much more.

libguestfs can access almost any disk image imaginable. It can do it securely — without needing root and with multiple layers of defence against rogue disk images. It can access disk images on remote machines or on CDs/USB sticks. It can access proprietary systems like VMware and Hyper-V.

All this functionality is available through a scriptable shell called guestfish, or an interactive rescue shell virt-rescue.

修改流程

  1. 安装 libguestfs-tools,若libvirt使用docker方式运行,则需要在docker镜像内打包该工具,参考Dockerfile如下:
1
2
3
FROM registry.local:9001/library/centos-source-libvirt:train

RUN rpm --rebuilddb && yum install libguestfs-tools -y && yum clean all && rm -rf /var/cache/yum

注意:

  1. docker yum安装容易出现:Rpmdb checksum is invalid: dCDPT(pkg checksums): … 。需要在安装前先执行 rpm --rebuilddb 且必须与 yum 命令处于同一个 RUN 内。也就是有时候在使用dockerfile build的时候,如果有多条 “RUN yum install -y …” 指令,需要在每条之前都加上 “rpm –rebuilddb”
  1. 关闭需要修改密码的虚机。
  2. 生成新的密码串。
1
2
3
4
# openssl是一个加密工具,-1 是指普通加密,
# hello为key(随意指定,加密算法需要), 123456才是密码,
# 下面就是是生成的密码串,这样我们只要将这些进行对应的替换就可以了
openssl passwd -1 -salt 'hello' '123456'
  1. 宿主机内,通过 virt-edit 命令修改虚机磁盘内 /etc/shadow 文件中记录的root密码,将内容替换为第三步生成的密文。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ virt-edit instance-00000020 /etc/shadow

root:$1$hello$ZwmhCpcG.I1XIfVjdarKc1:10933:0:99999:7:::
bin:*:10933:0:99999:7:::
daemon:*:10933:0:99999:7:::
adm:*:10933:0:99999:7:::
lp:*:10933:0:99999:7:::
sync:*:10933:0:99999:7:::
shutdown:*:10933:0:99999:7:::
halt:*:10933:0:99999:7:::
uucp:*:10933:0:99999:7:::
operator:*:10933:0:99999:7:::
ftp:*:10933:0:99999:7:::
nobody:*:10933:0:99999:7:::
cirros:$1$ecgqyiea$GZzgQPRzx7sFFoZ7p8ewU.:10933:0:99999:7:::

注意:

  1. /etc/shadow 文件中,第一个冒号与第二个冒号之间为加密后的密文。
  2. libvirt容器直接运行 virt-edit 命令很容易报错,内容如下:
1
2
3
4
5
6
7
8
supermin: failed to find a suitable kernel (host_cpu=x86_64).

I looked for kernels in /boot and modules in /lib/modules.

If this is a Xen guest, and you only have Xen domU kernels
installed, try installing a fullvirt kernel (only for
supermin use, you shouldn't boot the Xen guest with it).
libguestfs: trace: launch = -1 (error)

原因:supermin需要访问内核,但是未在libvirt容器内找到内核

解决方案:libvirt容器透传主机的 /boot 与 /lib/modules

  1. 修改后保存退出,启动虚机即可用新密码登录。

参考文档