在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。
[[email protected] ~]# virsh list
Id 名稱 狀态
----------------------------------------------------
2 instance-00000103 running
16 instance-00000115 running
19 instance-00000118 running
例如,是instance-00000118。
嘗試運作 guest-ping 測試。
[[email protected] ~]# virsh qemu-agent-command instance-00000118 '{"execute":"guest-ping"}'
{"return":{}}
顯示運作成功。
修改guest使用者密碼
有三種方法修改guest使用者密碼。三種方法實質上都利用了guest agent。
1. qemu agent指令 guest-set-user-password
[[email protected] ~]# python
Python 2.7.5 (default, Nov 20 2015, 02:00:19)
>>> import base64
>>> print base64.b64encode('passw0rd')
cGFzc3cwcmQ=
guest agent接受的密碼必須是base64編碼格式。
[[email protected] ~]# 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直接修改。
[[email protected] ~]# virsh set-user-password --domain 19 --user admin --password passw0rd
Password set successfully for admin in 19
3. openstack server set --root-password
隻能修改guest的管理者密碼。
[[email protected] ~(keystone_admin)]# openstack server set --root-password 0387568b-203a-4231-9798-e3d6c32efc16
New password: (輸入新密碼)
Retype new password: (再次輸入新密碼)
[[email protected] ~(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-