Рубрики
Uncategorized

Создание вашего первого модуля с использованием террафора

Развертывание инфраструктуры вручную является устаревшей практикой. Использование Terraporm для автоматизации руководства … Теги с DevOps.

Развертывание инфраструктуры вручную является устаревшей практикой. Использование террафора для автоматизации ручного развертывания является новая нормальная. В этом блоге мы подробно объяснили, как создать свой первый модуль с использованием террафора.

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

Введение в инфраструктуру как код (IAC)

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

вступление к террафом и как он вписывается в пространство IAC

Terraform — это инструмент с открытым исходным кодом, написанным на языке Go, созданный hashicorp и используется для обеспечения или управления инфраструктурой в качестве кода. Он поддерживает несколько поставщиков, таких как AWS, Google Cloud, Azure, OpenStack и т. Д. Чтобы узнать об полном списке поставщиков, проверьте эту ссылку: https://www.terraform.io/docs/language/providers/index.html

Теперь, когда у вас есть краткое представление о террафоре, давайте понять, как Terraform вписывается в пространство IAC и о том, как он отличается от других инструментов (шеф-повар, кукол, асфальтируемых, облачность) в его пространстве. Некоторые из ключевых различий:

  • Anisible, шеф-повар и марионетки являются инструментами управления конфигурацией (используются для нажимания/тяги изменения конфигурации), тогда как Terraporm используется для обеспечения инфраструктуры. И наоборот, вы можете использовать управление конфигурацией для создания инфраструктуры и террафора для запуска скриптов конфигурации, но это не идеально. Лучший подход состоит в том, чтобы использовать их в сочетании, например, террафом, чтобы построить инфраструктуру, а затем запустить куколку на недавно построенной инфраструктуре, чтобы настроить ее.

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

  • Другое различие является с открытым исходным кодом против хранилища; Terraform — это инструмент с открытым исходным кодом и работает практически с всеми важными поставщиками, как мы обсуждали выше, тогда как инструменты, такие как облака, специфичны для AWS и являются собственностью.

Установка террафора

Установка террафора довольно проста, так как он поставляется с одним двоичным двоичным, и вам нужно выбрать двоичный в зависимости от вашей платформы, используя эту ссылку: https://www.terraform.io/downloads.html.

  • Скачать двоичный (в случае Mac)
wget https://releases.hashicorp.com/terraform/1.0.6/terraform_1.0.6_darwin_amd64.zip
  • Расстегнуть пакет
unzip terraform_1.0.6_darwin_amd64.zip
  • Скопируйте двоичный путь на ваш путь к операционной системе
echo $PATH

/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

sudo cp terraform /opt/homebrew/bin
  • Выход из системы и логин с терминала и проверить установку террафора
terraform version
Terraform v1.0.6

Как работает террафом

Terraform работает, сделав вызов API от вашего имени провайдеру (AWS, GCP, Azure и т. Д.) Вы определены. Теперь, чтобы сделать вызов API, сначала необходимо быть аутентифицированным, и это делается с помощью ключей API (AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESCE_KEY). Чтобы создать пользователя IAM и его соответствующие ключи, пожалуйста, проверьте этот документ: https://docs.aws.amazon.com/iam/latest/userguide/getting-started_create-admin-group.html.

Теперь, насколько пользователи разрешений будут определены с помощью политики IAM. Чтобы приложить существующую политику пользователю, проверьте этот документ: https://docs.aws.amazon.com/iam/latest/userguide/access_Polyies_manage-attach-detach.html#add-policies-console.

Теперь, чтобы использовать эти ключи, вы можете экспортировать их в качестве переменных среды

$ export AWS_ACCESS_KEY_ID="abcxxx"
$ export AWS_SECRET_ACCESS_KEY="xyzasdd"

Есть и другие способы настроить эти учетные данные; Проверьте этот документ для получения дополнительной информации: https://registry.terraform.io/providers/hashicorp/aws/latest/docs#authentication

