Назад | Перейти на главную страницу

Как добавить тег в экземпляры Windows Server 2012 в AWS OpsWorks через рецепт Chef?

Моему работодателю необходимо добавить теги к экземплярам AWS ec2, запущенным в OpsWorks, после их подключения к сети.

Все экземпляры - это MS Windows Server 2012 R2 Base в этом стеке. Цель состоит в том, чтобы добавить пользовательские теги, такие как «application»: «foo», к экземплярам, ​​запущенным в стеке Foo и «application»: «bar» в стеке Bar.

Я нашел github repo chef-aws-tag который, я думаю, сделал бы то, что мне нужно, если бы я запускал Chef 11 в Linux. OpsWorks поддерживает только Windows Server 2012 и только с Chef 12.2.

Когда я добавляю рецепт chef-aws-tag из репозитория github к событию жизненного цикла установки, экземпляр выходит из строя в «running_setup» с «setup_failed».

Затем журнал сбоев Chef сообщает об этом сбое на этапе running_setup:

INFO: HTTP Request Returned 412 Precondition Failed : No such cookbook: aws 
ERROR: Running exception handlers
FATAL: Net::HTTPServerException: 412 "Precondition Failed "

Это соответствует зависимости в metadata.rb, строке: depends 'aws', '>= 0.2.4'
Я понимаю, что зависимость отсутствует. Мне непонятно, как выполнить эту зависимость. Рецепт находится в S3, URL-адрес репозитория https://s3-us-west-2.amazonaws.com/employer/ec2instance-tagging.zip

Когда я добавляю рецепт в событие «Настроить жизненный цикл», компьютер подключается к сети без ошибок, но теги не добавляются. «Стандартные» теги появляются для экземпляра ec2; Ключи «opsworks: instance», «opsworks: layer: foo_layer», «opsworks: stack» и «Name» имеют ожидаемые значения. Теги, которые я хочу добавить через рецепт («приложение», «команда», «среда»), отсутствуют.

Пользовательский JSON добавляется на уровне стека:

{ "aws-tag": {
        "tags": {
            "team": "specialteam",
            "application": "foo",
            "environment": "development"
        }
    }
}

Есть ли специальный рецепт или поваренная книга для OpsWorks AWS, который я должен вызвать, чтобы установить теги на экземплярах после загрузки? Как мне назвать этот рецепт?

Я читал это Сообщение в блоге AWS об использовании OpsWorks для настройки развертывания приложений. Мне не хватает идентичного рецепта или кулинарной книги "установить теги aws на экземпляре через шеф-повара", которые есть в Amazon Web Services - Лаборатория репозиторий на GitHub?

В aws opsworks-поваренные книги на github скажите: «Для Chef 12.2 Windows и Chef 12 Linux нет встроенных кулинарных книг», но я надеюсь, что это неправильно :-) и что была добавлена ​​кулинарная книга, которую я еще не нашел. В качестве альтернативы, надеюсь, кто-то уже сделал это и где-то задокументировал.

Я устраняю это после этого сообщения в блоге AWS Быстро изучить среду Chef в AWS OpsWorks (снова написано для Linux) и это Вопрос SF по отладке Chef на Opsworks


Я смог разобраться в этом самостоятельно. Открыв обращение в AWS Support, я получил достаточно указаний для решения этой проблемы.

Лежачие полицейские, чтобы обойти их

  1. Различная структура каталогов поваренной книги для разных платформ при использовании архивного файла.

    Если вы предоставляете свои рецепты через архивный файл, хранящийся на AWS S3, AWS требует одну структуру каталогов для Linux и другую, другую, структура каталогов для Windows.

    Linux может поместить несколько кулинарных книг в один корневой каталог. Это то, что $ berks package делает по умолчанию.

    Windows не принимает этот корневой каталог. В $ berks package команда не имеет возможности создать один архив с несколькими кулинарными книгами, как это допускает Windows. Пришлось редактировать tar-файл вручную.

  2. Ruby в Windows

    Есть "error: Seahorse::Client::NetworkingError: SSL_connect" ошибка которые могут появиться в кулинарной книге aws. AWS требует https между сервисами. Для этого требуется рабочий пакет центра сертификации. Ruby в Windows не может получить доступ к набору сертификатов ЦС ОС. Это можно исправить, если:

    а) вы устанавливаете гем aws-sdk, затем

    б) укажите в рецепте путь к curl-ca-bundle.crt

  3. Подробная информация о зависимостях и рецептах сообщества.

    В документация по AWS для Chef 12 в Windows не упоминает ни Berksfile, ни поваренные книги сообщества. Эти задокументировано на AWS для Chef 11 в Linux.

  4. Уточнить область при вызове обновления.

    Странно, что запуск рецепта на экземпляре говорит, что экземпляр не существует.

    FATAL: Aws::EC2::Errors::InvalidInstanceIDNotFound: aws_resource_tag[i-5ccd24d4] (stemsoft::default line 27) had an error: Aws::EC2::Errors::InvalidInstanceIDNotFound: The instance ID 'i-5ccd24d4' does not exist

    Коды ошибок AWS говорит, что InvalidInstanceID.NotFound может быть вызван а) нахождением за пределами региона или б) идентификатором недавно созданного экземпляра не распространяется через систему.

    Исправление должно включать region stack['region'] в aws_resource_tag блок рецепта.

  5. Правильные политики, привязанные к правильным ролям

    Убедитесь, что как aws-opsworks-ec2-role, так и aws-opsworks-service-role настроены с правильной политикой. 'aws-opsworks-service-role' можно оставить как есть, чтобы служба OpsWorks могла выполнять вызовы API к другим сервисам AWS. 'aws-opsworks-ec2-role', профиль экземпляра IAM по умолчанию, требует разрешения на ec2 для создания и описания тегов.

