Читаем Terraform: инфраструктура на уровне кода полностью

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Для использования средства инициализации remote-exec потребуется чуть больше усилий. Чтобы выполнить код на удаленном ресурсе, таком как сервер EC2, вашему клиенту Terraform придется сделать следующее.

• Связаться с сервером EC2 по сети. Вы уже знаете, как разрешить это с помощью группы безопасности.

• Пройти аутентификацию на сервере EC2. Средство инициализации remote-exec поддерживает протоколы SSH и WinRM. Поскольку вы будете запускать сервер под управлением Linux (Ubuntu), нужно использовать аутентификацию по SSH. Значит, вам необходимо сконфигурировать SSH-ключи.

Для начала создадим группу безопасности, которая разрешает входящие соединения на стандартном для SSH порте под номером 22:

resource "aws_security_group" "instance" {

  ingress {

    from_port = 22

    to_port   = 22

    protocol  = "tcp"

    # Чтобы этот пример можно было легко попробовать, мы разрешаем все

    # соединения по SSH.

    # В реальных условиях вы должны принимать их только с доверенных IP-адресов.

    cidr_blocks = ["0.0.0.0/0"]

  }

}

Обычно для аутентификации нужно сгенерировать на своем компьютере пару SSH-ключей: открытый и секретный. Первый следует загрузить в AWS, а второй сохранить в надежном месте, откуда к нему сможет обратиться Terraform. Но, чтобы вам проще было попробовать этот пример, можете использовать ресурс tls_private_key, который сгенерирует секретный ключ автоматически:

# Чтобы этот пример можно было легко попробовать, мы генерируем секретный ключ

# в Terraform.

# В реальных условиях управление SSH-ключами следует вынести за пределы Terraform.

resource "tls_private_key" "example" {

  algorithm = "RSA"

  rsa_bits = 4096

}

Этот секретный ключ хранится в состоянии Terraform, что не очень хорошо для промышленного использования, но подойдет для этого примера. Теперь загрузим открытый ключ в AWS с помощью ресурса aws_key_pair:

resource "aws_key_pair" "generated_key" {

  public_key = tls_private_key.example.public_key_openssh

}

Приступим к написанию кода для сервера EC2:

resource "aws_instance" "example" {

  ami                    = "ami-0c55b159cbfafe1f0"

  instance_type          = "t2.micro"

  vpc_security_group_ids = [aws_security_group.instance.id]

  key_name               = aws_key_pair.generated_key.key_name

}

Первые несколько строк этого кода должны показаться знакомыми: они развертывают Ubuntu Amazon Machine Image (AMI) на t2.micro и привязывают к этому серверу EC2 группу безопасности, которую вы создали ранее. Единственное нововведение — это использование атрибута key_name, который позволяет AWS привязать ваш открытый ключ к серверу EC2. AWS добавит этот ключ в его файл authorized_keys, благодаря чему вы сможете зайти на этот сервер по SSH с соответствующим секретным ключом.

Теперь добавим к серверу EC2 средство инициализации remote-exec:

resource "aws_instance" "example" {

  ami                    = "ami-0c55b159cbfafe1f0"

  instance_type          = "t2.micro"

  vpc_security_group_ids = [aws_security_group.instance.id]

  key_name               = aws_key_pair.generated_key.key_name

  provisioner "remote-exec" {

    inline = ["echo \"Hello, World from $(uname -smp)\""]

  }

}

Это почти ничем не отличается от средства инициализации local-exec, только вместо одной исполняемой команды (command) здесь с помощью аргумента inline передается их список. В завершение вам нужно сконфигурировать Terraform для подключения к этому серверу EC2 по SSH при запуске remote-exec. Для этого предусмотрен блок connection:

resource "aws_instance" "example" {

  ami                    = "ami-0c55b159cbfafe1f0"

  instance_type          = "t2.micro"

  vpc_security_group_ids = [aws_security_group.instance.id]

  key_name               = aws_key_pair.generated_key.key_name

  provisioner "remote-exec" {

    inline = ["echo \"Hello, World from $(uname -smp)\""]

  }

  connection {

    type        = "ssh"

    host        = self.public_ip

    user        = "ubuntu"

    private_key = tls_private_key.example.private_key_pem

  }

}

Блок connection заставляет Terraform подключиться к публичному IP-адресу сервера EC2 по SSH с помощью имени пользователя "ubuntu" (так по умолчанию называется корневой пользователь в образах AMI с Ubuntu) и автоматически сгенерированного секретного ключа. Обратите внимание на ключевое слово self, которое применяется для задания параметра host. Это выражение со следующим синтаксисом:

self.

Этот специальный синтаксис можно использовать исключительно в блоках connec­tion и provisioner для обращения к выходному атрибуту родительского ресурса. Если применить стандартный синтаксис вида aws_instance.example., получится ошибка циклической зависимости, так как ресурс не может ссылаться на самого себя. Таким образом, выражение self является обходным решением, которое было добавлено специально для средств инициализации ресурсов.

Перейти на страницу:

Все книги серии Бестселлеры O'Reilly

Искусство управления IT-проектами
Искусство управления IT-проектами

В отличие от множества трудов, посвященных руководству проектами и командами, в этой книге не проповедуются никакие новые учения и не превозносятся великие теории. Скотт Беркун считает залогом успеха практику и разнообразие подходов. В книге описываются основные сложности и проблемные ситуации, возникающие в работе менеджера проекта, даны рекомендации по выходу из них.Издание предназначено не только для лидеров команд и менеджеров высшего звена, но и для программистов, тестеров и других исполнителей конкретных проектных заданий. Также оно будет полезно студентам, изучающим бизнес-менеджмент, проектирование изделий или программную инженерию.Текст нового издания значительно переработан автором с целью добиться большей ясности, кроме того, книга дополнена новым приложением и более чем 120 практическими упражнениями.

Скотт Беркун

Деловая литература
iOS. Приемы программирования
iOS. Приемы программирования

Книга, которую вы держите в руках, представляет собой новый, полностью переписанный сборник приемов программирования по работе с iOS. Он поможет вам справиться с наболевшими проблемами, с которыми приходится сталкиваться при разработке приложений для iPhone, iPad и iPod Touch. Вы быстро освоите всю информацию, необходимую для начала работы с iOS 7 SDK, в частности познакомитесь с решениями для добавления в ваши приложения реалистичной физики или движений — в этом вам помогут API UIKit Dynamics.Вы изучите новые многочисленные способы хранения и защиты данных, отправки и получения уведомлений, улучшения и анимации графики, управления файлами и каталогами, а также рассмотрите многие другие темы. При описании каждого приема программирования приводятся образцы кода, которые вы можете смело использовать.

Вандад Нахавандипур

Программирование, программы, базы данных / Программирование / Книги по IT

Похожие книги