Теперь следующий вопрос, как Terraform знает, какой API позвонить? Это то, где вам нужно определить код в файле конфигурации Terraform (заканчивается, как правило, с помощью .tf). Эти файлы конфигурации являются кодом в инфраструктуре в качестве кода (IAC).

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

Каждый раз, когда вы запускаете Terraporm, он записывает информацию о вашей инфраструктуре в файле штата Terraform (Terraform.tfstate). Этот файл хранит информацию в формате JSON и содержит отображение ресурса вашего террафора в вашем файле конфигурации против реального мира в облаке AWS. Теперь, когда вы запускаете команду Terraform, она выбирает последний статус ресурса, сравнивает его с файлом TFState и определяет, какие изменения необходимо применять. Если Terraform видит дрейф, он будет восстанавливать или изменить ресурс.

Примечание: Как видите, этот файл критически важен. Всегда хорошо хранить этот файл в некотором удаленном хранилище, например, S3. Таким образом, член вашей команды должен иметь доступ к одному и тому же файлу состояния. Кроме того, чтобы избежать гоночных условий, то есть две члены команды используют террафом одновременно и обновляют государственный файл, это хорошая идея, чтобы применить блокировку, например, через DynamOdb. Для получения дополнительной информации о том, как это сделать, пожалуйста, проверьте этот документ: https://www.terraform.io/docs/language/settings/backends/s3.html.

Введение в модуль Terraform

Модуль TerraForm — это набор файлов конфигурации террафора (* .tf) в каталоге. Преимущество использования модулей является повторное использование. Вы можете использовать модуль Terraform, доступный в реестре Terraform или поделиться модулем, который вы создали с членами вашей команды.

Написание вашего первого террафора

Со всеми предпосылками на месте (настроить доступ к учетным правам AWS и секретные ключи), пришло время написать первый код террафора. Прежде чем мы начнем писать наш первый код террафора, давайте посмотрим, как мы собираемся организовать файлы:

  • main.tf: Это наш основной файл конфигурации, где мы собираемся определить наше определение ресурса.
  • variables.tf: Это файл, где мы собираемся определить наши переменные.
  • OPTIONS.TF: Этот файл содержит определения вывода для наших ресурсов.

ЗАМЕТКА: Имя файла не имеет никакого особого значения для террафора, если он заканчивается расширением .tf, но это стандартное соглашение об именах, а затем в сообществе Terraform.

Пусть сначала начните с Main.tf

provider "aws" {
  region = "us-west-2"
}

//Figure 1: Terraform provider
  • Это скажет террафору, что мы будем использовать AWS в качестве провайдера, и мы хотим развернуть нашу инфраструктуру в регионе США-Запад-2 (Орегон).
  • У AWS есть центры обработки данных по всему миру, которые сгруппированы в зонах региона и доступности. Регион — это отдельная географическая область (Орегон, Вирджиния, Сидней), и каждый регион имеет несколько изолированных центров обработки данных (США-запад-2А, США-Запад-2В ..). Для получения дополнительной информации о зонах регионов и доступности, пожалуйста, обратитесь к этому документу: https://docs.aws.amazon.com/awsec2/latest/userguide/using-Regions-vailability-zones.html.
  • Следующим шагом является определение ресурса, который мы хотим создавать, и в этом примере мы построим экземпляр EC2. Общий синтаксис создания ресурса в террафоре выглядит так:
resource "" "NAME" { 
  [CONFIG...] 
}

//Figure 2: Terraform resource general syntax
  • Провайдер Название провайдера, «AWS» в этом случае
  • Тип Тип ресурса, который мы хотим создавать, например, экземпляр
  • Имя название идентификатора, которое мы собираемся использовать по всему нашему террафорукому коду для обозначения
  • Config это аргумент, который специфичен для конкретного ресурса

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

provider "aws" {
  region = "us-west-2" 
} 

resource "aws_instance" "ec2-instance" {
  ami = "ami-0c2d06d50ce30b442"
  instance_type = "t2.micro"
  vpc_security_group_ids = "aws_security_group.mysg.id"
} 

resource "aws_security_group" "mysg" { 
  name = "allow-ssh"
  description = "Allow ssh traffic"
  vpc_id = "vpc-07142bf09e3b0cf4b"
  ingress {
    description = "Allow inbound ssh traffic"
    from_port = 22 
    to_port = 22 
    protocol = "tcp"
    cidr_blocks = "[0.0.0.0/0]" 
  } 
  tags = { 
    name = "allow_ssh" 
  } 
}

//Figure 3: First terraform code to create an ec2 instance
  • Здесь мы используем aws_instance Ресурс для создания экземпляра EC2. EC2-экземпляр Название идентификатора мы будем использовать в остальной части кода. Для получения дополнительной информации о aws_instance Ресурс, пожалуйста, проверьте эту ссылку: https://registry.terrasom.io/providers/hashicorp/aws/latest/docs/resources/instance.
  • AMI: AMI означает изображение Amazon Machine и используется для запуска экземпляра EC2. В этом случае мы используем Amazon Linux ami, но не стесняйтесь использовать AMI на основе вашего требования. Для получения дополнительной информации о AMI, пожалуйста, проверьте эту ссылку: https://docs.aws.amazon.com/awsec2/latest/userguide/amis.html.
  • Induction_type: AWS предоставляет различные типы экземпляров на основе требований нагрузки. Например, экземпляр T2.Micro обеспечивает 1 ГБ памяти и 1 виртуальный процессор CPU. Для получения дополнительной информации о типе экземпляра, пожалуйста, проверьте эту ссылку: https://aws.amazon.com/ec2/instance-types/
  • Vpc_security_group_ids: Здесь мы используем интерполяцию, чтобы обратиться к группе безопасности. Здесь мы получаем идентификатор группы безопасности, ссылаясь на aws_security_group Ресурс и использование идентификатора.
aws_security_group.mysg.id

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

  • Имя: Это название группы безопасности. Если вы опускаете его, Terraform присваивает некоторое случайное уникальное имя.
  • Описание: Это описание группы безопасности. Если вы не назначаете никакого значения, то значение по умолчанию «Управляется Terraporm».
  • Vpc_id: Это виртуальный идентификатор частного облака вашей учетной записи AWS, где вы хотите создать эту группу безопасности.
  • Вход: В этом блоке вы определите, какой порт вы хотите разрешить входящие соединения.
  • From_port: Это начальный диапазон для порта
  • To_port: Это конечный диапазон порта
  • Протокол: Протокол для диапазона портов
  • Cidr_block: Список блоков CIDR откуда вы хотите разрешить трафик
  • Теги: Назначение тегов на ресурс. Теги — отличный способ определить ресурсы.

Как вы можете видеть в вышеуказанном коде, мы жесткодируем значение ami ID, тип экземпляра, порта и VPC ID. Позже, если нам нужно изменить эти значения, мы должны изменять наш основной файл конфигурации Main.tf. Намного лучше сохранить эти значения в отдельном файле, и это то, что мы собираемся сделать на следующем шаге, сохраняя все эти переменные и их определение в отдельном файле, переменных .ttf. Синтаксис переменных террафора выглядит так:

variable "NAME" { 
  [CONFIG...] 
}

Поэтому, если вам нужно определить переменную для AMI ID, это выглядит так:

variable "ami_id" { 
  default = "ami-0c2d06d50ce30b442" 
}

//Figure 4: Terraform variable definition
  • Имя: это имя переменной, и это может быть любое имя
  • По умолчанию: Существует несколько способов проходить значение для переменной, например, через переменную среды, используя опцию. Если значение не указано, то он будет использовать значение по умолчанию.

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

variable "ami_id" {
  default = "ami-0c2d06d50ce30b442" 
} 

variable "instance_type" { 
  default = "t2.micro" 
}

variable "vpc_id" {
  default = "vpc-bc102dc4" 
}

variable "port" { 
  default = 22 
} 

variable "cidr_block" {
  default = "0.0.0.0/0" 
}

//Figure 5: Modified variable definition file

Чтобы ссылаться на эти значения в Main.tf, нам просто нужно добавить var Перед переменной.

ami = "var.ami_id"

Окончательный файл Main.tf будет выглядеть так:

provider "aws" {
  region = "us-west-2" 
}

resource "aws_instance" "ec2-instance" {
  ami = "var.ami_id"
  instance_type = "var.instance_type"
  vpc_security_group_ids = "[aws_security_group.mysg.id]"
} 

resource "aws_security_group" "mysg" {
  name = "allow-ssh"
  description = "Allow ssh traffic"
  vpc_id = "var.vpc_id"
  ingress {
    description = "Allow inbound ssh traffic"
    from_port = var.port
    to_port = var.port
    protocol = "tcp"
    cidr_blocks = "[var.cidr_block]"
  } 
  tags = { 
    name = "allow_ssh" 
  } 
}

//Figure 6: Modified ec2 instance creation file with variable reference

Последний файл, который мы собираемся проверить, является выходом. TF, синтаксис которого будет выглядеть так:

Output "" { 
  value =  
}

Где название выходной переменной и может быть любое выражение террафора, которое мы хотели бы быть выходом.

Теперь вопрос в том, что нам это нужно? Посмотрите с помощью простого примера; Когда мы создаем этот экземпляр EC2, мы не хотим возвращаться в консоль AWS, чтобы захватить свой публичный IP; В этом случае мы можем предоставить IP-адрес в выходную переменную.

output "instance_id" {
  value = "aws_instance.ec2-instance.public_ip" 
}

//Figure 7: Output definition for instance id

В примере мы ссылаемся на aws_instance Ресурс, EC2-экземпляр идентификатор и атрибут. Чтобы получить больше информации о экспортированных атрибутах, пожалуйста, проверьте эту ссылку: https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance#public_ip.

Аналогично получить идентификатор группы безопасности:

output "security_group" {
  value = "aws_security_group.mysg.id" 
}

//Figure 8: Output definition for security group

Теперь наш код террафора готов, первая команда, которую мы собираемся выполнить является

  • Terraform Init: Это собирается скачать код для провайдера (AWS), который мы будем использовать.
  • Terraporm FMT: Эта команда не является обязательной, но рекомендуется. Это переписывает файлы конфигурации террафора в каноническом формате.
  • План террафора: Эта команда скажет, что делает террафом, прежде чем делать какие-либо изменения.

    • (+ знак): Ресурс будет создан
    • (- подписать): Ресурс будет удален
    • (~ знак): Ресурс будет изменен
  • Террафом применяется: Чтобы применить изменения, запустите команду Terraform Apply.

Terraform — это код чтения и переводит его на вызовы API для провайдеров (AWS в этом случае). Перейти к консоли AWS https://us-west-2.console.aws.amazon.com/ec2/ И вы увидите, что ваш экземпляр должен быть на этапе создания.

ЗАМЕТКА: Если вы выполняете эти команды в тестовой среде и хотите сохранить стоимость, запустите команду «Уничтожить Terraform», чтобы очистить инфраструктуру.

Преобразование террафора кода в модуль с помощью AWS EC2

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

module "" 
source = "" 
[CONFIG…] 
}
  • ИМЯ: Название идентификатора, которое вы можете использовать на протяжении всего вашего террафора, чтобы обратиться к этому модулю.
  • ИСТОЧНИК: Это путь, в котором можно найти код модуля
  • Config: Он состоит из одного или нескольких аргументов, которые специфичны для этого модуля.

