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»