Рубрики
Uncategorized

Начало работы с Terraform на Azure: модули

Соблюдение. Предварительные условия Шаг 1 — Архитектура модуля Шаг 2 — Создание модулей st … с меткой Azure, Terraform, DevOps.

  • Предварительные условия
  • Шаг 1 — Архитектура модуля
  • Шаг 2 — Создание модулей
  • Шаг 3 — Выходы модуля
  • Шаг 4 — Модули GIT
  • Вывод

При создании конфигураций Terraform Production модули являются абсолютными обязательными. Одним из наиболее очевидных преимуществ их использования является то, что они позволяют нашему коду быть сухим. Dry — это термин разработки программного обеспечения, который означает, не повторяйте себя. Идея состоит в том, чтобы уменьшить количество повторения в нашем коде. В Terraform мы можем создавать модули для создания повторных компонентов нашей инфраструктуры. Например, мы можем иметь модуль для серверов SQL и отдельный для виртуальных машин. Затем мы можем повторно использовать каждый модуль для развертывания услуг и создать инфраструктуру для различных сред.

Модули также должны использоваться как способ разделить большую среду на более мелкие компоненты. Мы не хотим иметь единый файл main.tf с более чем 1000 строк кода. Разделение нашего кода на более мелкие модули позволяет нам безопасно вносить изменения в нашу среду, не влияя на большие куски кода. Кроме того, разделяя нашу окружающую среду на модули, у нас теперь есть части нашей инфраструктуры, разделенных на тестируемый модуль. Возможность использования методов тестирования программного обеспечения для проверки нашего кода Terraform является огромным преимуществом инфраструктуры, в первую очередь, определенной в коде.

Наконец, модули также предоставляют пользователям Terraform поделиться своими конфигурациями либо в частном порядке, так и в сообществе Terraform. В 2019 году HCL был 3-й самый быстрорастущий язык программирования на GitHub , что подтверждает ускоренное принятие стека продуктов Hashicorp.

В этом руководстве мы собираемся создать модуль и научиться интегрировать его в наши конфигурации Terraform.

Предварительные условия

Прежде чем начать, вам нужно настроить следующее:

Шаг 1 — Архитектура модуля

В реальной среде Terraform мы не хотели бы воссоздавать тот же код снова и снова для развертывания инфраструктуры. Это создало бы большое количество избыточности в нашем кодерароформе. Вместо этого мы хотели бы разбить наши конфигурации Terraform на модули; Как правило, лучшая практика — это модуль для каждого компонента. Например, мы могли бы создать модуль для баз данных SQL, которые содержат все наши конфигурации для развертывания SQL с нашими потребностями. Затем мы могли бы повторно использовать этот модуль всякий раз, когда нужна база данных SQL, и вызвать его в наших конфигурациях Terraform.

Приведенная ниже диаграмма демонстрирует стратегию разделения различных услуг Azure на компонентные модули. Создавая четыре модуля для каждой услуги в этой среде, мы также можем повторно использовать один и тот же код как в Dev, так и в Prod. Эта практика обеспечивает точное сравнение инфраструктуры между каждой средой на каждом этапе развития. Мы больше не копируем и не вставляем наш код из разработчика в QA в Prod. Вместо этого мы параметризуем наши модули, чтобы мы могли немного настраивать для каждой среды, такие как имена ресурсов и сетевые подсеты:

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

Шаг 2 — Создание модулей

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

terraformdemo
    └──modules 
            └──storage-account
                    └── main.tf
                    └── variables.tf

Скопируйте код для main.tf и переменные.tf конфигурации и создайте каждый файл. Мы разместим каждый файл в соответствии со структурой каталога выше.

переменные.tf Файл содержит наши входные переменные. Входные переменные — это параметры, которые наш модуль принимает для настройки его развертывания. Для нашего модуля учетной записи хранилища мы делаем его как можно проще для примера, получив входные данные для имени учетной записи, местоположения и ресурсов:

variables.tf

