Рубрики
Uncategorized

Начало работы с Terraform на Azure: Советы и приемы

Содержимое модули модули управления удаленным состоянием, сохраняющие конструкции простых и повторно используемых … с меткой Azure, DevOps, Terraform.

  • Модули
  • Отдаленное состояние
  • Управления источником
  • Сохранение дизайнов простым и многоразовым
  • Вывод

Развитие инфраструктуры сложна, и может быть много обручей, через которые можно прыгнуть. Внесение изменений в код живой инфраструктуры всегда включает в себя некоторый риск и может чувствовать себя как игра в Дженгу. В то время как Terraform является относительно новым (первоначальный выпуск в 2014 году), в сообществе Terraform известно о нескольких проверенных практиках, которые помогают справиться с некоторыми препятствиями и сложностями. Понимание испытаний и ошибок тех, кто использовал терраформ на раннем этапе, позволяет нам учиться у них и быть более эффективными, когда мы только начинаем. Эти знания увеличивают вероятность успеха в реализации и использовании Terraform.

В этом руководстве мы рассмотрим некоторые практические советы и хитрости, которые будут помнить при развитии с Terraform. Хотя это проверенные общественные практики, имейте в виду, что есть несколько способов сделать что -то, и это не обязательно означает, что это лучший и наиболее эффективный способ для вас.

Модули

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

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

Поставщики версий и модули

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

provider "azurerm" {
  version = "1.38.0"
}

Кроме того, версия ваших модулей, особенно те из реестра терраформ. Если вы разрабатываете частные модули, верните их. Модули управления версиями позволяют вводить изменения модуля, не влияя на инфраструктуру, которая в настоящее время их использует. Например, допустим, что моя текущая среда использует версию 1.1 моего сервера модуля, которая хранится в репо и помечена V1.1:

#Create Server
module "server" {
  source    = "git::https://allanore@dev.azure.com/allanore/terraform-azure-server/_git/terraform-azure-server?ref=v1.1"

  servername    = "myserver123"
  rgname    = azurerm_resource_group.rg.name
  location  = azurerm_resource_group.rg.location
}

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

#Create Server
module "server" {
  source    = "git::https://allanore@dev.azure.com/allanore/terraform-azure-server/_git/terraform-azure-server?ref=v1.2"

  servername    = "myserver211"
  rgname    = azurerm_resource_group.rg.name
  location  = azurerm_resource_group.rg.location
  private_link = true
}

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

Используйте инъекции зависимости

При повторном использовании модулей в разных средах некоторые среды могут содержать необходимые компоненты, которые уже существуют. Например, если я напишу модуль, который требует учетной записи хранилища для службы, которую он развертывает, могут быть некоторые среды, где эта учетная запись хранения уже существует. Этот сценарий может привести к тому, что некоторые люди попытаются записать логику в свой код, чтобы проверить, существует ли ресурс или нет, и выполнить действия X, если это так. Внедрение такой сложной логики не соответствует декларативной методологии, которую использует Terraform. Ресурс либо существует, либо нет.

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

# Subnet is directly managed in the Terraform configuration

resource "azurerm_subnet" "snet" {
  name                 = "snet-cloudapp-1"
  resource_group_name  = azurerm_resource_group.rg.name
  virtual_network_name = azurerm_virtual_network.vnet.name
  address_prefix       = "10.0.2.0/24"
}

module "nsg" {
  source                = "./modules/nsg"
  resource_group_name   = azurerm_resource_group.rg.name
  nsg_name              = "nsg-${var.system}-httpsallow"
  source_address_prefix = ["VirtualNetwork"]
  predefined_rules = [
    {
      name     = "HTTPS"
      priority = "500"
    },
    {
      name     = "RDP"
      priority = "501"
    }
  ]

  subnet_id = azurerm_subnet.snet.id

В качестве альтернативы, у нас есть другая среда, в которой уже существует подсеть. Мы бы использовали azurerm_subnet Источник данных, чтобы собрать информацию идентификатора подсети и передать ее в наш модуль, используя data.arurerm_subnet.snet.id :

#Subnet already exists and is called with a data source block

data "azurerm_subnet" "snet" {
  name                 = "snet-coudapp-1"
  virtual_network_name = "production"
  resource_group_name  = "rg-networking"
}

module "nsg" {
  source                = "../../modules/nsg"
  resource_group_name   = azurerm_resource_group.rg.name
  nsg_name              = "nsg-${var.system}-httpsallow"
  source_address_prefix = ["VirtualNetwork"]
  predefined_rules = [
    {
      name     = "HTTPS"
      priority = "500"
    },
    {
      name     = "RDP"
      priority = "501"
    }
  ]

