Рубрики
Uncategorized

Настройка MAC1.Metal EC2 AMI — новые кишки, Больше славы

Я предполагаю, что MacOS был разработан для пользователя, а не для OPS или инженеров, поэтому именно его настройка … Tagged с AWS, MacOS, DevOps, ShowDev.

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»