Если выполнить для этого кода команду terraformapply, получится следующее:
$ terraform apply
(...)
aws_instance.example: Creating...
aws_instance.example: Still creating... [10s elapsed]
aws_instance.example: Still creating... [20s elapsed]
aws_instance.example: Provisioning with 'remote-exec'...
aws_instance.example (remote-exec): Connecting to remote host via SSH...
aws_instance.example (remote-exec): Connecting to remote host via SSH...
aws_instance.example (remote-exec): Connecting to remote host via SSH...
(... repeats a few more times ...)
aws_instance.example (remote-exec): Connecting to remote host via SSH...
aws_instance.example (remote-exec): Connected!
aws_instance.example (remote-exec): Hello, World from Linux x86_64 x86_64
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
Сравнение средств инициализации ресурсов и пользовательских данных
Вы познакомились с двумя разными способами выполнения скриптов на сервере с помощью Terraform: один с использованием средства инициализации remote-exec, а другой — с применением скрипта пользовательских данных. Последний мне кажется более полезным по нескольким причинам.
Средство инициализации remote-exec требует открытия доступа к вашим серверам по SSH или WinRM, что усложняет управление (как вы сами могли убедиться, поработав с группами безопасности и SSH-ключами) и ухудшает безопасность по сравнению с пользовательскими данными, которым нужен лишь доступ к API AWS (он требуется в любом случае для использования Terraform).
Вы можете применять скрипты пользовательских данных в сочетании с группами ASG. Благодаря этому все серверы в заданной группе ASG (включая те, что запускаются в результате автомасштабирования или автовосстановления) выполнят скрипт во время своей загрузки. Средства инициализации ресурсов действуют только во время работы Terraform, но не с ASG.
Скрипт пользовательских данных можно видеть в консоли EC2 (выберите сервер и щелкните ActionsInstance SettingsView/Change User Data (ДействияНастройки сервераПросмотреть/изменить пользовательские данные)), а его журнал выполнения можно найти на самом сервере EC2 (обычно в файле /var/log/cloud-init*.log). Обе возможности полезны при отладке, и ни одна из них не доступна для средств инициализации ресурсов.
У средств инициализации ресурсов всего два преимущества.
Максимальный размер скриптов пользовательских данных равен 16 Кбайт, тогда как скрипты инициализации ресурсов могут быть произвольной длины.
Chef, Puppet и Salt автоматически устанавливают, конфигурируют и запускают на сервере соответствующие клиенты. Благодаря этому для настройки серверов проще использовать инструменты управления конфигурацией вместо специализированных скриптов.
Средство инициализации remote-exec не знает, когда именно сервер EC2 завершит загрузку и будет готов принимать соединения, поэтому оно периодически пытается подключиться по SSH, пока у него это не получится или пока не истечет время ожидания. Время ожидания по умолчанию равно пяти минутам, но вы можете его сконфигурировать. Рано или поздно соединение будет установлено и вы получите от сервера ответ Hello, World.
Следует отметить, что по умолчанию средство инициализации действует
Вы можете указать несколько средств инициализации для одного и того же ресурса, и Terraform запустит их по очереди, сверху вниз. Чтобы объяснить Terraform, как обрабатывать ошибки, полученные в результате инициализации, можно использовать аргумент on_failure: если присвоить ему "continue", Terraform проигнорирует ошибку и продолжит создание/удаление ресурса; если присвоить ему "abort", Terraform прервет создание/удаление.
Средства инициализации ресурсов с использованием null_resource
Средства инициализации можно определять только внутри ресурса, но иногда при их выполнении хочется обойтись без привязки к определенному ресурсу. Это можно сделать с помощью сущности под названием null_resource, которая ведет себя как обычный ресурс Terraform, но при этом ничего не создает. Определив средство инициализации для null_resource, вы можете запустить свой скрипт в рамках жизненного цикла Terraform, не привязываясь ни к какому «настоящему» ресурсу:
resource "null_resource" "example" {
provisioner "local-exec" {
command = "echo \"Hello, World from $(uname -smp)\""
}
}
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии