Disclaimer: приведенные здесь методы успешно работают в macOS Mojave, Catalina и Big Sur, но для боевых систем рекомендуется всегда проводить собственные тесты собранных пакетов.
Как-то так вышло, что раньше я довольно скептически относился к macOS, поскольку не имел возможности поработать с ней в более-менее устоявшейся корпоративной среде (т.е. не когда на всю компанию в 500-600 человек есть 2 мака, и те у генерального с его замом, да еще и с виндой в буткемпе). Но несколько лет назад мне повезло познакомиться с очень масштабной гетерогенной средой, показавшей, что в современных компаниях macOS не только успешно сосуществует с привычной Windows, но иногда и превалирует над ней в общей доле клиентских машин.
Позднее я оказался в другой компании, где отсутствовали привычные инструменты управления парком (а непривычные оказались недоступны из-за серьезных ограничений для региональных подразделений, в одно из которых я и входил). Проводить настройку и устанавливать софт "руками" я не люблю практически с самого начала своей карьеры – отлаженный сценарий экономит время и нервы, поэтому я начал искать варианты установки ПО на macOS.
Часть приложений распространяется в формате PKG – это пакет, сформированный специально для обработки приложением Installer, позволяющий провести установку как из графического интерфейса, так и из консоли (например, так: installer -pkg $pkgfile -target /Applications
). В идеале хотелось бы иметь пакеты в таком формате для всего стандартного ПО, распространяемого на клиентские машины, к этому и будем стремиться.
К сожалению, существенная часть ПО распространяется в виде DMG-образов, позволяющих просто примонтировать скачанный файл-образ и скопировать подготовленное приложение (обычно в формате .app) в каталог /Applications. К счастью, перепаковать такое приложение практически не составляет труда:
монтируем dmg-образ;
копируем приложение к себе на машину (каталог не имеет большого значения, но лучше следовать канонам – стандартный каталог для приложений /Applications);
выполняем в терминале следующую команду:
productbuild --component /path/to/YourApplication.app /Applications/ /path/to/YourApplication.pkg
(сначала указываем путь к скопированному приложению, далее идет опция, говорящая, что установка из пакета будет проводиться в каталог /Applications, и в финале задаем путь к создаваемому пакету, рекомендую везде использовать полные пути)
В результате получаем установочный пакет, одинаково успешно ведущий себя как при графической, так и при консольной процедуре установки. Да, установку из DMG-образа вполне можно реализовать, монтируя образ через hdiutil и копируя приложение, но этот вариант показался мне менее универсальным.
Иногда может потребоваться выполнить какие-то действия с системой, которые в обычных условиях можно было бы реализовать с помощью удаленного вызова или, например, shell-скриптов, но, предположим, что удаленного доступа к машине нет, а пользователь не горит желанием открывать консоль (если вообще знает, что это, ну и будем реалистами, ему и не надо). Система позволяет создавать подобие т.н. payload-free пакетов (в которые при желании можно все равно запихнуть некоторый payload) – в формируемом пакете основной интерес для нас будет представлять файл postinstall – тот же shell-скрипт, но выполняющийся в рамках работы с установочным пакетом.
Создадим папку scripts(я предпочитаю создавать каталоги в местах, где точно обладаю необходимыми правами, например, домашний каталог и его дочерние папки), в нее необходимо поместить весь контент, который потребуется для выполнения сценария (например, если вы осуществляете настройку принтера на клиентской машине, в пакет можно включить файл драйвера .ppd).
После того, как все необходимые файлы скопированы, открываем терминал, переходим с его помощью внутрь каталога scripts и выполняем команду pico postinstall
. Откроется стандартный консольный текстовый редактор (обычно, если вы ничего не меняли, это будет nano), в редактор необходимо ввести или скопировать текст вашего сценария, для примера приведу сценарий, меняющий параметры времени/таймзоны:
#!/bin/bash
ntp="time.euro.apple.com"
sudo /usr/sbin/systemsetup -setusingnetworktime on
sudo /usr/sbin/systemsetup -setnetworktimeserver "$ntp"
exit 0
После заполнения сценария всеми необходимыми операциями нажимаем Ctrl+X для выхода из редактора (жмем Y на вопрос о сохранении изменений, разумеется), но из терминала не выходим. Скрипт должен считаться исполняемым, добавляем ему соответствующие права командой sudo chmod a+x postinstall
(вводим пароль при необходимости).
Создаем наш пакет следующей командой:sudo pkgbuild --identifier com.package.name --nopayload --scripts /path/to/scripts/ "/path/to/your_package.pkg"
(в качестве идентификатора по идее надо указывать что-то, что позволит однозначно определить назначение пакета, пути по традиции указываем полные).
В большинстве случаев я рекомендовал бы использовать более привычные, распространенные инструменты администрирования, но в случае их отсутствия, надеюсь, эти решения помогут вам хоть немного упростить некоторые рутинные процессы.
q2digger
Спасибо, очень полезная статья. От себя поделюсь ссылкой на github страницу известного разработчика плейбуков и ролей для Ансибла с очень класной автоматизацие для мака. GitHub - geerlingguy/mac-dev-playbook: Mac setup and configuration via Ansible. Я там много интересного в личных целях почерпнул.
fzmax Автор
Спасибо, подпишусь!