Mac1.metal в AWS (5 серии деталей)
Я полагаю, что MacOS был разработан для пользователя, а не для OPS или инженеров, поэтому именно поэтому его настройка и использование CI/CD не являются тривиальными (по сравнению с чем-то на основе Linux). Умное предположение, а?
Управление мобильными устройствами на Native Apple (a.k.a MDM) и JAMF, вероятно, являются наиболее мощной комбинацией для конфигурации macOS. Но как бы он ни был могущественным, это громоздкая комбинация, и Джамф не свободен.
Тогда у нас есть Ansible, Chef, Puppet, Saltstack — все они хороши с Linux, но как насчет macOS?
Я попытался искать варианты использования упомянутых инструментов CM для MacOS. Тем не менее, я пришел к выводу, что они обертывают выполнение нативных утилит командной строки macOS большую часть времени.
И если вы ищете слово «macos» в супермаркете шеф -повара или кукол, вы не будете впечатлены количеством активно поддерживаемых пакетов. Хотя вот мотивирующая статья об использовании шеф -повара Автоматизация-макос-проведия с chef Если вы предпочитаете это. Я не мог найти что -то подобное и свежее для марионеток, поэтому я извиняюсь, фанаты куклы.
Вот почему я решил следовать принципу поцелуя и выбрал Ansible.
Это легко написать и читать конфигурацию, она позволяет группировать задачи и добавлять логику выполнения , и кажется, что больше DevOps выполняют команды оболочки внутри задач Ansible вместо сценариев оболочки; Я знаю, ты знаешь, что 😂
Кстати, Ansible Galaxy также не имеет много пакетов управления для MacOS. Но, к счастью, у него есть основы:
- Homebrew с homebrew_cask и homebrew_tap — Чтобы установить программное обеспечение
- Запускд — Управление услугами
- osx_defaults — Чтобы управлять некоторыми настройками пользователя (не все!)
Я использовал Ansible, чтобы построить MacOS AMI для CI/CD, поэтому вот несколько советов для такого случая.
Некоторые значения преднамеренно кодируются в примерах кода ради простоты и простого чтения. Вы, вероятно, захотите параметризировать их.
Пример установки XCODE
Следующие задачи помогут вам автоматизировать основы.
- name: Install Xcode shell: "xip --expand Xcode.xip" args: chdir: /Applications - name: Accept License Agreement shell: "/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -license accept" - name: Accept License Agreement shell: "/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -runFirstLaunch" - name: Switch into newly installed Xcode context shell: "xcode-select --switch /Applications/Xcode.app/Contents/Developer"
Пример установки программного обеспечения с помощью Brew
- name: Install common build software community.general.homebrew: name: "{{ item }}" state: latest loop: - swiftlint - swiftformat - wget
Пример конфигурации экрана (удаленный рабочий стол)
- name: Turn On Remote Management shell: "./kickstart -activate -configure -allowAccessFor -specifiedUsers" args: chdir: /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/ - name: Enable Remote Management for CI user shell: "./kickstart -configure -users ec2-user -access -on -privs -all" args: chdir: /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/
Оболочка правила, да.
Пэкер от hashicorp , конечно.
Я хотел бы сравнить Packer с EC2 Builder, но это не поддерживает macOS Тем не менее (по состоянию на февраль 21).
Конфигурация упаковки проста, поэтому я хочу выделить только вещи, специфичные для варианта использования Mac1.metal.
Тайм -ауты
Как я упоминал в Предыдущая статья , время создания и удаления экземпляра «MAC1.Metal» значительно больше, чем Linux. Вот почему вы должны поднять параметры опроса для строителя.
Пример:
"aws_polling": { "delay_seconds": 30, "max_attempts": 60 }
И было бы лучше, если бы вы также увеличили тайм -аут SSH:
"ssh_timeout": "1h"
К счастью, Builder’s AMI Packer не требует явного объявления о посвященном Таким образом, вы можете просто ссылаться на ту же подсеть, где вы выделяли хост,
Пример:
"tenancy": "host", "subnet_id": "your-subnet-id"
Обеспечение
Упаковщик имеет Ansible Provisioner что я использовал для ами. Его документация также очень чистая и простая.
Но по -прежнему стоит упомянуть, что если вы хотите параметризировать Ansible Playbook, то следующий пример конфигурации будет удобно:
"extra_arguments": [ "--extra-vars", "your-variable-foo=your-value-bar]" ], "ansible_env_vars": [ "ANSIBLE_PYTHON_INTERPRETER=auto_legacy_silent", "ANSIBLE_OTHER_ENV_VARIABLE=other_value" ]
Если вы знакомы с AWS EC2, вы, вероятно, знаете, какой экземпляр Пользовательские данные
является.
Группа разработчиков AWS сделала что -то подобное для MacOS: EC2 macOS init Анкет
Он не поддерживает Cloud-init
Как и на экземплярах на основе Linux, но он может запускать сценарии оболочки, чего достаточно.
EC2 MacOS Init Utility — это демон запуска (MacOS Terminology), который работает от имени корень
Пользователь в системе загрузки. Он выполняет команды в соответствии с так называемыми приоритетными группами или последовательности, другими словами.
Количество группы соответствует порядку выполнения. Вы можете поместить несколько задач в одну приоритетную группу, и инструмент выполнит их одновременно.
EC2 MacOS Init использует файл конфигурации, читаемый на человеке, в Toml
формат.
Пример:
[[Module]] Name = "Create-some-folder" PriorityGroup = 3 FatalOnError = false RunPerInstance = true [Module.Command] Cmd = ["mkdir", "/Users/ec2-user/my-directory"] RunAsUser = "ec2-user" EnvironmentVars = ["MY_VAR_FOO=myValueBar"]
Я должен прояснить некоторые вещи здесь.
Модули-набор предварительно определенных модулей для разных целей. Это что -то похожее на модули Ansible.
Вы можете найти список доступных модулей здесь EC2-MACOS-INIT/LIB/EC2MACOSINIT
Runperinstance
Директива управляет, должен ли модуль работать. Есть три из таких директив, и вот что они имеют в виду:
Runperboot
— Модуль будет работать на каждой загрузке системыRunperinstance
— Модуль будет работать один раз для экземпляра. Каждый экземпляр имеет уникальный идентификатор; Инструмент init извлекает его из API API AWS до выполнения и сохраняет историю выполнения на идентификатор экземпляра. Когда вы создаете новый экземпляр из AMI, он будет иметь уникальный идентификатор, и модуль будет работать снова.Runonce
— Модуль будет работать только один раз, несмотря на изменение идентификатора экземпляра
Я упомянул историю исполнения выше. Когда EC2 MacOS Init запускается в первый раз, он создает уникальный каталог с идентификатором идентификатором экземпляра для хранения истории выполнения и копии пользовательских данных.
Runperinstance
и Runonce
Директивы зависят от истории выполнения, и модули с этими директивами снова будут работать при следующей загрузке, если предыдущее выполнение не удалось. Для меня не было очевидно, почему Рунсе продолжает повторять себя каждый ботинок, пока я не выпал в исходный код .
Наконец, есть модуль для пользовательских данных. Он работает в конце по умолчанию (приоритетная группа № 4) и вытаскивает сценарий пользовательских данных из API API перед выполнением скрипта.
Я предлагаю посмотреть по умолчанию init.toml Файл конфигурации, чтобы получить более знакомство с возможностями инструмента.
Инструмент init также может очистить свою историю, которая полезна для нового создания AMI.
Пример:
ec2-macos-init clean -all
И вы можете запустить init вручную в целях отладки.
Пример:
ec2-macos-init run
Вы также можете объединить действия EC2 MacOS (выполненные модулями) с вашим скриптом в пользовательских данных для более точных нетривиальных конфигураций.
В целом, создание и эксплуатационное AMI на основе MacOS не отличается от управления AMI для других платформ.
Существуют те же самые принципиальные этапы: подготовить, очистить, строить, выполнить скрипт развертывания (при необходимости). Тем не менее, конкретная реализация каждого шага имеет свои нюансы и ограничения.
Таким образом, весь процесс может выглядеть следующим образом:
- Предоставление и настройка необходимого программного обеспечения с помощью Ansible Playbook
- Журналы системы очистки и macOS EC2 Инициация Инициации
- Создайте AMI
- Добавьте больше настроек при запуске с модулями EC2 MacOS Init и пользовательскими данными (которые также выполняют ваши команды Playbook или Shell)
Попасть во все это было и весело, и интересно. Иногда больно, хотя. 😆
Я искренне надеюсь, что эта статья вам полезна. Спасибо за чтение!
Mac1.metal в AWS (5 серии деталей)
Оригинал: «https://dev.to/aws-builders/customizing-mac1-metal-ec2-ami-new-guts-more-glory-48da»