这里写自定义目录标题
porxmox cloud-init
proxmox 官方只说明只支持centos,由于porxmox是开源软件很多大神直接修改代码实现也支持windows
centos
官网上有说明,但是不够详细以下链接的第10.8章节
https://pve.proxmox.com/pve-docs/pve-admin-guide.html
以centos 为例
第一直接下载http://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2
然后上传至/var/lib/vz/images目录.
新建一台VM 我这里根据我自己的环境 选 vmbr1 vlan184
进入shell
cd /var/lib/vz/images
qm importdisk 9000 CentOS-7-x86_64-GenericCloud.qcow2 local-lvm
qm set 9000 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-9000-disk-1
qm set 9000 --ide2 local-lvm:cloudinit
qm set 9000 --boot c --bootdisk scsi0
qm set 9000 --serial0
Cloud-init 是OpenStack映像的要求.因此再PROXMOX也要遵循这个要求,最后一条命令配置一个串行控制台并将其用作显示器。但是实际操作中proxmox这样配置同时可以支持vga和串口输出
qm set 9000 --serial0 socket
配置完成之后,cloud-init 选项就可以用了,通过测试发现,DNS域必须要配置,才能修改主机名。
否则不生效。通过官方文档知道因为使用的是nocloud模式。
WINDOWS
相对于centos的配置,wIndows就比较难了,wIndows同样也可以下载基于cloud-init的镜像镜像名称为
windows_server_2012_r2_standard_eval_kvm_20170321.qcow2.gz
搜索以上文件名会有无数的百度网盘链接。下载就好。。。。。。。。。。
我选择直安装windows2012 然后安装CloudbaseInitSetup_0_9_11_x64
下载地址:https://cloudbase.it/downloads/CloudbaseInitSetup_0_9_11_x64.msi
第一步准备VM
创建的时候注意操作系统的版本要选对。这个很重要
qm set 9001 --ide2 local-lvm:cloudinit
qm set 9001 --boot c --bootdisk scsi0
qm set 9001 --serial0 socket
qm set 9001 -citype configdrive2
第二步安装CloudbaseInitSetup
安装的时候注意选着串口
安装完成后进入安装目录修改cloudbaset-init.conf
C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf
修改完成之后,关机。
[DEFAULT]
username=Administrator
groups=Administrators
inject_user_password=true
config_drive_raw_hhd=true
config_drive_cdrom=true
config_drive_vfat=true
bsdtar_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\bin\bsdtar.exe
mtools_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\bin\
verbose=true
debug=true
logdir=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\log\
logfile=cloudbase-init.log
default_log_levels=comtypes=INFO,suds=INFO,iso8601=WARN,requests=WARN
logging_serial_port_settings=COM1,115200,N,8
mtu_use_dhcp_config=false
ntp_use_dhcp_config=false
metadata_services=cloudbaseinit.metadata.services.configdrive.ConfigDriveService
local_scripts_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\LocalScripts\
check_latest_version=true
plugins=cloudbaseinit.plugins.common.networkconfig.NetworkConfigPlugin,cloudbaseinit.plugins.common.mtu.MTUPlugin,cloudbaseinit.plugins.common.sethostname.SetHostNamePlugin,cloudbaseinit.plugins.windows.extendvolumes.ExtendVolumesPlugin,cloudbaseinit.plugins.common.sshpublickeys.SetUserSSHPublicKeysPlugin,cloudbaseinit.plugins.common.setuserpassword.SetUserPasswordPlugin
第三步修改代码
由于proxmox默认使用密文保存cloud-init的密码,windows 模板无法识别,因此需要修改代码来实现密码明文保存
修改 /usr/share/perl5/PVE/API2/Qemu.pm
原始代码1022行 所有的密码都加密
if (defined(my $cipassword = $param->{cipassword})) {
# Same logic as in cloud-init (but with the regex fixed...)
$param->{cipassword} = PVE::Tools::encrypt_pw($cipassword)
if $cipassword !~ /^\$(?:[156]|2[ay])(\$.+){2}/;
}
替换成新代码判断如果是windows 密码就明文保存
my $conf = PVE::QemuConfig->load_config($vmid);
my $ostype = $conf->{ostype};
if (defined(my $cipassword = $param->{cipassword})) {
# Same logic as in cloud-init (but with the regex fixed...)
if (!(PVE::QemuServer::windows_version($ostype))) {
$param->{cipassword} = PVE::Tools::encrypt_pw($cipassword)
if $cipassword !~ /^\$(?:[156]|2[ay])(\$.+){2}/;
}
}
然后还要修改一些代码把参数传递给VM
修改/usr/share/perl5/PVE/QemuServer/Cloudinit.pm的216行
传入了主机名和ssh密钥&用户名和密码
替换旧的configdrive2_metadata函数:
sub configdrive2_metadata {
my ($conf, $vmid, $user, $network) = @_;
my $uuid = Digest::SHA::sha1_hex($user.$network);
my $password = $conf->{cipassword};
my ($hostname, $fqdn) = get_hostname_fqdn($conf, $vmid);
my $startConfig = <<"EOF";
{
"hostname": "$hostname",
"uuid": "$uuid",
"admin_pass": "$password",
EOF
if (defined(my $keys = $conf->{sshkeys})) {
$startConfig .= " \"network_config\": { \"content_path\": \"/content/0000\" },\n";
$keys = URI::Escape::uri_unescape($keys);
$keys = [map { my $key = $_; chomp $key; $key } split(/\n/, $keys)];
$keys = [grep { /\S/ } @$keys];
$startConfig .= " \"keys\": [\n";
$startConfig .= " {\n";
my $keyCount = @$keys;
for (my $i=0; $i < $keyCount; $i++) {
# $startConfig .= " $keyCount "
if ($i == $keyCount-1){
$startConfig .= " \"key-$i\": \"".$keys->[$i]."\"\n";
} else {
$startConfig .= " \"key-$i\": \"".$keys->[$i]."\",\n";
}
}
$startConfig .= " }\n";
$startConfig .= " ]\n";
} else{
$startConfig .= " \"network_config\": { \"content_path\": \"/content/0000\" }\n";
}
$startConfig.= "}";
return $startConfig;
}
还要在generate_configdrive2功能上进行更改:在264行
旧代码
if (!defined($meta_data)) {
$meta_data = configdrive2_gen_metadata($user_data, $network_data);
}
新代码
if (!defined($meta_data)) {
$meta_data = configdrive2_metadata($conf, $vmid, $user_data, $network_data);
}
修改完成之后重启pvedaemon服务
systemctl restart pvedaemon.service
修改以下参数 然后点击重生成影像就可以改变机器密码,DSN,IP 机器名称
以上代码修改引用的地址如下
https://forum.proxmox.com/threads/windows-cloud-init-working.83511/
需要完整修改好补丁可以联系我。