variable "saname" {
    type = string
    description = "Name of storage account"
}
variable "rgname" {
    type = string
    description = "Name of resource group"
}
variable "location" {
    type = string
    description = "Azure location of storage account environment"
    default = "westus2"
}

main.tf Файл содержит код для создания учетной записи хранения. В примере у нас есть лишь небольшой набор аргументов для нашей учетной записи, чтобы сделать вещи простыми. Тем не менее, в реальной производственной среде мы, возможно, хотели бы реализовать сетевые политики, а также варианты регистрации. Затем мы могли бы использовать наш модуль для определения «стандартов» для того, как мы хотим, чтобы все наши учетные записи хранилища были настроены:

main.tf

resource "azurerm_storage_account" "sa" {
  name                     = var.saname
  resource_group_name      = var.rgname
  location                 = var.location
  account_tier             = "Standard"
  account_replication_type = "GRS"

}

Далее мы создадим еще один main.tf Файл в корне нашего Terraformdemo Папка, которая будет ссылаться на наш вновь созданный каталог модулей учетной записи:

terraformdemo
    └── main.tf
    └──modules 
            └──storage-account
                    └── main.tf
                    └── variables.tf

В корне main.tf , мы называем наш модуль, используя модуль Блок с последующим параметром строки. Внутри блока нам нужно ссылаться на модуль, который мы используем, объявив источник аргумент В этом примере мы просто ссылаемся на модуль в нашем модули подпапка, так что путь ./modules/Storage-Account . Нам также необходимо включить любые необходимые входы переменных для нашего модуля учетной записи хранения. Это те же переменные, которые мы создали в переменные.tf Файл в нашем каталоге модулей учетной записи хранилища:

Примечание: Имя учетной записи хранилища должно быть уникальным и не более 24 символов в длину, или вы можете столкнуться с сбоями во время развертывания.

main.tf

provider "azurerm" {
  version = "1.38.0"
}

#create resource group
resource "azurerm_resource_group" "rg" {
    name     = "rg-MyFirstTerraform"
    location = "westus"
}

#Create Storage Account
module "storage_account" {
  source    = "./modules/storage-account"

  saname    = "statfdemosa234"
  rgname    = azurerm_resource_group.rg.name
  location  = azurerm_resource_group.rg.location
}

В нашем main.tf Файл, мы также включаем Азурмер Блок поставщика. Лучше всего указать поставщика в файле корневого модуля; Таким образом, все называемые модули будут тогда унаследовать этого поставщика. При создании модулей старайтесь не включать поставщика в сам модуль как можно больше. Это может привести к дальнейшей сложности и сделать модули хрупкими. Когда мы запускаем наш Terraform Init в Terraformdemo каталог Мы видим, что модуль инициализируется:

Initializing modules...
- storage_account in modules/storage-account

Initializing the backend...

Initializing provider plugins...
- Checking for available provider plugins...
- Downloading plugin for provider "azurerm" (hashicorp/azurerm) 1.38.0...

Когда мы бежим терраформ применить , он будет ссылаться на хранилище-складывание Модуль для создания нашей учетной записи хранилища с настройками, которые мы объявили при входе модуля. Кроме того, мы можем использовать один и тот же модуль несколько раз в конфигурации с другой строкой параметров:

provider "azurerm" {
  version = "1.38.0"
}

#create resource group
resource "azurerm_resource_group" "rg" {
    name     = "rg-MyFirstTerraform"
    location = "westus"
}

#Create Storage Account
module "storage_account" {
  source    = "./modules/storage-account"

  saname    = "statfdemosa234"
  rgname    = azurerm_resource_group.rg.name
  location  = azurerm_resource_group.rg.location
}

#Create Storage Account
module "storage_account2" {
  source    = "./modules/storage-account"

  saname    = "statfdemosa241"
  rgname    = azurerm_resource_group.rg.name
  location  = azurerm_resource_group.rg.location
}

Мы только что создали наш первый модуль. Этот модуль является простым, однако, для более сложных сценариев, таких как развертывание виртуальной машины с зашифрованными дисками, модуль может быть идеальным для абстрагирования всей сложности с несколькими входами.