  subnet_id = data.azurerm_subnet.snet.id
}

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

Отдаленное состояние

Попробуйте использовать Удаленное состояние Как можно скорее в вашем развитии Terraform. Это может сэкономить много головных болей позже, особенно когда несколько человек участвуют в развертывании и управлении тем же кодом терраформ.

Использование удаленного состояния позволяет нам обеспечить чувствительные переменные в наших конфигурациях. Файл штата Terraform не зашифрован, поэтому сохранение его на местной рабочей станции может быстро стать проблемой безопасности. Кроме того, не привыкайте хранить файлы состояния Terraform в управлении источником. Это увеличивает вероятность обнародования чувствительных переменных, особенно если репозиторий является публичным. Вместо этого используйте gitignore Файл, чтобы опустить любые файлы tf.state от случайного получения автоматического получения.

Разделите Terraform состояния

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

Кроме того, имейте в виду, что ваш план терраформ становится длиннее и длиннее, если вы не разделите достаточно большую среду на отдельные состояния. Он вводит новый тип риска. Теперь план Terraform может занять больше времени, чтобы прочитать, и становится все труднее читать, так как в результате изменения влияют больше ресурсов. Это также означает, что нежелательные изменения можно легко пропустить. Легче поймать ошибку в нескольких строках кода против 10000 строк.

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

prod
  └ rg
    └ main.tf
    └ variables.tf
    └ output.tf
  └ networking
  └ services
      └ frontend-app
          └ main.tf
          └ variables.tf
          └ output.tf
      └ backend-app
  └ data-storage
      └ sql
      └ redis

В структуре папок выше каждая папка отделяет состояния терраформ. Ресурсная группа имеет свое собственное состояние, ограничивая риск ежедневных изменений, внесенных в ресурсную группу. Такие услуги, как SQL и Redis, также разделены, чтобы снизить риск случайного изменения баз данных при любом изменении. Расщепление окружающей среды, подобные этому, снижает много рисков. Тем не менее, это добавляет много сложности в код инфраструктуры. Теперь мы должны разработать способы передачи информации между каждым штатом и справляться с зависимостями. Terraform в настоящее время не допускает простого способа управлять этим. Но такие инструменты, как Terragrunt Разработано Gruntwork, обращается обработка сложностей с расщеплением государства Terraform.

Управления источником

Terraform и Source Control идут вместе рука об руку. Если вы не сохраняете свой код Terraform в управлении источником, вы упускаете следующие преимущества:

  • Изменить отслеживание : Исторические данные всех изменений инфраструктуры являются чрезвычайно мощными и отличным бонусом для аудиторов или требований соответствия.
  • Откат : Одним из основных преимуществ инфраструктуры как кода является возможность «отката» от предыдущей конфигурации или состояния. Однако, в зависимости от окружающей среды, этот откат может означать восстановление. Хранение конфигурации Terraform в управлении источником облегчает повторное развертывание ранее существовавшего рабочего состояния окружающей среды.
  • Сотрудничество между командами : Большинство инструментов управления источниками, таких как Azure DevOps, GitHub или Bitbucket, обеспечивают форму управления доступом. Этот доступ на основе ролей позволяет отдельным командам управлять кодом инфраструктуры или предоставлять доступ только для чтения для других команд для повышения видимости того, как работает окружающая среда. Больше не догадываться, открыт ли порт брандмауэра или нет; Посмотрите на код и посмотрите, есть ли он.
  • Автоматизация : Существует множество инструментов CI/CD, которые подключаются к управлению источником. Эти инструменты усиливают разработку и развертывание Terraform.

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

Структура репо для потребностей бизнеса

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

Этот короткий ответ, это зависит от вашей среды. Большие среды будут иметь совершенно другую настройку, чем среды запуска. Кроме того, командная структура входит в значительной степени в игре здесь. У вас есть команда, которая управляет всей инфраструктурой, или это разработчики и инженеры Devops, которые управляют инфраструктурой для своего применения? Вы увидите много экспертов DevOps, и мыслительные лидеры в сообществе говорят о Закон Конвея , в котором говорится, что коммуникационная структура организаций является ограничителем в том, как они разрабатывают и разрабатывают программное обеспечение. Эта концепция довольно очевидна при внедрении Terraform в вашу организацию. Проанализируйте, как структурированы ваши команды и структурируют репонирование конфигурации терраформ таким образом, чтобы дополнять эту структуру.

Вот несколько общих стратегий репо:

  • Single Repo: : Весь кодекс инфраструктуры живой инфраструктуры находится в одном хранилище, управляемом руководящей командой.

  • Один репо за проект: Каждое приложение имеет свою собственную папку Terraform, а код хранится в папке исходного кода приложения.

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

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

Держите всю живую инфраструктуру в главном отделении

Все изменения в живой инфраструктуре всегда должны оставаться в главной филиале. Хранение одного и того же кода инфраструктуры в нескольких филиалах может вызвать конфликты и создать головные боли. Например, скажем, член команды отрывается от Master и настраивает конфигурацию Terraform, чтобы изменить размер виртуальной машины. Они вносят свои изменения и развертывают его, но не объединяют свою ветвь обратно в Мастер, потому что они все еще вносят изменения. Через несколько минут кто -то другой изменяет те же теги виртуальной машины, но создает другую ветвь от мастера, которая еще не обновлялась с новым размером виртуальной машины. Изменение тегов развернуто, и теперь размер виртуальной машины возвращается к своему первоначальному размеру, потому что он не содержит кода изменения размера виртуальной машины. Вот почему важно убедиться, что главная ветвь всегда является живым представлением окружающей среды.

Выполнить код Terraform через трубопровод

Впервые начиная с Terraform, типично, что каждый разработчик инфраструктуры управляет инфраструктурой, подлинной локально на своей машине с поставщиком Azure (либо с AZ CLI, либо с некоторыми переменными окружающей среды). Они выполняют код Terraform с местной установкой Terraform. В долгосрочной перспективе это может вызвать несколько головных болей, таких как непоследовательные версии терраформ среди разработчиков. Лучше всего перейти на развертывание кода с помощью конвейера, сохраняя конфигурации Terraform в управлении источником и запустив процесс непрерывной интеграции, который выполняет код Terraform по запросам на притяжение. Трубопровод значительно увеличивает возможности автоматизации и имеет несколько преимуществ:

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

Сохранение дизайнов простым и многоразовым

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

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

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

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

Используйте предварительно экономно

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

Вместо этого воспользуйтесь преимуществами индивидуального расширения сценария Azure для виртуальных машин в Передайте сценарий в виртуальную машину без каких -либо сетевых ограничений.

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

Используйте график Terraform для устранения проблем зависимости

Во время разработки Terraform вы можете столкнуться с ошибками сроков ресурсов, когда ресурс развернут, но полагается на другой ресурс, который еще не завершил подготовку. Возможно, диск или положения учетной записи хранилища слишком быстрой половина времени или подсеть не развернута перед сетевым интерфейсом. Как правило, это связано с проблемой зависимости в конфигурации и обычно решается с использованием интерполяции между правильными ресурсами или с использованием «зависит от» блока. Тем не менее, это может быть трудно отследить. С Terraform Graph , вы можете запустить эту команду против каталога конфигурации, и она будет создавать выход точечного формата. Затем вы можете скопировать и вставить вывод на веб -сайт, такой как WebGraphviz Чтобы создать визуальное представление зависимостей конфигурации, чтобы помочь устранению неполадок.

Используйте реестр Terraform

Особенно, когда впервые начинать, не пытайтесь заново изобрести колесо. Состояние отчета DevOps Показывает, что высокоэффективные команды повторно используют код других людей. Есть много модулей Azure, уже созданных на Реестр Terraform Анкет Если вам нужно развернуть конкретную службу Azure, потратьте время на поиск в реестре и посмотрите, был ли уже создан модуль для службы, которая вам нужна. Если модули, которые находятся в реестре терраформ, не отвечают вашим потребностям, вы можете расколоть эти модули и настроить их на свои собственные.

Вывод

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

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

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

Оригинал: «https://dev.to/cloudskills/getting-started-with-terraform-on-azure-tips-and-tricks-4afo»