Процедура

Целью описанных ниже шагов является создание стека OpsWorks, который запускает Chef 12 на Microsoft Windows Server 2012, с (настраиваемой) поваренной книгой, содержащей рецепт для установки настраиваемого тега. Тег получает информацию из пользовательского json, установленного в стеке в моем примере.

Я не нашел существующей кулинарной книги, которая бы это сделала. Я лучше буду использовать существующую поваренную книгу, чем создавать собственную поваренную книгу.

В конце этой процедуры в рецепте используется поваренная книга сообщества шеф-поваров 'aws' для обновления тега "team" из значений, установленных в пользовательском json, определенном в настройках стека.

Для этого рецепт получает подробную информацию об экземпляре, используя поиск в существующем пакете данных. Он также получает информацию о регионе, используя поиск во втором существующем пакете данных.

(У меня это сработало ....)

  1. В AWS стек сборки
  2. В AWS назначьте собственный json в стек
    • {"aws-tag": {"tags": {"team": "teamFooBar"}}}
  3. В AWS настройте стек с настраиваемым репозиторием. В этом примере используется s3
  4. В AWS создайте слой
    • короткое имя все в нижнем регистре
    • Группа безопасности AWS-OpsWorks-Blank-Server
    • Рецепты / Настройка для 'Настроить событие жизненного цикла' Например, если ваш рецепт назван один раз тогда «Настроить событие жизненного цикла» должно содержать onetime :: по умолчанию рецепт блюда
  5. Локально установить ChefDK (Комплект для разработки от шеф-повара)
    • Локально установите Git для Windows
    • мне нравиться git-bash.exe
  6. Локально используйте Chef для инициализации каталога поваренной книги cookbook_dir
    • cd в build_root
    • внутри build_root сделать каталог cookbook_dir
    • в build_root chef generate cookbook cookbook_dir
      • пример: $ chef generate cookbook cookbook_dir --berks --copyright 'EMPLOYER' --email 'administrator@employerexample.com'
  7. Локально отредактируйте файл cookbook_dir \ metadata.rb.
    • Добавить depends 'aws'
  8. Локально отредактируйте файл cookbook_dir \ recipes \ default.rb
    • '# {node [' aws-tag '] [' tags '] [' team ']}' вернет "teamFooBar" в моем примере
    • отредактируйте рецепт, чтобы вызвать правильный ca-bundle.crt
    • после редактирования проверьте синтаксис ruby ​​рецепта с помощью $ ruby -c /path/to/cookbook_dir/recipes/default.rb
  9. Локально, One Time Setup, инициализировать berksfile
    • в Git для Windows MinTTY cd к cookbook_dir и используйте $ berks install для инициализации файла berksfile и отслеживания зависимостей
  10. Локально отредактируйте cookbook_dir Berksfile
    • Добавить cookbook 'aws'
  11. Локально перейдите в файл cookbook_dir и запустите $ berks package построить cookbook_dir.tar.gz
  12. Локально отредактируйте файл архива для MS Windows Server 2012
    • распаковать cookbook_dir.tar.gz. Переместите все из каталога "кулинарные книги" на один уровень выше. Перепаковка cookbook_dir.tar.gz
  13. загрузить cookbook_dir.tar.gz в s3
    • удалить предыдущую копию из s3
    • убедитесь, что разрешения указаны правильно (при необходимости "Сделайте все общедоступным")
  14. В AWS, One Time Setup, измените роль, назначенную экземпляру, запущенному OpsWorks, право на обновление тега
    • 'aws-opsworks-ec2-role' «Заявление»: [{«Действие»: [«ec2: CreateTags», «ec2: DescribeTags»], «Ресурс»: [«*»], «Эффект»: «Разрешить» }]
  15. Запуск экземпляра
    • добавить экземпляр
    • запустить экземпляр
    • stack> Run Command> Update Custom Cookbooks
  16. Исправить гем aws-sdk для Windows не поставляется с надлежащим файлом ca-bundle.crt
    • установить рубин
      • при первоначальной настройке этот шаг был необходим
      • в последующем тестовом прогоне этот шаг не понадобился
    • установить aws-sdk
      • при первоначальной настройке этот шаг был необходим
      • в последующем тестовом прогоне этот шаг не понадобился
  17. Подтвердите, что это работает
    • проверьте экземпляр ec2 на наличие правильного тега
    • проверьте журналы экземпляра OpsWorks (команда настройки)
    • Пример успеха: INFO: AWS: Updating the following tags for resource i-12345678 (skipping AWS tags): { .... "team"=>"teamFooBar"}

Пример рецепта

Пример рецепта example::default.rb

Chef::Log.info("********** from custom json, Team  is  '#{node['aws-tag']['tags']['team']}' **********")

instance = search("aws_opsworks_instance", "self:true").first
Chef::Log.info("Instance id from data bag: #{instance['ec2_instance_id']}" )

stack = search("aws_opsworks_stack").first
Chef::Log.info("**********  stack['region'] from data bag:  '#{stack['region']}' **********")

include_recipe 'aws'
chef_gem "aws-sdk" do
    compile_time false
    action :install
    version node[:aws][:aws_sdk_version]
end

ruby_block "Set the AWS Bundle" do
   block do
      require 'aws-sdk'
      Aws.config[:ssl_ca_bundle] = 'C:\ProgramData\Git\bin\curl-ca-bundle.crt'
   end
   action :run
end

aws_resource_tag instance['ec2_instance_id'] do
    tags('team' => node['aws-tag']['tags']['team']   )
    region stack['region']
    action :update
    Chef::Log.info("********** updated tags('team') **********")
end