PROXMOX CLOUDINIT windows

这里写自定义目录标题

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/

需要完整修改好补丁可以联系我。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值