在OpenStack中,使用qemu guest agent为Windows虚拟机的用户修改密码。
配置Glance image
为Windows image指定元数据 hw_qemu_guest_agent=yes。
# openstack image set --property hw_qemu_guest_agent=yes <image-id>
创建云主机
然后用上面的image创建并启动一个云主机。
云主机启动之后,查看对应的qemu-kvm命令行参数,已经包含 org.qemu.guest_agent。
在云主机中安装guest agent
例如,下载二进制安装包qemu-ga-x64.msi
,然后在guest中安装。guest就是上面提到的云主机。
安装之后,在“服务”中查看,有一个QEMU Guest Agent服务,已经启动,状态正常。
测试guest agent 命令
在guest所在的宿主机,运行virsh,找到guest。
[root@host1 ~]# virsh list
Id 名称 状态
----------------------------------------------------
2 instance-00000103 running
16 instance-00000115 running
19 instance-00000118 running
例如,是instance-00000118。
尝试运行 guest-ping 测试。
[root@host1 ~]# virsh qemu-agent-command instance-00000118 '{"execute":"guest-ping"}'
{"return":{}}
显示运行成功。
修改guest用户密码
有三种方法修改guest用户密码。三种方法实质上都利用了guest agent。
1. qemu agent命令 guest-set-user-password
[root@host1 ~]# python
Python 2.7.5 (default, Nov 20 2015, 02:00:19)
>>> import base64
>>> print base64.b64encode('passw0rd')
cGFzc3cwcmQ=
guest agent接受的密码必须是base64编码格式。
[root@host1 ~]# virsh qemu-agent-command instance-00000118 \
'{"execute":"guest-set-user-password","arguments":{"username":"admin","password":"cGFzc3cwcmQ=","crypted":false}}'
{"return":{}}
使用qemu agent命令guest-set-user-password修改密码。之后尝试登录Windows虚拟机,发现密码已修改成功,新密码为“passw0rd”。
2. virsh set-user-password
也可以用virsh set-user-password直接修改。
[root@host1 ~]# virsh set-user-password --domain 19 --user admin --password passw0rd
Password set successfully for admin in 19
3. openstack server set --root-password
只能修改guest的管理员密码。
[root@controller ~(keystone_admin)]# openstack server set --root-password 0387568b-203a-4231-9798-e3d6c32efc16
New password: (输入新密码)
Retype new password: (再次输入新密码)
[root@controller ~(keystone_admin)]#
该命令的成功依赖几个条件:
- libvirt版本不低于1.2.16。
- 镜像image元数据已经设置hw_qemu_guest_agent为yes,并且guest agent服务正在云主机中运行。
- 镜像image元数据设置了os_admin_user。例如,“admin”。如果未设置,则nova可能把一个windows guest的管理员误认为是root。
Nova API对guest agent的支持情况
Nova API当前对guest agent的操作只支持Xen Driver。
参考 https://developer.openstack.org/api-ref/compute/#guest-agents-os-agents
通过打补丁,Nova API可以支持修改guest普通用户的密码。
这里有一个针对特定版本python-nova-16.0.0-1.el7.noarch的补丁,并且也很容易在其他版本Nova实现这个功能。该补丁主要为set_admin_password()函数增加了username参数,从而支持了修改显式指定用户的密码,不再限于系统管理员。在控制节点和计算节点都要应用这个补丁,然后重启相关的服务。在guest提前安装qemu guest agent软件并启动服务。
这里有一个qemu guest agent补丁,允许为一个不存在的用户指定密码,在guest中,qemu guest agent将自动新建该用户,并设定密码。
要点:
- 控制节点和计算节点给nova打补丁,让 set_admin_password() 函数支持传入username参数。重启nova相关服务。
- 云主机guest os安装qemu guest agent,并启动guest agent服务。
- Nova API调用,server action,changePassword传入userName。
Nova API调用的例子如下。
curl -g -i -X POST http://$ip:8774/v2.1/${projectuuid}/servers/${vmuuid}/action \
-H "User-Agent: python-novaclient" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "X-Auth-Token: $atoken" \
-d '{"changePassword": {"userName":"user2", "adminPass": "1415"}}'
以上修改云主机$vmuuid的guest OS用户user2的密码为1415,调用成功之后立即生效。
-END-