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



$ terraform init

Initializing modules...

- webserver_cluster in ../../../modules/services/webserver-cluster

Initializing the backend...

Initializing provider plugins...

Terraform has been successfully initialized!

Теперь вы знаете обо всех хитростях в арсенале команды init. Она сама умеет загружать провайдеры и модули, а также конфигурировать ваши хранилища.

Прежде чем применять этот код, нужно упомянуть об одном недостатке модуля webserver-cluster: все имена в нем прописаны вручную. Это касается групп безопасности, ALB и других ресурсов. Таким образом, при попытке повторного использования этого модуля вы получите конфликты имен. Прямо в коде прописаны даже параметры для обращения к базе данных, поскольку файл main.tf, который вы скопировали в modules/services/webserver-cluster, берет адрес и порт БД из источника данных terraform_remote_state, а тот написан лишь с расчетом на тестовую среду.

Чтобы исправить эти проблемы, необходимо добавить в модуль webserver-cluster конфигурируемые входные параметры. Это позволит ему менять свое поведение в зависимости от окружения.


Входные параметры модуля

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

def example_function(param1, param2)

  puts "Hello, #{param1} #{param2}"

end

# Другие участки вашего кода

example_function("foo", "bar")

Модули Terraform тоже могут иметь параметры. Для их определения используется уже знакомый вам механизм: входные переменные. Откройте файл modules/services/webserver-cluster/variables.tf и добавьте три новых блока variable:

variable "cluster_name" {

  description = "The name to use for all the cluster resources"

  type        = string

}

variable "db_remote_state_bucket" {

  description = "The name of the S3 bucket for the database's remote state"

  type        = string

}

variable "db_remote_state_key" {

  description = "The path for the database's remote state in S3"

  type        = string

}

Далее пройдитесь по файлу modules/services/webserver-cluster/main.tf и подставьте var.cluster_name прописанных вручную имен (скажем, "terraform-asgexample"). Например, вот как это сделать в группе безопасности ALB:

resource "aws_security_group" "alb" {

  name = "${var.cluster_name}-alb"

  ingress {

    from_port   = 80

    to_port     = 80

    protocol    = "tcp"

    cidr_blocks = ["0.0.0.0/0"]

  }

  egress {

    from_port   = 0

    to_port     = 0

    protocol    = "-1"