Disclaimer:
Автор любит короткие и прямые костыли, а также нежно обожает свободный открытый софт за ту гибкость и масштабируемость, что тот дает. Целью данной статьи является желание попиариться, а также рассказать о незаслуженно неизвестной в русскоязычном интернете системе управления софтом OPSI(Open PC Server Integration).
Я сидел в офисе и попивал себе кофе, когда мне позвонил Илон Маск и на чистом русском языке сообщил мне, что хватит уже это терпеть, пора собрать лучшие умы для борьбы с неким вирусом, а для этого прямо сейчас, через пять минут ко мне в офис привезут 100 компьютеров, на которые мне в срочном порядке нужно будет развернуть windows 10, а завтра с утра в офис приедут ученые со всего мира, чтобы начать работу над антивирусом. Ну что же, разве не этого я ждал всю свою жизнь? Достойный вызов для хорошего инструмента.
Для исполнения плана я буду использовать систему OPSI — Open PC Server Integration.
OPSI написана на питоне в германии и, видимо, там тоже очень любят костыли, бесплатность и масштабируемость.
Базовые возможности системы:
Возможности системы, реализуемые за счет модулей(есть бесплатные модули и платные):
Поподробнее можно узнать здесь
Модель монетизации у них следующая: они продают модули, пока не наберут сумму, чтобы сделать их бесплатными.
Пока ко мне в кабинет заносят компы и собирают их, я устанавливаю сервер AD на виндовс сервере, поднимаю на нем домен domain.local, а также DNS и DHCP.
Устанавливать OPSI можно в рабочей группе и в домене, мы будем ставить в домене, но без привязки к АД(LDAP коннектор).
Развертывать windows 10 на сеть компьютеров мы будем по следующей схеме: подготовим развертываемый образ windows 10 со всеми программами, загрузимся по сети через opsi, с помощью clonezilla автоматически сохраним его в файл, потом выставим всем компам автоматическую установку через opsi, загрузимся по сети и автоматически же разольем этот файл на все компьютеры в широковещательном сегменте сети через tftp.
Для этого на области DHCP сервера зададим параметр номер 66 в ip нашего будущего сервера opsi 192.168.1.229
и параметр 67 приведем к виду linux/pxelinux.0
В DNS добавляю opsiserver.domain.local под его статическим адресом 192.168.1.229
Затем создадим виртуальную машину под наш сервер opsi на железе, которое выдержит ваши нагрузки и подойдет вам по скоростям. Ssd и несколько сетевых карт приветствуются.
Opsi поддерживает не все системы, список совместимости можно посмотреть здесь.
Устанавливаем сразу в английской локали, крайне не советую использовать кириллицу где бы то ни было на этом сервере.
Мой любимый дистрибутив debian 10 я устанавливаю в минимальной комплектации с именем opsiserver.
После установки и перезагрузки на всякий случай сконфигурируем локали:
Я выбираю все, где есть de_ en_ и ru_ системной оставляю en_US.UTF8.
Дальнейшая установка есть адаптированный под задачу пересказ этого туториала.
Поменяем имя сервера, если оно отлично от того, что нам нужно:
Проверка:
Приведем /etc/hosts к следующему виду:
И забудем навсегда о его существовании, так как опси требовательна к содержанию этого файла и при его изменении иногда начинает бунтовать и сыпать ошибками.
Устанавливаем требуемые пакеты:
Устанавливаем mysql сервер по умолчанию, у меня встает maria-db, он тоже подойдет.
Отвечаем на вопросы утвердительно, меняя пароль рут и запоминая его.
Добавляем репозитории OPSI в систему:
Обновляемся:
Удаляем tftpd если он есть, так как OPSI будет с ним конфликтовать:
Удаляем поддержку tftp из inetd, так как если она есть, то OPSI будет с ней конфликтовать:
И непосредственно устанавливаем opsi сервер:
в процессе спросят данные, которые нужны для создания самоподписанного сертификата, который в свою очередь нужен для шифрованного соединения клиентов с сервером.
Устанавливаем поддержку windows:
конфигурируем mysql бекенд:
Выставляем адрес сервера(localhost), пользователь от которого действуем(root), пароль root в mysql(который запоминали ранее), название бд для opsi(opsi), имя пользователя кто будет работать в этой бд(opsi), пароль этого пользователя(придумываем новый).
Далее для debian 10 надо добавить /usr/sbin в PATH:
и эту же строку стоит добавить в .bashrc в вашем домашнем каталоге. Если этого не сделать, на следующем шаге получите ошибку «chpasswd not found».
Инициализируем систему и выставляем нужные права на файлы и директории системы:
Перезапуск служб:
Конфигурируем самбу:
Клиенты OPSI подключаются к основному серверу через https на порт 4447, при этом если нужно вызвать какую-то установку, то клиенты подмонтируют самба-шару с сервера opsi и с нее ставят софт. Чтобы все это было возможно, мы позволяем OPSI переконфигурировать самбу.
Рестарт самбы:
Устанавливаем администраторский пароль для системного пользователя pcpatch:
Теперь создадим пользователя для администрирования системы:
Создадим ему пароль:
Теперь пароль для самбы, я создаю такой же, как в системе:
Добавляем в группу:
Если мы будет делать что-то с OPSI под рутом то нужно добавить рута в группу:
Ещё немного костылей:
Теперь можно загрузить пакеты в систему, а пока они загружаются, попить кофе.
Впоследствии пакеты можно будет обновить командой:
Теперь заходим на
https://download.uib.de/opsi4.1/misc/helper/, скачиваем и устанавливаем оттуда менеджмент интерфейс opsi-configed для управления сервером
вводим адрес сервера, нашего пользователя adminuser и его пароль
И мы в системе.
На этом этапе сервер установлен!
1 — все подключенные к этом серверу клиенты, их можно разбирать по группам, в том числе, вложенным, применять назначение сразу ко всей группе.
2 — вкладка с клиентами, это список тех компов, которые управляется opsi
3 — клиенты списком, здесь их можно выделить в любом порядке, чтобы применить назаначение
4 — «конфигурация продукта» — жертва перевода. На самом деле там те пакеты, что можно ставить в винду, в терминологии opsi — localboot products
5 — Netboot products — это все то, что загружается по сети
6 — opsi-mac-address — мак компа — то, по чему он определяется при сетевой загрузке
7 — opsiHostKey — это «пароль» клиента в системе opsi, если вы удалите с компа клиент opsi, а потом установите заново, то он не будет работать, так как пароль останется старым и не будет подходить. Это и бага и фича. А как бы вы сделали?
Теперь подготовим windows 10 образ, который будем разливать. Clonezilla, которой мы будем пользоваться, не так хороша, как акронис, но она всё же умеет разливать образ с меньшего диска на такой же или больший.
Поставим в систему все нужные нам программы, а также Remote Server Administration Tools for Windows 10. У меня windows 10 1903, я поставил для 1803 и всё что нужно, завелось. Скачать его можно отсюда: https://www.microsoft.com/en-us/download/details.aspx?id=45520
Нам он нужен для утилитки netdom, которая позволяет автоматически ввести комп в домен.
Для этого мы скачиваем файлы отсюда https://github.com/valmont2k/renamejoin в каталог c:\renamejoin. Создаем на контроллере домена администратора домена с возможностью только вводить компьютеры в домен с логином Joinadmin с паролем password1234QWE. Если злоумышленник перехватит этот пароль, то он сможет только навводить компьютеров в наш домен.
Запустим в администраторской консоли полностью подготовленной винды строчку из createtesk.txt, что создаст задачу на запуск при загрузке.
Вся схема будет работать следующим образом:
Когда мы разольем образ по всем компам, при первой загрузке windows запустит задачу
Пришло время подготовленную винду сконвертировать в образ.
Через иконку компьютера с плюсиком добавляем наш компьютер в менеджмент интерфейсе opsi opsi-configed, выставляем его мак-адрес. Сохраняем. Переходим в Netboot продукты, напротив clonezilla ставим «setup». В конфигурации для клиента выставляем все как на скриншоте: название файла и команду, по которой весь диск заливаем в образ. В биосе компьютера с виндой выставляем загрузку из сети. Перезагружаем комп. Если вы всё сделали правильно, то увидите, как винда перетекает в образ без помощи рук.
Тем временем, компьютеры собраны, но их нужно добавить как клиенты в opsi вместе в их мак-адресами, добавлять их ручками совсем не боярское дело, верно?
Решение есть:
Запускаете на opsiserver:
И, выставив в настройках биоса всех компов загрузку по сети(а заодно пробуждение от PCI-E устройств, по сети, позже поймете зачем), загружаем их. Если при загрузке появляется синее окошечко opsi boot menu,
то вы всё делаете правильно.
Компьютеры при загрузке обращаются к нашему серверу, tcpdump записывает их мак адреса в файл
Следующий этап — разливка образа windows(который уже должен был сделаться), на все компьютеры.
Для этого выделяем все компы, на которые надо поставить винду и напротив clonezilla выставляем значения как на скриншоте. Компы выключаете, потом по очереди включаете несколько из них и наблюдаете, как на них полностью автоматически накатывается винда, они сами переименуются и вводятся в домен.
Если есть желание автоматизировать и это, то ставите etherwake и пишете скрипт, который с заданной задержкой берет из файла /tmp/newmacs мак-адреса и будит их хозяев, чтобы они по очереди накатили себе винду. Смотри update 1.
Я сделал жест Роналдо из рекламы шампуня и уже собрался за кофе, когда в мой телефон снова позвонил Илон Маск и добавил:
— Да, я забыл сказать, надо, чтобы завтра на всех компьютерах стояла
— Конечно, завтра всё будет!
Не могу же я расстраивать кумира технократов, значит нужно снова приложить мозги к рукам.
Неплохо бы, чтобы при загрузке компы ставили себе клиент opsi с названием opsi-client-agent. Сделать это можно через групповые политики домена.
Чтобы это происходило без ввода пароля при установке, надо в файле
добавить как значение service_hidden_password пароль вашего пользователя
Дальше добавляем групповую политику в домене setupOPSI и берем скрипт для нее отсюда
Не забудьте вставить свои значения в скрипт.
Если вы все сделали правильно, то при первой перезагрузке в домене клиенты будут ставить
Теперь можно переходить к установке
Заходим сюда https://forum.opsi.org/viewtopic.php?f=22&t=7573 и находим ссылку на пакет
Скачиваем пакет в директорию
и устанавливаем его:
Теперь в интерфейсе управления opsi нажимаем на кнопочку обновить и видим, что у нас появились новые пакеты
Ставим их через интерфейс управления на тестовую машину под виндой.
Когда программы
Перед установкой надо настроить параметры программы. Подмонтируем шару на тестовой машине \\opsiserver.domain.local\opsi_workbench как диск z:, впишем свое имя и свою почту в заданные поля:
OPSI может делать один пакет, используя 32 и 64 инсталлеры одновременно и ставя их, исходя из разрядности системы, у нас же везде 64 бит, так что нажимаем «Analyze single file...»:
Видим, что детектор не понял каталог установки, его мы можем узнать сами, попытавшись установить программу через инсталлер. Зато задетектил тип установщика, версию программы, размер приложения в собранном и развернутом виде, ключ автономной установки, ключ автономного удаления и название uninstaller'a.
Вписываем сами каталог установки и жмём Next Step:
Здесь можно добавить имя продукта, его ID, описание и выставить версию пакета, то есть поставить ту попытку, которую мы предпринимаем, чтобы собрать пакет(в нашем случае первая попытка):
Можно проставить зависимости, это значит, что для установки текущего пакета сами выставятся к установке те пакеты, которые проставлены в требованиях к нашему:
Create OPSI package:
Мы создали пакет, теперь на opsiserver надо зайти в
Собрать пакет:
Установить его:
Если все прошло хорошо, то в интерфейсе управления opsi-configed нажимаем на кнопочку «обновить» и видим, что у нас появились новый пакет
Бинго! Первый пакет собран!
Усложним себе задачу, при помощи powershell создадим правило в брандмауэре виндовс, дающее доступ к клиенту к порту 4441 и 4447 и сделаем автозагрузку этого приложения для пользователя через твик реестра, как будто это был бы, например, мессенджер.
Открываем opsi package builder:
Выбираем открыть пакет и открываем наш пакет с windirstat:
OPSI по умолчанию действует следующим образом: при удалении программы из uninstall.opsiscript вызывается delsub.opsiscript, который и удаляет программу. При установке программы из setup.opsiscript вызывается delsub.opsiscript, который удаляет программу, а потом setup.opsiscript устанавливает её. Поэтому правки для создания чего-то делаем в setup.opsiscript, а правки для удаления чего-то — в delsub.opsiscript.
Вся магия этих скриптов отражена в документации https://download.uib.de/opsi4.1/documentation/html/en/opsi-winst-manual/opsi-winst-manual.html
setup.opsiscript можно открыть через значок карандашика, а delsub.opsiscript через Script Tree.
Вот полное меню файлов.
Каждую попытку сборки пакета стоит увеличивать на единицу его версию.
Добавляем программу в автозагрузку через opsi, для этого в setup.opsiscript вставим строки:
А в delsub.opsiscript вставим строки:
Добавляем правило в брандмауэр через запуск powershell скрипта, для этого в setup.opsiscript вставим строки:
А в delsub.opsiscript вставим строки:
Полный код можно посмотреть здесь:
https://github.com/valmont2k/WinDirStatOpsiPackageTest
Я уже расслабился, смотря как opsi раскатывает
— На следующей неделе приедут ещё 500 человек, офисы уже сняты, компы завозятся, сетевик есть, нужно развернуть виндовс сеть в шести филиалах по городу, справишься?
— Ну конечно же, это же не рокет саенс — устало отшутился я в ответ.
Клонируем наш сервер opsiserver средствами гипервизора, разворачиваем его в филиале.
Предполагаем, что центральный офис соединен с филиалами через VPN со скоростью хотя бы 10мбит.
Сейчас мы сделаем depot сервер, то есть сервер для хранения пакетов в филиале. Клиенты в филиале будут стучаться по https на основной сервер, а если нужно будет ставить софт, то будут подмонитровать depot сервер в своем филиале и ставиться с него, сделано это в частности для экономии канала интернет между офисом и филиалом.
Настраиваем на филиальном сервере opsiserver-2 статический адрес из местной сети меняя файл
Меняем hostname и hosts:
в /etc/hosts актуализируем данные, вбивая новый ip адрес
Переименовываем сервер opsi средствами opsi:
С сервера opsiserver-2.domain.local подключаем его к opsiserver.domain.local как depot:
Указываем имя основного сервера, к которому подключаем новый depot, администратора и пароль:
Здесь ничего менять не нужно:
Проследить, что все сделано правильно, можно в opsi-configed:
Далее надо настроить систему так, чтобы клиенты сами выбирали себе сервер depot. Выделяем всех клиентов и выставляем им dynamic depot. По умолчанию клиент смотрит на свой ip адрес и выбирает depot из своей сети.
Теперь настраиваем, чтобы все будущие клиенты сразу динамически выбирали depot:
Всё, на этом настройка нового сервера depot закончена, устанавливать opsi-client-agent для компьютеров в местной сети можно с него тем же скриптом, что и ранее мы устанавливали в основном офисе, не забыв сменить ip адрес внутри скрипта.
В каждом филиале ставим по контроллеру домена(можно Readonly), делаем свою адресацию сети, делим default-site внутри домена windows на подсайты, каждому из которых делаем свою subnet, свою групповую политику со своим скриптом установки opsi-client-agent.
Потом повторяем в новом филиале.
Я допил кофе и пошёл домой, а светодиод на сетевой карте сигнализировал о том, что новые и новые системы раскатывались под шум кулеров…
Update 1:
Как оказалось, скриптовать не обязательно, opsi-configed позволяет мышкой нащелкать пробуждение клиетов по шедулеру.
Автор любит короткие и прямые костыли, а также нежно обожает свободный открытый софт за ту гибкость и масштабируемость, что тот дает. Целью данной статьи является желание попиариться, а также рассказать о незаслуженно неизвестной в русскоязычном интернете системе управления софтом OPSI(Open PC Server Integration).
Я сидел в офисе и попивал себе кофе, когда мне позвонил Илон Маск и на чистом русском языке сообщил мне, что хватит уже это терпеть, пора собрать лучшие умы для борьбы с неким вирусом, а для этого прямо сейчас, через пять минут ко мне в офис привезут 100 компьютеров, на которые мне в срочном порядке нужно будет развернуть windows 10, а завтра с утра в офис приедут ученые со всего мира, чтобы начать работу над антивирусом. Ну что же, разве не этого я ждал всю свою жизнь? Достойный вызов для хорошего инструмента.
Для исполнения плана я буду использовать систему OPSI — Open PC Server Integration.
OPSI написана на питоне в германии и, видимо, там тоже очень любят костыли, бесплатность и масштабируемость.
Базовые возможности системы:
- Автоматическое развертывание софта
Работает это так: анализируешь инсталлятор и из него делаешь пакет opsi, который нужным образом ставит программу. Лучше всего работает с msi пакетами, знает еще несколько форматов, с которыми тоже справляется. Может запустить bat файл или powershell скрипт, да в принципе, любой интерпретатор. Есть встроенные системы работы с реестром, в общем, полный фарш, лучшая часть системы наверное. - Автоматическая установка операционных систем
Я пользуюсь только установкой из образа, как самой быстрой, но есть варианты с автономной установкой системы с нуля. - Программная и аппаратная инвентаризация
Здесь можно проводить например софтовую и железячную инвентаризацию при загрузке, но самой большой фичей в этом аспекте является безагентная инвентаризация, когда компы загружаются по сети в линукс, который проводит инвентаризацию и комп перезагружается, загружая со второго раза уже windows. То есть, если вам допустим, нельзя лезть в windows, а инвентаризировать компы надо, вы настраиваете инвентаризацию через сетевую загрузку и получаете что хотели. - Несколько удобных интерфейсов управления с возможностью гибкой интеграции
Есть программа с графическим интерфейсом, есть http интерфейс, на который можно слать команды, с консоли сервера можно управлять OPSI, встраивать команды в свои скрипты, можно получить доступ к бэкенду из питона, но я, к сожалению, пока такой магией не владею. - Поддержка множественных серверов depot (сервера, содержащие непосредственно софт, с которых идет развертывание).
Вы можете добавлять множество серверов, на каждую подсеть или группу компьютеров, каждый из которых будет обслуживать свою сеть.
Возможности системы, реализуемые за счет модулей(есть бесплатные модули и платные):
- LDAP коннектор (платный)
Коннектор, соединяющий в одно целое домен и opsi - Управление лицензиями (платный)
Управление программными лицензиями на администрируемых компах: установка, удаление... - MySQL бекенд (платный)
Перевод базы OPSI на mysql для больших установок, более 300 клиентов - Nagios коннектор (платный)
расширенный мониторинг - Установка при выключении (бесплатный)
По умолчанию, opsi агент выполняет задания при загрузке системы, это можно изменить, перенеся задания на время при выключении. - Локальный бекап в образы (платный)
Не выяснял как это работает. - Линукс агент (платный)
ПлАчу горючими слезами, так как попробовать, как это работает было бы очень, очень интересно. Да, я знаю про ansible и puppet, но всё равно горько. Единая система управления linux и windows системами в сети это звучит очаровывающе. - WAN расширение (платный)
Расширение для работы с удаленными клиентами через медленные соединения, то есть интернет. - Управление пользовательскими профилями (бесплатный)
Не пробовал - OTRS::ITSM коннектор (платный)
Тоже не довелось - Софт по запросу (бесплатный)
Классная штука, вы в общих пакетах выделяете те, которые пользователь может ставить сам и пользователи сами могут ставить любые программы, применять изменения «без регистрации и смс», а главное, без вирусов.
Поподробнее можно узнать здесь
Модель монетизации у них следующая: они продают модули, пока не наберут сумму, чтобы сделать их бесплатными.
Пока ко мне в кабинет заносят компы и собирают их, я устанавливаю сервер AD на виндовс сервере, поднимаю на нем домен domain.local, а также DNS и DHCP.
Устанавливать OPSI можно в рабочей группе и в домене, мы будем ставить в домене, но без привязки к АД(LDAP коннектор).
Развертывать windows 10 на сеть компьютеров мы будем по следующей схеме: подготовим развертываемый образ windows 10 со всеми программами, загрузимся по сети через opsi, с помощью clonezilla автоматически сохраним его в файл, потом выставим всем компам автоматическую установку через opsi, загрузимся по сети и автоматически же разольем этот файл на все компьютеры в широковещательном сегменте сети через tftp.
Для этого на области DHCP сервера зададим параметр номер 66 в ip нашего будущего сервера opsi 192.168.1.229
и параметр 67 приведем к виду linux/pxelinux.0
В DNS добавляю opsiserver.domain.local под его статическим адресом 192.168.1.229
Затем создадим виртуальную машину под наш сервер opsi на железе, которое выдержит ваши нагрузки и подойдет вам по скоростям. Ssd и несколько сетевых карт приветствуются.
Opsi поддерживает не все системы, список совместимости можно посмотреть здесь.
Устанавливаем сразу в английской локали, крайне не советую использовать кириллицу где бы то ни было на этом сервере.
Мой любимый дистрибутив debian 10 я устанавливаю в минимальной комплектации с именем opsiserver.
После установки и перезагрузки на всякий случай сконфигурируем локали:
dpkg-reconfigure locales
Я выбираю все, где есть de_ en_ и ru_ системной оставляю en_US.UTF8.
Дальнейшая установка есть адаптированный под задачу пересказ этого туториала.
Поменяем имя сервера, если оно отлично от того, что нам нужно:
hostname opsiserver.domain.local
Проверка:
hostname -f
Приведем /etc/hosts к следующему виду:
127.0.0.1 localhost
127.1.1.1 localhost.localdomain
192.168.1.229 opsiserver.domain.local opsiserver
И забудем навсегда о его существовании, так как опси требовательна к содержанию этого файла и при его изменении иногда начинает бунтовать и сыпать ошибками.
Устанавливаем требуемые пакеты:
apt install wget host pigz mc -y
apt install samba samba-common smbclient cifs-utils -y
Устанавливаем mysql сервер по умолчанию, у меня встает maria-db, он тоже подойдет.
apt install default-mysql-server -y
sudo mysql_secure_installation
Отвечаем на вопросы утвердительно, меняя пароль рут и запоминая его.
Добавляем репозитории OPSI в систему:
echo "deb http://download.opensuse.org/repositories/home:/uibmz:/opsi:/4.1:/stable/Debian_10/ /" > /etc/apt/sources.list.d/opsi.list
wget -nv https://download.opensuse.org/repositories/home:uibmz:opsi:4.1:stable/Debian_10/Release.key -O Release.key
apt-key add - < Release.key
Обновляемся:
apt update
Удаляем tftpd если он есть, так как OPSI будет с ним конфликтовать:
apt remove tftpd
Удаляем поддержку tftp из inetd, так как если она есть, то OPSI будет с ней конфликтовать:
update-inetd --remove tftp
apt install opsi-tftpd-hpa
И непосредственно устанавливаем opsi сервер:
apt install opsi-server
в процессе спросят данные, которые нужны для создания самоподписанного сертификата, который в свою очередь нужен для шифрованного соединения клиентов с сервером.
Устанавливаем поддержку windows:
apt install opsi-windows-support
конфигурируем mysql бекенд:
opsi-setup --configure-mysql
Выставляем адрес сервера(localhost), пользователь от которого действуем(root), пароль root в mysql(который запоминали ранее), название бд для opsi(opsi), имя пользователя кто будет работать в этой бд(opsi), пароль этого пользователя(придумываем новый).
Далее для debian 10 надо добавить /usr/sbin в PATH:
PATH=$PATH:/usr/sbin
и эту же строку стоит добавить в .bashrc в вашем домашнем каталоге. Если этого не сделать, на следующем шаге получите ошибку «chpasswd not found».
Инициализируем систему и выставляем нужные права на файлы и директории системы:
opsi-setup --init-current-config
opsi-set-rights
Перезапуск служб:
systemctl restart opsiconfd.service
systemctl restart opsipxeconfd.service
Конфигурируем самбу:
opsi-setup --auto-configure-samba
Клиенты OPSI подключаются к основному серверу через https на порт 4447, при этом если нужно вызвать какую-то установку, то клиенты подмонтируют самба-шару с сервера opsi и с нее ставят софт. Чтобы все это было возможно, мы позволяем OPSI переконфигурировать самбу.
Рестарт самбы:
systemctl restart smbd.service
systemctl restart nmbd.service
Устанавливаем администраторский пароль для системного пользователя pcpatch:
opsi-admin -d task setPcpatchPassword
Теперь создадим пользователя для администрирования системы:
useradd -m -s /bin/bash adminuser
Создадим ему пароль:
passwd adminuser
Теперь пароль для самбы, я создаю такой же, как в системе:
smbpasswd -a adminuser
Добавляем в группу:
usermod -aG pcpatch adminuser
Если мы будет делать что-то с OPSI под рутом то нужно добавить рута в группу:
usermod -aG pcpatch root
Ещё немного костылей:
opsi-setup --patch-sudoers-file
Теперь можно загрузить пакеты в систему, а пока они загружаются, попить кофе.
opsi-package-updater -v install
Впоследствии пакеты можно будет обновить командой:
opsi-package-updater -v update
Теперь заходим на
https://download.uib.de/opsi4.1/misc/helper/, скачиваем и устанавливаем оттуда менеджмент интерфейс opsi-configed для управления сервером
opsi-configed-setup.exe
вводим адрес сервера, нашего пользователя adminuser и его пароль
https://opsiserver.domain.local:4447/
И мы в системе.
На этом этапе сервер установлен!
1 — все подключенные к этом серверу клиенты, их можно разбирать по группам, в том числе, вложенным, применять назначение сразу ко всей группе.
2 — вкладка с клиентами, это список тех компов, которые управляется opsi
3 — клиенты списком, здесь их можно выделить в любом порядке, чтобы применить назаначение
4 — «конфигурация продукта» — жертва перевода. На самом деле там те пакеты, что можно ставить в винду, в терминологии opsi — localboot products
5 — Netboot products — это все то, что загружается по сети
6 — opsi-mac-address — мак компа — то, по чему он определяется при сетевой загрузке
7 — opsiHostKey — это «пароль» клиента в системе opsi, если вы удалите с компа клиент opsi, а потом установите заново, то он не будет работать, так как пароль останется старым и не будет подходить. Это и бага и фича. А как бы вы сделали?
Теперь подготовим windows 10 образ, который будем разливать. Clonezilla, которой мы будем пользоваться, не так хороша, как акронис, но она всё же умеет разливать образ с меньшего диска на такой же или больший.
Поставим в систему все нужные нам программы, а также Remote Server Administration Tools for Windows 10. У меня windows 10 1903, я поставил для 1803 и всё что нужно, завелось. Скачать его можно отсюда: https://www.microsoft.com/en-us/download/details.aspx?id=45520
Нам он нужен для утилитки netdom, которая позволяет автоматически ввести комп в домен.
Для этого мы скачиваем файлы отсюда https://github.com/valmont2k/renamejoin в каталог c:\renamejoin. Создаем на контроллере домена администратора домена с возможностью только вводить компьютеры в домен с логином Joinadmin с паролем password1234QWE. Если злоумышленник перехватит этот пароль, то он сможет только навводить компьютеров в наш домен.
Запустим в администраторской консоли полностью подготовленной винды строчку из createtesk.txt, что создаст задачу на запуск при загрузке.
Вся схема будет работать следующим образом:
Когда мы разольем образ по всем компам, при первой загрузке windows запустит задачу
C:\renamejoin\step1.cmd
, которая переименует комп в win-%random%
, перезагрузит комп, удалив C:\renamejoin\step1.cmd
и переименуя C:\renamejoin\step2.cmd
в C:\renamejoin\step1.cmd
. На следующей загрузке windows запустит C:\renamejoin\step1.cmd
, который введет этот комп в домен, перезагрузит его и удалит C:\renamejoin\step1.cmd
. Потенциально опасную задачу мы сможем удалить с компьютеров домена позже. Через OPSI конечно же!Пришло время подготовленную винду сконвертировать в образ.
Через иконку компьютера с плюсиком добавляем наш компьютер в менеджмент интерфейсе opsi opsi-configed, выставляем его мак-адрес. Сохраняем. Переходим в Netboot продукты, напротив clonezilla ставим «setup». В конфигурации для клиента выставляем все как на скриншоте: название файла и команду, по которой весь диск заливаем в образ. В биосе компьютера с виндой выставляем загрузку из сети. Перезагружаем комп. Если вы всё сделали правильно, то увидите, как винда перетекает в образ без помощи рук.
Тем временем, компьютеры собраны, но их нужно добавить как клиенты в opsi вместе в их мак-адресами, добавлять их ручками совсем не боярское дело, верно?
Решение есть:
apt install tcpdump
Запускаете на opsiserver:
tcpdump -n udp -vvvvv -e port 69 > /var/log/tftp
И, выставив в настройках биоса всех компов загрузку по сети(а заодно пробуждение от PCI-E устройств, по сети, позже поймете зачем), загружаем их. Если при загрузке появляется синее окошечко opsi boot menu,
то вы всё делаете правильно.
Компьютеры при загрузке обращаются к нашему серверу, tcpdump записывает их мак адреса в файл
/var/log/tftp
, а с помощью скрипта из репо https://github.com/valmont2k/opsi-hosts-importer
который надо запускать на opsiserver после того, как все компы отметятся в opsi и оставят там свои мак-адреса. Этот скрипт использует API opsi вот отсюда https://download.uib.de/opsi4.1/experimental/documentation/html/opsi-api-documentation/opsi_API.html и немного магии. После его запуска у вас появятся клиенты на opsiserver вида win%random32%.domain.localСледующий этап — разливка образа windows(который уже должен был сделаться), на все компьютеры.
Для этого выделяем все компы, на которые надо поставить винду и напротив clonezilla выставляем значения как на скриншоте. Компы выключаете, потом по очереди включаете несколько из них и наблюдаете, как на них полностью автоматически накатывается винда, они сами переименуются и вводятся в домен.
Если есть желание автоматизировать и это, то ставите etherwake и пишете скрипт, который с заданной задержкой берет из файла /tmp/newmacs мак-адреса и будит их хозяев, чтобы они по очереди накатили себе винду. Смотри update 1.
Я сделал жест Роналдо из рекламы шампуня и уже собрался за кофе, когда в мой телефон снова позвонил Илон Маск и добавил:
— Да, я забыл сказать, надо, чтобы завтра на всех компьютерах стояла
%program%
последней версии, справишься?— Конечно, завтра всё будет!
Не могу же я расстраивать кумира технократов, значит нужно снова приложить мозги к рукам.
Неплохо бы, чтобы при загрузке компы ставили себе клиент opsi с названием opsi-client-agent. Сделать это можно через групповые политики домена.
Чтобы это происходило без ввода пароля при установке, надо в файле
/var/lib/opsi/depot/opsi-client-agent/files/opsi/cfg/config.ini
на opsiserverдобавить как значение service_hidden_password пароль вашего пользователя
adminuser
в base64
[installation]
service_user=adminuser
service_password=none
service_hidden_password=base64HERE
Дальше добавляем групповую политику в домене setupOPSI и берем скрипт для нее отсюда
https://github.com/valmont2k/opsi-install-opsi-client-agent-over-active-directory-domain-policy
Не забудьте вставить свои значения в скрипт.
Если вы все сделали правильно, то при первой перезагрузке в домене клиенты будут ставить
opsi-client-agent
, перезагружаться и появляться под своими именами вида win-%random%
в интерфейсе управления OPSI. Старых клиентов с теми же мак-адресами можно удалить. Теперь можно переходить к установке
%program%
. Заходим сюда https://forum.opsi.org/viewtopic.php?f=22&t=7573 и находим ссылку на пакет
*.opsi
с названием packagebuilder
, что-то типа "opsi PackageBuilder Windows (opsi Paket)"
.Скачиваем пакет в директорию
/var/lib/opsi/workbench
на opsiservercd /var/lib/opsi/workbench
wget https://opsipackagebuilder.s3.amazonaws.com/opsiPackageBuilder/python/opsipackagebuilder_8.4.4-1.opsi
и устанавливаем его:
opsi-package-manager -d ALL -i opsipackagebuilder_8.4.4-1.opsi
Теперь в интерфейсе управления opsi нажимаем на кнопочку обновить и видим, что у нас появились новые пакеты
opsipackagebuilder
и opsi-setup-detector
.Ставим их через интерфейс управления на тестовую машину под виндой.
Когда программы
opsipackagebuilder
и opsi-setup-detector
установились, запускаем opsi-setup-detector
и натравливаем его на инсталлер программы windirstat
, скачанный предварительно с официального сайта программы. Перед установкой надо настроить параметры программы. Подмонтируем шару на тестовой машине \\opsiserver.domain.local\opsi_workbench как диск z:, впишем свое имя и свою почту в заданные поля:
OPSI может делать один пакет, используя 32 и 64 инсталлеры одновременно и ставя их, исходя из разрядности системы, у нас же везде 64 бит, так что нажимаем «Analyze single file...»:
Видим, что детектор не понял каталог установки, его мы можем узнать сами, попытавшись установить программу через инсталлер. Зато задетектил тип установщика, версию программы, размер приложения в собранном и развернутом виде, ключ автономной установки, ключ автономного удаления и название uninstaller'a.
Вписываем сами каталог установки и жмём Next Step:
Здесь можно добавить имя продукта, его ID, описание и выставить версию пакета, то есть поставить ту попытку, которую мы предпринимаем, чтобы собрать пакет(в нашем случае первая попытка):
Можно проставить зависимости, это значит, что для установки текущего пакета сами выставятся к установке те пакеты, которые проставлены в требованиях к нашему:
Create OPSI package:
Мы создали пакет, теперь на opsiserver надо зайти в
/var/lib/opsi/workbench/windirstat
.Собрать пакет:
opsi-makepackage
Установить его:
opsi-package-manager -d ALL -i windirstat-1.1.2-1.opsi
Если все прошло хорошо, то в интерфейсе управления opsi-configed нажимаем на кнопочку «обновить» и видим, что у нас появились новый пакет
windirstat
, который можно установить на выбранные компы в нашей сети.Бинго! Первый пакет собран!
Усложним себе задачу, при помощи powershell создадим правило в брандмауэре виндовс, дающее доступ к клиенту к порту 4441 и 4447 и сделаем автозагрузку этого приложения для пользователя через твик реестра, как будто это был бы, например, мессенджер.
Открываем opsi package builder:
Выбираем открыть пакет и открываем наш пакет с windirstat:
OPSI по умолчанию действует следующим образом: при удалении программы из uninstall.opsiscript вызывается delsub.opsiscript, который и удаляет программу. При установке программы из setup.opsiscript вызывается delsub.opsiscript, который удаляет программу, а потом setup.opsiscript устанавливает её. Поэтому правки для создания чего-то делаем в setup.opsiscript, а правки для удаления чего-то — в delsub.opsiscript.
Вся магия этих скриптов отражена в документации https://download.uib.de/opsi4.1/documentation/html/en/opsi-winst-manual/opsi-winst-manual.html
setup.opsiscript можно открыть через значок карандашика, а delsub.opsiscript через Script Tree.
Вот полное меню файлов.
Каждую попытку сборки пакета стоит увеличивать на единицу его версию.
Добавляем программу в автозагрузку через opsi, для этого в setup.opsiscript вставим строки:
Registry_changes /AllNTUserdats /64bit
[Registry_changes]
OpenKey [Software\Microsoft\Windows\CurrentVersion\Run]
Set "WinDirStat" = "C:\Program Files (x86)\WinDirStat\windirstat.exe"
А в delsub.opsiscript вставим строки:
Registry_changes /AllNTUserdats /64bit
[Registry_changes]
OpenKey [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
;Set "WinDirStat" = "C:\Program Files (x86)\WinDirStat\windirstat.exe"
DeleteVar "WinDirStat"
Добавляем правило в брандмауэр через запуск powershell скрипта, для этого в setup.opsiscript вставим строки:
DosInAnIcon_PowerShell_ExecutionPolicy
ExecWith_PowerShell_NichtPDCAktionen powershell.exe winst /sysnative
[DosInAnIcon_PowerShell_ExecutionPolicy]
echo "powershell set-executionpolicy RemoteSigned ..."
powershell.exe set-executionpolicy RemoteSigned
exit %ERRORLEVEL%
[ExecWith_PowerShell_NichtPDCAktionen]
; hier Dein PS-Code
New-NetFirewallRule -DisplayName 'OPSI-Inbound' -Profile @('Domain', 'Private', 'Public') -Direction Inbound -Action Allow -Protocol TCP -LocalPort @('4441', '4447')
А в delsub.opsiscript вставим строки:
DosInAnIcon_PowerShell_ExecutionPolicy
ExecWith_PowerShell_NichtPDCAktionen powershell.exe winst /sysnative
[DosInAnIcon_PowerShell_ExecutionPolicy]
echo "powershell set-executionpolicy RemoteSigned ..."
powershell.exe set-executionpolicy RemoteSigned
exit %ERRORLEVEL%
[ExecWith_PowerShell_NichtPDCAktionen]
; hier Dein PS-Code
Remove-NetFirewallRule -DisplayName 'OPSI-Inbound'
Полный код можно посмотреть здесь:
https://github.com/valmont2k/WinDirStatOpsiPackageTest
Я уже расслабился, смотря как opsi раскатывает
%program%
последней версии на всю сеть, как мои размышления о высоком снова прервал Илон. — На следующей неделе приедут ещё 500 человек, офисы уже сняты, компы завозятся, сетевик есть, нужно развернуть виндовс сеть в шести филиалах по городу, справишься?
— Ну конечно же, это же не рокет саенс — устало отшутился я в ответ.
Клонируем наш сервер opsiserver средствами гипервизора, разворачиваем его в филиале.
Предполагаем, что центральный офис соединен с филиалами через VPN со скоростью хотя бы 10мбит.
Сейчас мы сделаем depot сервер, то есть сервер для хранения пакетов в филиале. Клиенты в филиале будут стучаться по https на основной сервер, а если нужно будет ставить софт, то будут подмонитровать depot сервер в своем филиале и ставиться с него, сделано это в частности для экономии канала интернет между офисом и филиалом.
Настраиваем на филиальном сервере opsiserver-2 статический адрес из местной сети меняя файл
/etc/network/interfaces
согласно новой сети. Меняем hostname и hosts:
sed -i 's/opsiserver/opsiserver-2/' /etc/hostname
sed -i 's/opsiserver/opsiserver-2/g' /etc/hosts
в /etc/hosts актуализируем данные, вбивая новый ip адрес
reboot
Переименовываем сервер opsi средствами opsi:
opsi-admin --no-depot -d method host_renameOpsiDepotserver opsiserver.domain.local opsiserver-2.domain.local
С сервера opsiserver-2.domain.local подключаем его к opsiserver.domain.local как depot:
opsi-setup --register-depot
Указываем имя основного сервера, к которому подключаем новый depot, администратора и пароль:
Здесь ничего менять не нужно:
Проследить, что все сделано правильно, можно в opsi-configed:
Далее надо настроить систему так, чтобы клиенты сами выбирали себе сервер depot. Выделяем всех клиентов и выставляем им dynamic depot. По умолчанию клиент смотрит на свой ip адрес и выбирает depot из своей сети.
Теперь настраиваем, чтобы все будущие клиенты сразу динамически выбирали depot:
Всё, на этом настройка нового сервера depot закончена, устанавливать opsi-client-agent для компьютеров в местной сети можно с него тем же скриптом, что и ранее мы устанавливали в основном офисе, не забыв сменить ip адрес внутри скрипта.
В каждом филиале ставим по контроллеру домена(можно Readonly), делаем свою адресацию сети, делим default-site внутри домена windows на подсайты, каждому из которых делаем свою subnet, свою групповую политику со своим скриптом установки opsi-client-agent.
Потом повторяем в новом филиале.
Я допил кофе и пошёл домой, а светодиод на сетевой карте сигнализировал о том, что новые и новые системы раскатывались под шум кулеров…
Update 1:
Как оказалось, скриптовать не обязательно, opsi-configed позволяет мышкой нащелкать пробуждение клиетов по шедулеру.