Terraform: инфраструктура на уровне кода | страница 26



В случае с декларативным кодом нужно лишь описать желаемое конечное состояние, а 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"

}

Естественно, это упрощенные примеры. Ansible позволяет использовать теги для поиска имеющихся серверов EC2, прежде чем добавлять новые (скажем, с помощью параметров instance_tags и count_tag). Однако ручная организация такого рода логики для каждого ресурса, которым вы управляете с применением Ansible, с учетом истории его изменений может оказаться на удивление сложной. Вам придется искать существующие серверы не только по тегам, но также по версии образа и зоне доступности. Из этого вытекают две основные проблемы с процедурными средствами IaC.