Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Оплата
Новости
Доставка
Загрузки
Форум
Настройка
    info@proxmox.su
    +7 (495) 320-70-49
    Заказать звонок
    Аспро: ЛайтШоп
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Аспро: ЛайтШоп
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Аспро: ЛайтШоп
    Телефоны
    +7 (495) 320-70-49
    Заказать звонок
    0
    0
    0
    Аспро: ЛайтШоп
    • +7 (495) 320-70-49
      • Назад
      • Телефоны
      • +7 (495) 320-70-49
      • Заказать звонок
    • info@proxmox.su
    • Москва, Бакунинская улица, 69с1
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    Proxmox Виртуальная Среда
    [ТУТОРИАЛ] Windows Cloud-Init работает

    Форумы: Proxmox Виртуальная Среда, Proxmox Backup Server, Proxmox Mail Gateway, Proxmox Datacenter Manager
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    [ТУТОРИАЛ] Windows Cloud-Init работает, Proxmox Виртуальная Среда
     
    kenzim
    Guest
    #1
    0
    02.02.2021 19:43:00
    Привет, народ! У меня получилось настроить cloud init для Windows с небольшими изменениями в Proxmox и шаблоне Windows. Раз все остальные обсуждения на эту тему не работают (по крайней мере, у меня не получилось их завести), решил поделиться своим опытом. Ключевой момент — это настройка Proxmox для сохранения паролей Windows в открытом виде, иначе шаблон не сможет их прочитать.

    Я отредактировал файл `/usr/share/perl5/PVE/API2/Qemu.pm` (старый код, строка 1022):

    Perl: `if (defined(my $cipassword = $param->{cipassword})) { ... }` заменяется на:

    Perl: `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}/;
       }
    }

    Затем, изменил код для передачи метаданных в ВМ (строка 210 в `/usr/share/perl5/PVE/QemuServer/Cloudinit.pm`), заменив функцию `configdrive2_metadata` на:

    Perl: `sub configdrive2_metadata { ... }`

    Этот код передаёт имя хоста и SSH-ключи, а также добавляет пароль.

    В функции `generate_configdrive2` (ниже), изменил:

    Perl: `if (!defined($meta_data)) { ... }` на `if (!defined($meta_data)) { ... }`

    Это связано с тем, что теперь функции требуются дополнительные аргументы.

    Еще один момент — небольшая опечатка в Proxmox для DNS-серверов и домена поиска (домен поиска пока не работает, вернусь к этому позже). Измените `_` на `-` в файле `/usr/share/perl5/PVE/QemuServer/Cloudinit.pm`, например:

    Perl: `if ($nameservers && @$nameservers) { ... }` и `if ($searchdomains && @$searchdomains) { ... }`

    После этого можно начинать создание шаблона Windows. Скачайте ISO-образ Windows Server, установите, установите Qemu Guest Agent и VirtIO Tools (обычные действия). Можно сразу сделать снимок (snapshot), чтобы иметь чистую копию.

    Установите Cloudbase-Init. Убедитесь, что у ВМ есть последовательный порт (serial port) и вы выбрали COM1 при установке для логирования. Используйте Administrator в качестве имени пользователя при установке. Не запускайте Sysprep и не перезагружайтесь после установки. Снова сделайте снимок (snapshot), если хотите.

    Теперь нужно немного поправить код Cloudbase. Сначала настройте автоматическое извлечение диска cloud init после завершения работы Cloudbase, чтобы пользователи не могли его видеть (дополнительная безопасность, особенно учитывая, что пароль сейчас в открытом виде).  Подробности здесь: [https://ask.cloudbase.it/question/2939/how-to-umount-cd-drive-after-cloudbase-init-completed/](<#0 >)

    Теперь можно редактировать конфигурацию Cloudbase в `C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf`. Ознакомьтесь с документацией, чтобы понять, что можно настроить. Вам понадобится служба метаданных configdrive, а также inject_user_password=no, чтобы можно было войти в систему через RDP без изменения пароля через VNC. Включите необходимые плагины.  Вот пример моей конфигурации:

    Code:
    [DEFAULT]
    username=Administrator
    groups=Administrators
    inject_user_password=no
    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

    После этого убедитесь, что файл Unattend.xml соответствует обычному файлу конфигурации.

    Запустите Sysprep с командами:

    Code:
    cd C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf

    C:\Windows\System32\sysprep\sysprep.exe /generalize /oobe /unattend:Unattend.xml

    Затем преобразуйте в шаблон и протестируйте. Откройте последовательную консоль, чтобы просмотреть логи, если что-то пойдет не так.  Сообщите мне об ошибках, если что-то не работает, и я постараюсь помочь.
     
     
     
    Bruno Garcia
    Guest
    #2
    0
    09.03.2021 05:53:00
    @yswery попробуй перегенерировать образ cloudinit и снова установи пароль. У меня сработало. @kenzim можешь предоставить файл configdrive.py? Я что-то путаю с этим синтаксисом. Еще я застрял на sysrep, VM постоянно перезагружается. Скоро выложу серийные логи.
     
     
     
    DemiNe0
    Guest
    #3
    0
    15.03.2021 02:43:00
    Всё в основном работает, но не могу заставить установить пароль пользователя или DNS… даже после правок.
     
     
     
    kenzim
    Guest
    #4
    0
    16.03.2021 18:59:00
    Привет, ребята, извините за поздний ответ. Я оглянулся на свой первый пост, и там была ошибка. В конфигурации Cloudbase это не inject_user_password должно быть no, а first_logon_behaviour, должно быть no. inject_user_password должен быть yes или True. inject_user_password=no означает, что вы можете войти в систему без принудительной смены пароля, так как Cloudbase заставит сменить пароль, если он передается в открытом виде. @DemiNe0, можешь выложить сетевую конфигурацию, сгенерированную на configdrive, и логи последовательного порта? Спасибо. Если кому-то нужен более быстрый ответ, пишите мне в Discord: Kenzi#1337.
     
     
     
    yswery
    Guest
    #5
    0
    03.04.2021 21:50:00
    @kenzim Когда пытаюсь настроить сетевые параметры, типа IP: 10.0.0.2/24, GW: 10.0.0.1, всё вроде работает нормально, но когда пытаюсь указать /32, что мне и нужно, как, например: IP: 10.0.0.2/32 GW: 10.30.40.1, в итоге машина Windows получает пустые IP-адреса и путую GW. Ты что-нибудь знаешь об этом?
     
     
     
    Ramalama
    Guest
    #6
    0
    03.04.2021 22:56:00
    10.0.0.2/32 с 10.30.40.1 в качестве шлюза? Ты серьезно назвал /32 сетью? С чем она вообще общается, сама с собой? xD
     
     
     
    kenzim
    Guest
    #7
    0
    03.04.2021 23:45:00
    Ты можешь, бро, у меня была та же проблема. Я использовал это с каким-то провайдером серверов, где шлюз был не в той подсети. Если покопаться в файлах cloudbase python, можно увидеть, где он использует интерфейс Windows WMI для установки IP. Если мы перехватим ошибку, которую Windows выдаёт, когда шлюз находится вне подсети (а это вполне нормальное и приемлемое использование), мы можем просто использовать команды для установки IP, и Windows не будет ругаться. Я прикрепил скриншот моего изменения кода, это было давно, но я почти уверен, что нужно просто добавить try-блок для установки IP, а затем добавить except-блок, в котором ты будешь указывать свой IP.
     
     
     
    Ramalama
    Guest
    #8
    0
    04.04.2021 01:44:00
    Я понимаю, что ты можешь это сделать теоретически, но как сервер находит маршрут? Ведь шлюз находится в другой сети, у него нет маршрута к этой сети. Это не может работать, бро xD Это как если бы ты ехал куда-то, но не знал, в каком направлении ехать xD Тебе хотя бы нужно определить маршрут к своему шлюзу. Но это не работает и с /32 тоже xD Короче, у меня в голове это не вяжется, возможно, скрипт работает так, как задумано, но Windows этого не делает, потому что какая-то проверка происходит?
     
     
     
    kenzim
    Guest
    #9
    0
    04.04.2021 04:17:00
    Ну, это не то чтобы компьютеру нужно знать точный маршрут, чтобы добраться туда, как мне нужен маршрут до супермаркета. Компьютер просто отправляет пакет по линии с адресом, указанным в IP-адресе. Просто указав шлюз вне подсети IPS, он просто отправляет пакет туда и не задумывается об этом больше. Он доверяет, что вы ввели существующий IP-адрес, который кто-то где-то в подключенной сети подхватит. По крайней мере, так мне объяснили. Когда вы настраиваете шлюз, например, в панели управления Windows, он выдает предупреждение, которое нужно подтвердить, но, к сожалению, пакет Python для Windows не позволяет это сделать, возможно, он позволяет, но cloudbase этого не сделал.
     
     
     
    yswery
    Guest
    #10
    0
    04.04.2021 04:36:00
    Этот try/catch-решение сработало идеально! Огромное спасибо за помощь! Windows (и Linux) автоматически настраивает статический маршрут и перенаправляет весь трафик через IP-адрес, находящийся за пределами вашей подсети, даже когда вы устанавливаете netmask в /32 на IPv4. Windows выдает всплывающее предупреждение об этом, но маршрутизацию выполняет отлично.
     
     
     
    Ramalama
    Guest
    #11
    0
    04.04.2021 13:51:00
    Ладно, я вам обоим верю, то есть, пакет, скорее всего, будет отправлен, но без destination mac-адреса, потому что компьютер его не знает. Так что, layer 2 на самом компьютере отсутствует. Но, вероятно, свитч, стоящий за ним, сделает свою работу правильно xD Однако, с cloudinit скриптом, я думаю, возникает ошибка или предупреждение, потому что gw находится за пределами сети и поэтому это не работает. Так что вам, вероятно, нужно будет отладить это и изменить скрипт.
     
     
     
    kenzim
    Guest
    #12
    0
    06.04.2021 19:33:00
    Зацени прикреплённую фотографию, бро.
     
     
     
    shabsta
    Guest
    #13
    0
    15.04.2021 13:21:00
    @kenzim Просто хотел сказать спасибо за это! Я потратил два дня, пытаясь запустить развертывание Windows на Proxmox, перепробовав много предложенных вариантов, а твое решение решило все проблемы. Если бы сотрудники Proxmox посмотрели на эти изменения и опубликовали их, а также создали инструкцию на основе этих указаний, то это сэкономило бы много времени многим.
     
     
     
    tuxis
    Guest
    #14
    0
    21.05.2021 10:22:00
    @kenzim Если это стабильно и верно, не мог бы ты создать баг-репорт и патч на https://bugzilla.proxmox.com/ чтобы сотрудники Proxmox могли этим заняться?
     
     
     
    shabsta
    Guest
    #15
    0
    21.05.2021 10:44:00
    @tuxis Я связался с ModulesGarden и спросил, как они решают задачу развертывания Windows VM, и они посоветовали, что изменения в Proxmox не требуются, как указано в этой ветке обсуждения. У нас в пути новый сервер, я протестирую их рекомендацию/инструкции и посмотрю, работают ли они, и если да, то обновлю эту ветку.
     
     
     
    kenzim
    Guest
    #16
    0
    21.05.2021 13:36:00
    Посмотрю, когда будет время. Я тоже использую этот плагин, и у него есть свои баги. Там есть опция для Windows VM, и я уверен, что он использует гостевого агента для применения настроек. Но Cloud init предпочтительнее, потому что он работает с любым методом развертывания, и тебе не нужна отдельная конфигурация для Windows-серверов.
     
     
     
    antton
    Guest
    #17
    0
    28.05.2021 09:41:00
    Есть ли какие-нибудь новости по поводу этой фичи или багу cloud-init от Proxmox?
     
     
     
    ModulesGarden
    Guest
    #18
    0
    28.05.2021 16:37:00
    Нам очень жаль слышать о вашем опыте. Если в наших Proxmox модулях есть какие-то баги, их, безусловно, нужно исправить. Пожалуйста, свяжитесь с нашей службой поддержки по адресу https://www.modulesgarden.com/support/ticket/general-support, чтобы мы могли вам помочь и, надеемся, устранить любые препятствия. Что касается поддержки cloud-init, нам бы очень хотелось, чтобы эта опция работала и была доступна, но на данный момент это вне нашего контроля. Как только она станет доступна, мы обязательно оснастим наши модули этой функцией. Мы пытались создать некий обходной путь с использованием qemu quest agent, пока cloudbase-init не станет возможным для реализации.
     
     
     
    Страницы: 1
    Читают тему
    +7 (495) 320-70-49
    info@proxmox.su

    Конфиденциальность Оферта
    © 2026 Proxmox.su
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры