Хотите знать, что такое Терраформ? Давайте узнаем об этом.
Инфраструктура как код (IaC) — широко распространенный термин среди профессионалов DevOps. Это процесс управления и предоставления полной ИТ-инфраструктуры (включающей как физические, так и виртуальные машины) с использованием машиночитаемых файлов определений. Это подход к операциям, основанный на программной инженерии. Это помогает автоматизировать весь центр обработки данных с помощью сценариев программирования.
Несмотря на все функции, которые предоставляет «Инфраструктура как код», она сталкивается с множеством проблем:
- Нужно научиться кодировать
- Не знаю, как повлияют изменения.
- Нужно отменить изменения
- Не могу отслеживать изменения
- Не могу автоматизировать ресурс
- Несколько сред для инфраструктуры
Terraform был создан для решения этих проблем.
Что такое Терраформ?
Terraform — это инфраструктура с открытым исходным кодом в виде инструмента кода, разработанная HashiCorp. Он используется для определения и предоставления полной инфраструктуры с использованием простого в освоении декларативного языка.
Это инструмент подготовки инфраструктуры, в котором вы можете хранить настройки облачной инфраструктуры в виде кодов. Он очень похож на такие инструменты, как CloudFormation, которые вы могли бы использовать для автоматизации своей инфраструктуры AWS, но вы можете использовать их только на AWS. С Terraform вы можете использовать его и на других облачных платформах.
Ниже приведены некоторые преимущества использования Terraform.
- Обеспечивает ли оркестровку, а не только управление конфигурацией?
- Поддерживает несколько поставщиков, таких как AWS, Azure, GCP, DigitalOcean и многие другие.
- Обеспечьте неизменяемую инфраструктуру, в которой конфигурация будет плавно меняться.
- Использует простой для понимания язык HCL (язык конфигурации HashiCorp).
- Легко переносится на любого другого провайдера
- Поддерживает только клиентскую архитектуру, поэтому нет необходимости в дополнительном управлении конфигурацией на сервере.
Основные понятия Terraform
Ниже приведены основные концепции/терминологии, используемые в Terraform:
- Переменные : также используются в качестве входных переменных. Это пара ключ-значение, используемая модулями Terraform для обеспечения возможности настройки.
- Поставщик : это плагин для взаимодействия с API-интерфейсами службы и доступа к связанным с ней ресурсам.
- Модуль : это папка с шаблонами Terraform, в которой определены все конфигурации.
- Состояние : состоит из кэшированной информации об инфраструктуре, управляемой Terraform, и связанных с ней конфигурациях.
- Ресурсы : это относится к блоку из одного или нескольких объектов инфраструктуры (вычислительных экземпляров, виртуальных сетей и т. д.), которые используются при настройке и управлении инфраструктурой.
- Источник данных : реализован поставщиками для возврата информации о внешних объектах в терраформирование.
- Выходные значения : это возвращаемые значения модуля terraform, которые могут использоваться другими конфигурациями.
- План : это один из этапов, на котором определяется, что необходимо создать, обновить или уничтожить, чтобы перейти от реального/текущего состояния инфраструктуры к желаемому состоянию.
- Применить : это один из этапов, на котором применяются изменения реального/текущего состояния инфраструктуры для перехода к желаемому состоянию.
Жизненный цикл Терраформирования
Жизненный цикл Terraform состоит из: инициализации , планирования , применения и уничтожения .
- Terraform init инициализирует рабочий каталог, который состоит из всех файлов конфигурации.
- План Terraform используется для создания плана выполнения для достижения желаемого состояния инфраструктуры. Изменения в файлах конфигурации производятся для достижения желаемого состояния.
- Затем Terraform apply вносит в инфраструктуру изменения, определенные в плане, и инфраструктура приходит в желаемое состояние.
- Уничтожение Terraform используется для удаления всех старых ресурсов инфраструктуры, которые помечены как испорченные после фазы применения.
Как работает Терраформ?
Terraform имеет два основных компонента, составляющих его архитектуру:
- Терраформирование Ядра
- Провайдеры
Терраформирование Ядра
Ядро Terraform использует два источника входных данных для выполнения своей работы.
Первый источник входных данных — это конфигурация Terraform, которую вы, как пользователь, настраиваете. Здесь вы определяете, что необходимо создать или предоставить. А второй источник входных данных — это состояние, в котором terraform сохраняет актуальное состояние того, как выглядит текущая настройка инфраструктуры.
Итак, ядро terraform принимает входные данные и составляет план того, что необходимо сделать. Он сравнивает состояние, каково текущее состояние и какую конфигурацию вы хотите получить в конечном результате. Он определяет, что нужно сделать, чтобы достичь желаемого состояния в файле конфигурации. Он определяет, что необходимо создать, что нужно обновить, что нужно удалить, чтобы создать и подготовить инфраструктуру.
Провайдеры
Вторым компонентом архитектуры являются поставщики конкретных технологий. Это могут быть поставщики облачных услуг, такие как AWS, Azure, GCP или другая инфраструктура в качестве сервисной платформы. Он также является поставщиком более высокоуровневых компонентов, таких как Kubernetes или других инструментов «платформа как услуга», и даже некоторого программного обеспечения в качестве инструмента самообслуживания.
Это дает вам возможность создавать инфраструктуру на разных уровнях.
Например: создайте инфраструктуру AWS, затем разверните поверх нее Kubernetes, а затем создайте сервисы/компоненты внутри этого кластера Kubernetes.
У Terraform есть более ста провайдеров для различных технологий, и каждый провайдер затем предоставляет пользователю terraform доступ к своим ресурсам. Таким образом, через поставщика AWS, например, у вас есть доступ к сотням ресурсов AWS, таких как экземпляры EC2, пользователи AWS и т. д. С помощью поставщика Kubernetes вы получаете доступ к товарам, ресурсам, таким как сервисы, развертывания, пространства имен и т. д.
Итак, именно так работает Terraform, и таким образом он пытается помочь вам обеспечить и обеспечить полную настройку приложения, от инфраструктуры до самого приложения.
Давайте займемся практическими делами. 👨💻
Мы установим Terraform на Ubuntu и предоставим очень простую инфраструктуру.
Установить Терраформ
Загрузите последнюю версию пакета terraform.
Посетите официальную страницу загрузки, чтобы получить последнюю версию для соответствующей ОС.
geekflare@geekflare:~$ wget https://releases.hashicorp.com/terraform/0.13.0/terraform_0.13.0_linux_amd64.zip —2020-08-14 16:55:38— https://releases.hashicorp .com/terraform/0.13.0/terraform_0.13.0_linux_amd64.zip Разрешение Release.hashicorp.com (releases.hashicorp.com)… 151.101.153.183, 2a04:4e42:24::439 Подключение к Releases.hashicorp.com (releases.hashicorp.com)|151.101.153.183|:443… подключено. HTTP-запрос отправлен, ожидается ответ… 200 OK Длина: 34851622 (33M) [application/zip] Сохранение в: 'terraform_0.13.0_linux_amd64.zip' terraform_0.13.0_linux_amd64.zip 100%[======== =============================================== =======>] 33,24M 90,3 КБ/с за 5 м 28 с 14 августа 2020 г. 17:01:06 (104 КБ/с) — 'terraform_0.13.0_linux_amd64.zip' сохранен [34851622/34851622]
Извлеките загруженный пакет.
geekflare@geekflare:~$ разархивируйте terraform_0.13.0_linux_amd64.zip Архив: terraform_0.13.0_linux_amd64.zip раздувание: terraform
Переместите исполняемый файл terraform по пути, показанному ниже. Проверьте версию терраформа.
geekflare@geekflare:~$ sudo mv terraform /usr/local/bin/ [sudo] пароль для geekflare: geekflare@geekflare:~$ terraform -v Terraform v0.13.0
Вы можете видеть, что это доступные для выполнения команды в terraform.
geekflare@geekflare:~$ terraform Использование: terraform [-version] [-help]
Предоставление экземпляра AWS EC2 с использованием Terraform
В этой демонстрации я собираюсь запустить новый экземпляр AWS EC2 с использованием Terraform.
Создайте рабочий каталог для этой демонстрации Terraform.
geekflare@geekflare:~$ mkdir terraform_demo
Перейдите в каталог и создайте файл конфигурации terraform, в котором вы определяете поставщика и ресурсы для запуска экземпляра AWS EC2.
geekflare@geekflare:~$ cd terraform_demo/ geekflare@geekflare:~/terraform_demo$ gedit awsec2.tf поставщик «aws» { access_key = «B5KG6Fe5GUKIATUF5UD» secret_key = «R4gb65y56GBF6765ejYSJA4YtaZ+T6GY7H» регион = «us-west-2″ } ресурс » aws_instance» «terraform_demo» { ami = «ami-0a634ae95e11c6f91» instance_type = «t2.micro» }
Примечание: я изменил ключи доступа и секретные ключи 😛, вам нужно использовать свои.
Из конфигурации, упомянутой выше, вы можете видеть, что я упоминаю такого поставщика, как AWS. Внутри провайдера я указываю учетные данные пользователя AWS и регионы, в которых необходимо запустить экземпляр.
В ресурсах я привожу подробности AMI об Ubuntu (ami-0a634ae95e11c6f91) и упоминаю, что тип экземпляра должен быть t2.micro.
Вы можете увидеть, насколько прост и читаем файл конфигурации, даже если вы не заядлый программист.
терраформирование инициализации
Теперь первым шагом будет инициализация terraform.
geekflare@geekflare:~/terraform_demo$ terraform init Инициализация серверной части… Инициализация плагинов провайдера… — Использование ранее установленного hashicorp/aws v3.2.0 Следующие провайдеры не имеют каких-либо ограничений версии в конфигурации, поэтому последняя версия была установлен. Чтобы предотвратить автоматическое обновление до новых основных версий, которые могут содержать критические изменения, мы рекомендуем добавить ограничения версии в блок require_providers вашей конфигурации со строками ограничений, предложенными ниже. * hashicorp/aws: version = «~> 3.2.0» Terraform успешно инициализирован! Теперь вы можете начать работать с Terraform. Попробуйте запустить «план терраформирования», чтобы увидеть любые изменения, необходимые для вашей инфраструктуры. Все команды Terraform теперь должны работать. Если вы когда-либо устанавливали или изменяли модули или конфигурацию серверной части для Terraform, повторно запустите эту команду, чтобы повторно инициализировать ваш рабочий каталог. Если вы забудете, другие команды обнаружат это и при необходимости напомнят вам об этом.
план терраформирования
Далее следует этап планирования; он создаст граф выполнения для создания и предоставления инфраструктуры.
geekflare@geekflare:~/terraform_demo$ terraform plan Обновление состояния Terraform в памяти перед планированием… Обновленное состояние будет использоваться для расчета этого плана, но не будет сохраняться в локальном или удаленном хранилище состояний. ————————————————— ———————- План выполнения создан и показан ниже. Действия ресурса обозначаются следующими символами: + create Terraform выполнит следующие действия: # aws_instance.terraform_demo будет создан + ресурс «aws_instance» «terraform_demo» { + ami = «ami-0a634ae95e11c6f91» + arn = (известно после применения) + Associate_public_ip_address = (известно после применения) + доступность_зоны = (известно после применения) + cpu_core_count = (известно после применения) + cpu_threads_per_core = (известно после применения) + get_password_data = false + host_id = (известно после применения) + id = (известно после применения) применить) + экземпляр_состояние = (известно после применения) + тип_экземпляра = «t2.micro» + ipv6_address_count = (известно после применения) + ipv6_addresses = (известно после применения) + key_name = (известно после применения) + outpost_arn = (известно после применения) + пароль_данные = (известно после применения) + Placement_group = (известно после применения) + Primary_network_interface_id = (известно после применения) + Private_dns = (известно после применения) + Private_IP = (известно после применения) + public_dns = (известно после применения) + public_ip = (известно после применения) + Secondary_private_ips = (известно после применения) + Security_groups = (известно после применения) + source_dest_check = true + subnet_id = (известно после применения) + Tenancy = (известно после применения) + Volume_tags = (известно после применения) + vpc_security_group_ids = (известно после применения) + ebs_block_device { + delete_on_termination = (известно после применения) + имя_устройства = (известно после применения) + зашифровано = (известно после применения) + iops = (известно после применения) + kms_key_id = (известно после применения) ) + snapshot_id = (известен после применения) + Volume_id = (известен после применения) + Volume_size = (известен после применения) + Volume_type = (известен после применения) } + ephemeral_block_device { + имя_устройства = (известен после применения) + no_device = (известен после применения) + virtual_name = (известно после применения) } + Metadata_options { + http_endpoint = (известно после применения) + http_put_response_hop_limit = (известно после применения) + http_tokens = (известно после применения) } + network_interface { + delete_on_termination = (известно после применения) ) + device_index = (известно после применения) + network_interface_id = (известно после применения) } + root_block_device { + delete_on_termination = (известно после применения) + имя_устройства = (известно после применения) + зашифровано = (известно после применения) + iops = (известно) после применения) + kms_key_id = (известен после применения) + Volume_id = (известен после применения) + Volume_size = (известен после применения) + Volume_type = (известен после применения) } } План: 1 для добавления, 0 для изменения, 0 для уничтожения . ————————————————— ———————- Примечание. Вы не указали параметр «-out» для сохранения этого плана, поэтому Terraform не может гарантировать, что именно эти действия будет выполнено, если впоследствии будет запущено «terraform apply».
применить терраформирование
На этапе применения будет выполнен файл конфигурации и запущен экземпляр AWS EC2. Когда вы запустите команду Apply, она спросит вас: «Хотите ли вы выполнить эти действия?», вам нужно ввести «да» и нажать Enter.
geekflare@geekflare:~/terraform_demo$ terraform apply План выполнения создан и показан ниже. Действия ресурса обозначаются следующими символами: + create Terraform выполнит следующие действия: # aws_instance.terraform_demo будет создан + ресурс «aws_instance» «terraform_demo» { + ami = «ami-0a634ae95e11c6f91» + arn = (известно после применения) + Associate_public_ip_address = (известно после применения) + доступность_зоны = (известно после применения) + cpu_core_count = (известно после применения) + cpu_threads_per_core = (известно после применения) + get_password_data = false + host_id = (известно после применения) + id = (известно после применения) применить) + экземпляр_состояние = (известно после применения) + тип_экземпляра = «t2.micro» + ipv6_address_count = (известно после применения) + ipv6_addresses = (известно после применения) + key_name = (известно после применения) + outpost_arn = (известно после применения) + пароль_данные = (известно после применения) + Placement_group = (известно после применения) + Primary_network_interface_id = (известно после применения) + Private_dns = (известно после применения) + Private_IP = (известно после применения) + public_dns = (известно после применения) + public_ip = (известно после применения) + Secondary_private_ips = (известно после применения) + Security_groups = (известно после применения) + source_dest_check = true + subnet_id = (известно после применения) + Tenancy = (известно после применения) + Volume_tags = (известно после применения) + vpc_security_group_ids = (известно после применения) + ebs_block_device { + delete_on_termination = (известно после применения) + имя_устройства = (известно после применения) + зашифровано = (известно после применения) + iops = (известно после применения) + kms_key_id = (известно после применения) ) + snapshot_id = (известен после применения) + Volume_id = (известен после применения) + Volume_size = (известен после применения) + Volume_type = (известен после применения) } + ephemeral_block_device { + имя_устройства = (известен после применения) + no_device = (известен после применения) + virtual_name = (известно после применения) } + Metadata_options { + http_endpoint = (известно после применения) + http_put_response_hop_limit = (известно после применения) + http_tokens = (известно после применения) } + network_interface { + delete_on_termination = (известно после применения) ) + device_index = (известно после применения) + network_interface_id = (известно после применения) } + root_block_device { + delete_on_termination = (известно после применения) + имя_устройства = (известно после применения) + зашифровано = (известно после применения) + iops = (известно) после применения) + kms_key_id = (известен после применения) + Volume_id = (известен после применения) + Volume_size = (известен после применения) + Volume_type = (известен после применения) } } План: 1 для добавления, 0 для изменения, 0 для уничтожения . Вы хотите выполнить эти действия? Terraform выполнит действия, описанные выше. Для одобрения будет принято только «да». Введите значение: да aws_instance.terraform_demo: Создание… aws_instance.terraform_demo: Все еще создается… [прошло 10 с] aws_instance.terraform_demo: Все еще создается… [прошло 20 с] aws_instance.terraform_demo: Все еще создается… [30 с) истекло] aws_instance.terraform_demo: Все еще создается… [прошло 40 секунд] aws_instance.terraform_demo: Создание завершено через 44 секунды [id=i-0eec33286ea4b0740] Применение завершено! Ресурсы: 1 добавлено, 0 изменено, 0 уничтожено.
Перейдите на панель управления AWS EC2, и вы увидите, что создан новый экземпляр с идентификатором экземпляра, указанным в конце команды Apply.
Вы успешно запустили экземпляр AWS EC2 с помощью Terraform.
терраформировать уничтожить
Наконец, если вы хотите удалить инфраструктуру, вам нужно запустить команду уничтожения.
geekflare@geekflare:~/terraform_demo$ terraform уничтожить aws_instance.terraform_demo: Обновление состояния… [id=i-0eec33286ea4b0740] План выполнения создан и показан ниже. Действия ресурса обозначаются следующими символами: — уничтожить Terraform выполнит следующие действия: # aws_instance.terraform_demo будет уничтожен — ресурс «aws_instance» «terraform_demo» { — ami = «ami-0a634ae95e11c6f91» -> null — arn = «arn :aws:ec2:us-west-2:259212389929:instance/i-0eec33286ea4b0740» -> null — Associate_public_ip_address = true -> null — доступность_зона = «us-west-2c» -> null — cpu_core_count = 1 -> null — cpu_threads_per_core = 1 -> null -disable_api_termination = false -> null — ebs_optimized = false -> null — get_password_data = false -> null — спящий режим = false -> null — id = «i-0eec33286ea4b0740» -> null — instance_state = «работает» » -> null — instance_type = «t2.micro» -> null — ipv6_address_count = 0 -> null — ipv6_addresses = [] -> null — мониторинг = false -> null — Primary_network_interface_id = «eni-02a46f2802fd15634» -> null — Private_dns = «ip-172-31-13-160.us-west-2.compute.internal» -> null — Private_ip = «172.31.13.160» -> null — public_dns = «ec2-34-221-77-94. us-west-2.compute.amazonaws.com» -> null — public_ip = «34.221.77.94» -> null — Secondary_private_ips = [] -> null — security_groups = [ — «default», ] -> null — source_dest_check = true -> null — subnet_id = «subnet-5551200c» -> null — tags = {} -> null — tenancy = «default» -> null — Volume_tags = {} -> null — vpc_security_group_ids = [ — «sg-b5b480d1» , ] -> null — Credit_specification { — cpu_credits = «standard» -> null } — Metadata_options { — http_endpoint = «enabled» -> null — http_put_response_hop_limit = 1 -> null — http_tokens = «optional» -> null } — root_block_device { — delete_on_termination = true -> null — имя_устройства = «/dev/sda1» -> null — зашифровано = false -> null — iops = 100 -> null — Volume_id = «vol-0be2673afff6b1a86» -> null — Volume_size = 8 -> null — Volume_type = «gp2» -> null } } План: 0 для добавления, 0 для изменения, 1 для уничтожения. Вы действительно хотите уничтожить все ресурсы? Terraform уничтожит всю вашу управляемую инфраструктуру, как показано выше. Отмена невозможна. Для подтверждения будет принято только «да». Введите значение: да aws_instance.terraform_demo: Уничтожаем… [id=i-0eec33286ea4b0740] aws_instance.terraform_demo: Продолжаем уничтожать… [id=i-0eec33286ea4b0740, прошло 10 с] aws_instance.terraform_demo: Продолжаем уничтожать… [id =i-0eec33286ea4b0740, прошло 20 с] aws_instance.terraform_demo: Все еще уничтожается… [id=i-0eec33286ea4b0740, прошло 30 с] aws_instance.terraform_demo: Уничтожение завершено через 34 с Уничтожение завершено! Ресурсы: 1 уничтожен.
Если вы перепроверите панель управления EC2, вы увидите, что экземпляр был прекращен.
Заключение
Я считаю, что вышеизложенное дает вам представление о том, как начать работу с Terraform. Попробуйте пример, который я только что показал.
Вам также следует ознакомиться с этим программным обеспечением для автоматизации инфраструктуры.
Если вы хотите узнать больше, я бы посоветовал проверить курс «Изучение DevOps с помощью Terraform».