У меня есть terraform
подготовленная AWS
структура. Я подготовил шеф-повар для выполнения рецепта, но проблема в том, что экземпляры не имеют атрибута node_name
, потому что они предоставляются Terraform
с использованием AutoScaling Group
и chef client
, установленных с помощью сценария user_data
. Имя узла генерируется chef
, и мне нужно сначала выполнить некоторые установки для каждого экземпляра. Я попытался создать роль base
и обновить ее до сервера с помощью необходимых действий. Обновление выполнено успешно, но установки на экземпляре не запускаются. Есть ли способ запустить команду или назначить роль каждому вновь прибывшему экземпляру?
Выполнение рецепта с шеф-поваром на подготовленном экземпляре Autoscaling
Ответы:
Есть два решения, о которых я могу думать:
- Добавьте скрипт, который вы хотите загрузить в EC2, в атрибут user_data файла aws_instance
Eg:
resource "aws_instance" "foo" {
ami = "ami-408c7f28"
instance_type = "t1.micro"
user_data = "**your script**"
}
- Запускайте их из собственного пользовательского AMI.
Вы должны испечь подготовку в сочетании AMI и сценария инициализации в LaunchConfig. https://github.com/coderanger/octan_demo/blob/master/tf/octan_cluster/main.tf#L156-L167 и https://github.com/coderanger/octan_demo/blob/master/tf/octan_cluster/bootstrap.tpl — это пример использования chef-solo (ну, локальный режим, потому что соло не еще не поддерживает политики, но это другая история), но это должно дать вам представление. У вас будет аналогичный сценарий, который устанавливает Chef, создает конфигурацию, загружает ключ проверки (вероятно, из S3 с использованием ролей IAM), а затем запускает первый запуск chef-client
. https://github.com/coderanger/brix/blob/master/packer/client-bootstrap.sh — еще один пример из прошлого, показывающий это для шеф-клиента, в этом случае он генерировал конфигурацию на основе данных CloudFormation, а ключ установки и проверки Chef был встроен в AMI. .
Спасибо за ответы. Пользовательский AMI не подходит, поэтому мне пришлось искать другой подход. Оказывается, вы можете пропустить часть chef-service-manager
и напрямую вызвать chef client
. Дело в том, что вы можете назначить файл JSON
в качестве параметра для chef client
. JSON
может содержать runlist
и/или role
, которые могут быть назначены новому экземпляру, даже если он создан Autoscaling group
. Поскольку я уже использую user_data
, я просто добавил создание JSON
в скрипт и назначил нужную роль, которая уже имеет runlist
в Chef Server
. Оба ответа помогли мне добраться туда. Теперь в каждом новом экземпляре через user_data
я создаю JSON
с ролью и, наконец, запускаю chef client -f role_config.json
, после чего вызываю создание службы chef-service-manager
. Это всего лишь патч, поскольку лучшим вариантом будет не создавать его как службу, а вместо этого использовать scheduled task
и вызывать json
каждый раз, поскольку, если он будет вызываться во второй раз для одного и того же экземпляра, он будет проигнорирован в будущих запусках. Также из того, что я прочитал в документации Chef
, scheduled task
будет лучшим вариантом, чем использование сервиса. Спасибо за ответы!
aws_instance
. Экземпляры создаютсяlaunch_configuration
иAutoscaling Group
, поэтому я не могу использоватьprovisioner
или привязать роль к конкретному экземпляру. 05.05.2017