天天看點

OpenStack修改Guest使用者密碼——利用Qemu guest agent實作

在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)]# 
           

該指令的成功依賴幾個條件:

  1. libvirt版本不低于1.2.16。
  2. 鏡像image中繼資料已經設定hw_qemu_guest_agent為yes,并且guest agent服務正在雲主機中運作。
  3. 鏡像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将自動建立該使用者,并設定密碼。

要點:

  1. 控制節點和計算節點給nova打更新檔,讓 set_admin_password() 函數支援傳入username參數。重新開機nova相關服務。
  2. 雲主機guest os安裝qemu guest agent,并啟動guest agent服務。
  3. 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-