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

Конечно, с помощью средств управления конфигурацией можно выполнять и изменяемые развертывания, но для них такой подход не характерен; в то же время для средств инициализации ресурсов он является вполне естественным. Стоит также отметить, что у неизменяемого подхода есть и недостатки. Например, даже в случае тривиального изменения придется заново собрать образ из шаблона сервера и снова развернуть его на всех ваших узлах, что займет много времени. Более того, неизменяемость сохраняется только до запуска образа. Как только сервер загрузится, он начнет производить запись на жесткий диск и испытывать дрейф конфигурации в той или иной степени (хотя это можно минимизировать, если делать частые развертывания).

Выбор между процедурными и декларативными языками

Chef и Ansible поощряют процедурный стиль — когда код пошагово описывает, как достичь желаемого конечного состояния. А вот Terraform, CloudFormation, SaltStack, Puppet и Open Stack Heat исповедуют более декларативный подход: вы описываете в своем коде нужное вам конечное состояние, а средства IaC сами разбираются с тем, как его достичь.

Чтобы продемонстрировать это различие, рассмотрим пример. Представьте, что вам нужно развернуть десять серверов (экземпляров, или инстансов,EC2 в терминологии AWS) для выполнения AMI с идентификатором ami-0c55b159cbfafe1f0 (Ubun­tu 18.04). Так выглядит шаблон Ansible, который делает это в процедурном стиле:

- ec2:

    count: 10

    image: ami-0c55b159cbfafe1f0

    instance_type: t2.micro

А вот упрощенный пример конфигурации Terraform, который делает то же самое, используя декларативный подход:

resource "aws_instance" "example" {

  count         = 10

  ami           = "ami-0c55b159cbfafe1f0"

  instance_type = "t2.micro"

}

На первый взгляд подходы похожи, и если выполнить их с помощью Ansible или Terraform, получатся схожие результаты. Но самое интересное начинается тогда, когда нужно что-то поменять.

Представьте, что у вас повысилась нагрузка и вы хотите увеличить количество серверов до 15. В случае с Ansible написанный ранее процедурный код становится бесполезным; если вы просто запустите его снова, поменяв значение на 15, у вас будет развернуто 15 новых серверов, что в сумме даст 25! Таким образом, чтобы добавить пять новых серверов, вам нужно написать совершенно новый процедурный скрипт с учетом того, что у вас уже развернуто:

- ec2:

    count: 5

    image: ami-0c55b159cbfafe1f0

    instance_type: t2.micro

В случае с декларативным кодом нужно лишь описать желаемое конечное состояние, а Terraform разберется с тем, как этого достичь, учитывая любые изменения, сделанные в прошлом. Таким образом, чтобы развернуть еще пять серверов, вам достаточно вернуться к той же конфигурации Terraform и поменять поле count с 10 на 15:

resource "aws_instance" "example" {

  count         = 15

  ami           = "ami-0c55b159cbfafe1f0"

  instance_type = "t2.micro"

}

Если вы примените эту конфигурацию, Terraform поймет, что у вас уже есть десять серверов и нужно создать еще пять. Еще до применения конфигурации можно воспользоваться командой Terraform plan, чтобы увидеть, какие изменения будут внесены:

$ terraform plan

# aws_instance.example[11] will be created

+ resource "aws_instance" "example" {

    + ami            = "ami-0c55b159cbfafe1f0"

    + instance_type  = "t2.micro"

    + (...)

  }

# aws_instance.example[12] will be created

+ resource "aws_instance" "example" {

    + ami            = "ami-0c55b159cbfafe1f0"

    + instance_type  = "t2.micro"

    + (...)

  }

# aws_instance.example[13] will be created

+ resource "aws_instance" "example" {

    + ami            = "ami-0c55b159cbfafe1f0"

    + instance_type  = "t2.micro"

    + (...)

  }

# aws_instance.example[14] will be created

+ resource "aws_instance" "example" {

    + ami            = "ami-0c55b159cbfafe1f0"

    + instance_type  = "t2.micro"

    + (...)

  }

Plan: 5 to add, 0 to change, 0 to destroy.

А если вы хотите развернуть другую версию приложения, например AMI с идентификатором ami-02bcbb802e03574ba? В случае с процедурным подходом оба шаблона Ansible, которые вы уже написали, снова становятся бесполезными. Поэтому необходим еще один шаблон, чтобы отследить те 10 (или уже 15?) серверов, которые вы развернули ранее, и тщательно обновить каждый из них до новой версии. Если использовать декларативный подход, предлагаемый Terraform, достаточно снова вернуться к тому же конфигурационному файлу и просто поменять параметр ami на ami-02bcbb802e03574ba:

resource "aws_instance" "example" {

  count         = 15

  ami           = "ami-02bcbb802e03574ba"

  instance_type = "t2.micro"

}

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

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

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

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

Скотт Беркун

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

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

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

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

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