Шаг 3 — Выходы модуля

Переменные входы — не единственная важная часть модуля. Выходы также так же важны. Они позволяют нам передавать информацию в модули и обратно, чтобы они могли строить друг друга. Создание вывода для модуля — это тот же процесс, что и при регулярной конфигурации терраформ. Создать output.tf файл и используйте вывод блокировать, чтобы объявить наши выходные значения. Ниже мы создаем выходной блок для первичного ключа доступа к нашей учетной записи, чтобы сохранить его в хранилище ключа Azure после его создания:

output "primary_key" {
    description = "The primary access key for the storage account"
    value = azurerm_storage_account.sa.primary_access_key
    sensitive   = true
}

Также обратите внимание, мы используем чувствительный аргумент, чтобы указать, что Promaning_access_key Вывод для нашей учетной записи хранилища содержит конфиденциальные данные. Terraform рассматривает эту информацию как конфиденциальную и скрывает ее от консольного дисплея при запуске терраформ применить Анкет Это не защищает значение из файла состояния терраформ; Это все еще будет в Clourtext, поэтому в реальном сценарии производства мы хотели бы использовать удаленное состояние.

Чтобы использовать выходные значения модуля в другом ресурсе, укажите значения, ссылаясь на его в Модуль. формат:

resource "azurerm_key_vault_secret" "stasecret" {
  name         = "statfdemosa234-secret"
  value        = module.storage_account.primary_key
  key_vault_id = azurerm_key_vault.kv.id

}

Шаг 4 — Модули GIT

Если мы планируем поделиться этим модулем в нескольких средах, его лучшая практика для размещения модуля в хранилище управления источником, мы получаем все преимущества управления источником для нашего модуля, например, отслеживания изменений. Кроме того, мы также получаем версию. Модули с меткой — лучшая практика, потому что она позволяет нам «прикреплять» стабильную рабочую версию нашего модуля в конфигурацию Terraform. Это предотвращает любые нарушающие изменения от влияния конфигураций, которые уже находятся в производстве.

Чтобы использовать модуль Terraform из репозитория GIT, измените источник Аргумент в GIT URL. В нашем примере я загрузил наш модуль учетной записи хранения в репо Azure DevOps. Это публичная репозиция GIT, и она не потребует какой -либо конфигурации аутентификации. Мы можем использовать URL -адрес HTTPS и префикс его с git:: :

#Create Storage Account
module "storage_account" {
  source    = "git::https://allanore@dev.azure.com/allanore/TerraformModulesExample/_git/TerraformModulesExample?ref=v0.1"

  saname    = "tfdemosa23432"
  rgname    = azurerm_resource_group.rg.name
  location  = azurerm_resource_group.rg.location
}

Если мы запустим Terraform Init На выходе консоли мы видим, что модуль загружается из GIT Repo и сохраняется в .terraform/Modules местный каталог:

...
Please install a compatible extension version or remove it.
Initializing modules...
Downloading git::https://allanore@dev.azure.com/allanore/TerraformModulesExample/_git/TerraformModulesExample?ref=v0.1 for storage_account...
- storage_account in .terraform/modules/storage_account
Downloading git::https://allanore@dev.azure.com/allanore/TerraformModulesExample/_git/TerraformModulesExample?ref=v0.1 for storage_account2...
- storage_account2 in .terraform/modules/storage_account2

Initializing the backend...
...

Кроме того, если бы мы хотели использовать частное репо Azure с SSH, мы могли бы ссылаться на наш модуль в Источник Аргумент через SSH URL, как ниже. Нам также нужно было бы генерировать и установите сертификат SSH для аутентификации:

git::git@ssh.dev.azure.com:v3/allanore/TerraformModulesExample/TerraformModulesExample?ref=v0.1

Для использования источника модуля Terraform из репо, используйте URL -адрес для проекта GitHub. В приведенном ниже примере я загрузил наш модуль в github Repo:

#Create Storage Account
module "storage_account" {
  source    = "github.com/allanore/TerraformModulesExample"

  saname    = "tfdemosa23432"
  rgname    = azurerm_resource_group.rg.name
  location  = azurerm_resource_group.rg.location
}

Рекомендуемая структура папок для репо модуля Terraform выглядит следующим образом. У нас есть файлы конфигурации корневого модуля в корне нашего каталога репозитория, который в этом примере является хранилище-складывание Анкет У нас также есть readme.md в корневой папке. Это файл разметки, который содержит информацию о нашем модуле. Рекомендуется иметь файлы readme.md для каждой конфигурации Terraform, чтобы описать, что это такое и как она используется. Далее у нас есть наш модули Папка, которая содержит любые подмодулы, которые потребуются для выполнения дополнительных задач, например, настройки частной ссылки или настройки статического веб-сайта. У нас также есть наш Примеры каталог, который должен содержать примеры каждого возможного сценария нашего модуля. Наконец, у нас есть наш тест Папка, которая включает в себя тестовые файлы, записанные в Golang, для проверки нашего модуля, используя примеры из примера папки; Мы будем больше войти в тестирование модулей в более поздней статье в этой серии:

storage-account
    └── README.md
    └── main.tf
    └── variables.tf
    └── outputs.tf
    ├───modules 
    │     ├──private-link
    │     │       └── README.md
    │     │       └── main.tf
    │     │       └── outputs.tf
    │     │       └── variables.tf
    │     └──static-website
    │             └── README.md
    │             └── main.tf
    │             └── outputs.tf
    │             └── variables.tf 
    ├───examples
    │     ├───public
    │     │       └── README.md
    │     │       └── main.tf
    │     │       └── outputs.tf
    │     │       └── variables.tf
    │     ├──private-link
    │     │       └── README.md
    │     │       └── main.tf
    │     │       └── outputs.tf
    │     │       └── variables.tf 
    │     └──static-website
    │             └── README.md
    │             └── main.tf
    │             └── outputs.tf
    │             └── variables.tf
    └───test
         └── sa_public_test.go
         └── sa_private_test.go
         └── sa_static_website_test.go

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

Шаг 5 — реестр терраформ

Создание модуля может занять много времени; Тем не менее, есть тысячи модулей, разделяемых сообществом, которыми вы можете воспользоваться, используя их в качестве базы или просто используя их самостоятельно. Реестр Terraform является централизованным местом для модулей Terraform, созданных сообществом. Хорошей идеей будет проверить реестр Terraform, прежде чем создавать свой собственный модуль, чтобы сэкономить время. Это также отличный инструмент обучения, так как вы также можете просмотреть проект на GitHub и посмотреть, как выполняется модуль, и логику используется за ним.

Реестр Terraform также может быть частным и использовать через Terraform Cloud. Модули, которые находятся в общественном реестре терраформ, могут быть использованы, ссылаясь на них в // формат. В приведенном ниже примере мы используем Модуль для развертывания функций Azure Из реестра терраформ:

resource "azurerm_resource_group" "rg" {
  name     = "rg-MyFirstTerraform"
  location = "westus"
}

module "function-app" {
  source  = "InnovationNorway/function-app/azurerm"
  version = "0.1.2"

  function_app_name = "func-terrademo"
  resource_group_name = azurerm_resource_group.rg.name
  location = azurerm_resource_group.rg.location
}


Когда мы бежим Terraform Init , модуль автоматически загружается и используется во время терраформ применить Анкет

Вывод

В этой статье мы узнали о модулях и о том, как мы можем использовать их для абстрагирования наших конфигураций Terraform. Мы рассказали, как создать модуль и как ссылаться на вывод модуля. Мы также посмотрели, как хранить наши модули в репозитории GIT, таких как GitHub и Azure Repos. Наконец, мы узнали о реестре Terraform и об общественных модулях, хранящихся там.

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

Оригинал: «https://dev.to/cloudskills/getting-started-with-terraform-on-azure-modules-1haj»