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.