Давайте понять это с помощью примера. Создать каталог EC2-экземпляр и переместите все файлы * .tf (main.tf, variables.tf и adds.tf) внутри него.

mkdir ec2-instance
mv *.tf ec2-instance

Теперь в главном каталоге создайте файл main.tf, поэтому структура вашего каталога будет выглядеть так:

touch main.tf

ls -ltr drwxr-xr-x 5 plakhera staff 160 Sep 12 18:55 ec2-instance -rw-r--r-- 1 plakhera staff 0 Sep 12 18:57 main.tf

Наш файл кода модуля будет выглядеть так:

provider "aws" {
  region = "us-west-2" 
} 

module "ec2-instance" {
  source = "./ec2-instance"
  ami_id = "ami-0c2d06d50ce30b442"
  instance_type = "t2.micro"
  vpc_id = "vpc-bc102dc4"
  port = "22"
  cidr_block = "0.0.0.0/0" 
}

//Figure 10: Terraform Module for EC2 instance
  • EC2-экземпляр это имя модуля, и в качестве источника его ссылка на каталог, который мы создали ранее (где мы переместили все файлы * .tf)
  • Затем мы ссылаемся на все значения переменных, которые мы определили внутри переменных .ttf. Это преимущество использования модулей, как сейчас нам не нужно войти в переменные .TF, чтобы изменить значение, и у нас есть одно место, где мы можем обратиться и изменять его.

variables.tf После изменения будут выглядеть так:

variable "ami_id" { 
} 

variable "instance_type" { 
}

variable "vpc_id" { 
}

variable "port" { 
}

variable "cidr_block" { 
}

//Figure 11: Modified variable definition file for module definition

Как версию свои модули и как он помогает в создании отдельной среды (производство против постановки)

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

source = "github.com/abc/modules//ec2-instance"

Если вы снова проверите предыдущий пример, мы используем тип экземпляра как T2.Micro , который хорош для испытаний или в средах развития, но может не подходить для производственных сред. Чтобы преодолеть эту проблему, что вы можете сделать, это пометить свой модуль. Например, все нечетные теги предназначены для среды разработки, и все даже теги предназначены для производственной среды.

Для разработки:

$ git tag -a "v0.0.1" -m "Creating ec2-instance module for development environment"

$ git push --follow-tags

Для производства:

$ git tag -a "v0.0.2" -m "Creating ec2-instance module for production environment"

$ git push --follow-tags

Вот как ваш модуль будет выглядеть для производственной среды с изменениями, сделанными под источником и induction_type Отказ

module "ec2-instance" {
  source = "github.com/abc/modules/ec2-instance"
  ami_id = "ami-0c2d06d50ce30b442"
  instance_type = "c4.4xlarge"
  vpc_id = "vpc-bc102dc4"
  port = "22"
  cidr_block = "0.0.0.0/0" 
}

//Figure 12: Module definition for production environment

Реестр Terraform

На предыдущем шаге мы создали наш собственный модуль. Если кто-то в компании должен создать экземпляр EC2, они не должны писать тот же террафом с нуля. Разработка программного обеспечения поощряет практику, где мы можем повторно использовать код. Чтобы повторно использовать код, большинство языков программирования поощряют разработчиков толкать код для централизации реестра. Например, в Python у нас есть Pip, а в Node.js у нас есть НПМ. В случае террафора централизованный реестр называется реестром Terraform, который действует как центральный репозиторий для совместного использования модулей и облегчает повторное использование и обнаружение: https://registry.terrasom.io/

Заключение

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

‍ Высказывание Является ли инструмент для управления инцидентами, который предназначен для Sre. Ваша команда может избавиться от нежелательных предупреждений, получать соответствующие уведомления, работают в сотрудничестве с использованием военных помещений виртуальной инцидента и используют автоматические инструменты, такие как Runbooks, чтобы устранить труд.

Оригинал: «https://dev.to/squadcast/creating-your-first-module-using-terraform-36ie»