Что такое Terraform и почему вы должны заботиться? Как вы можете узнать об этом без необходимости обеспечить реальные вещи в вашей учетной записи Amazon?
Инфраструктура как код
В те дни, когда мы начали уходить от работы с настоящими серверами в стойке где -то, что появился ряд поставщиков облачной инфраструктуры, предлагая доступ к их виртуальному имуществу через консоль и — если они были хорошими — API.
Я работал во многих различных местах, в которых использовались эти облачные провайдеры (в основном веб -сервисы Amazon), и я видел столько же различных способов управления инфраструктурой.
Худший способ, конечно, через консоль. Нажатие на графический интерфейс — не хороший способ сделать процессы повторяемыми или масштабируемыми. Кроме того, варианты включают в себя: CloudFormation, сервис от AWS (работает только с AWS); Тепловые шаблоны от OpenStack, что очень похоже на облачную информацию (работает только с OpenStack); Проводник шеф -повара, который больше не поддерживается шеф -поваром; И, конечно же, терраформ.
Все эти инструменты позволяют вам определить, какую инфраструктуру вы хотели бы — виртуальные машины, балансировщики нагрузки, хранилище блокировки, базы данных и т. Д. — как какой -то тип чистого и человеческого языка (например, Cloudformation использует JSON). Инструмент может интерпретировать код и создать желаемые ресурсы; Код может быть зарегистрирован в управлении версиями и отслеживается как код приложения.
Терраформ
Terraform является инфраструктурой в качестве инструмента кода от Hashicorp, который производит другие популярные произведения программного обеспечения, такие как Vagrant. Он использует декларативный язык, язык конфигурации Hashicorp (HCL), чтобы определить желаемое состояние вашей облачной инфраструктуры. Из этого кода он генерирует график зависимости ресурсов и при запуске против одного или нескольких поставщиков проходит этот график и гарантирует, что ресурсы существуют и настраиваются в соответствии с определением.
Монтаж
Terraform
Исполняемая файл доставлен как один файл, поэтому его просто нужно загрузить и поместить на путь вашей системы. В системе *nix /usr/local/bin/
это хорошее место, так как это часто уже на вашем $ Path
переменная среды. От https://www.terraform.io/ Найдите ссылку «Скачать» и выберите наиболее подходящую версию для вашей системы. Загрузите его, раскачивайте его и положите Terraform
файл где -нибудь вы можете запустить, например, /usr/local/bin/
.
Убедитесь, что он успешно установлен и узнайте, какую версию вы запускаете — моя:
$ terraform --version Terraform v0.11.7
Определение некоторой инфраструктуры
Теперь, когда Terraform установлен, нам нужно определить, какую инфраструктуру мы хотим, чтобы она создала. Мы используем HCL для определения ресурсов для разных поставщиков. Простой — это случайный провайдер , который генерирует случайные данные для использования, например, в качестве имен серверов. Он не работает против облачного провайдера и не требует ключей API и т. Д. Так хорошо, чтобы проиллюстрировать рабочий процесс Terraform. Мы также будем использовать местный провайдер написать эти случайные данные в файл.
Поместите следующее в файл с именем Пример.tf
:
variable "name_length" { type = "string" default = "2" description = "The number of words to put into the random name" } resource "random_pet" "server" { length = "${var.name_length}" } resource "local_file" "random" { content = "${random_pet.server.id}" filename = "${path.module}/random.txt" } output "name" { value = "${random_pet.server.id}" }
В сторону: Кодовая организация
Terraform будет смотреть в каталог, который вы говорите (текущий каталог по умолчанию) и найдите все *.tf Файлы — Подзадачи игнорируются. Он будет рассматривать файлы, которые он находит как одно определение, и нарисовать график всех ресурсов. Обычно видеть переменная песок выход S разделен на разные файлы, чтобы прояснить, где их найти. Это также часто, и хорошая идея, разделить код на модули, но мы не будем беспокоиться об этом сегодня.
В том же каталоге запуск: Terraform Init
Анкет Вы должны увидеть вывод, который выглядит немного похоже на это:
$ terraform init Initializing provider plugins... - Checking for available provider plugins on https://releases.hashicorp.com... - Downloading plugin for provider "random" (1.3.1)... - Downloading plugin for provider "local" (1.1.0)... The following providers do not have any version constraints in configuration, so the latest version was installed. To prevent automatic upgrades to new major versions that may contain breaking changes, it is recommended to add version = "..." constraints to the corresponding provider blocks in configuration, with the constraint strings suggested below. * provider.local: version = "~> 1.1" * provider.random: version = "~> 1.3" Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary.
Terraform посмотрел на все *.tf
Файлы определили, какие поставщики используются и загружают соответствующие плагины. Они хранятся в .terraform/
каталог, который был создан в текущем пути.
Планирование изменений
Одна удивительная особенность Terraform — это возможность предварительно просмотреть изменения, чтобы получить представление о том, что на самом деле произойдет, когда вы их применяете. Собирается ли это изменение модифицировать мой LoadBalancer на месте или оно собирается уничтожить его и воссоздать его, снимая мое заявление в автономный режим в течение драгоценных минут?
Посмотрим, как это выглядит:
$ terraform plan Refreshing Terraform state in-memory prior to plan... The refreshed state will be used to calculate this plan, but will not be persisted to local or remote state storage. ----------------------------------------------------------------------------- An execution plan has been generated and is shown below. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: + local_file.random id:content: "${random_pet.server.id}" filename: "/home/vagrant/workspace/tfdemo/random.txt" + random_pet.server id: length: "2" separator: "-" Plan: 2 to add, 0 to change, 0 to destroy. ----------------------------------------------------------------------------- Note: You didn't specify an "-out" parameter to save this plan, so Terraform can't guarantee that exactly these actions will be performed if "terraform apply" is subsequently run.
Это первый раз, когда мы запускаем его, поэтому создаются все указанные нами ресурсы — см. +
Рядом с их именем в выводе.
Также обратите внимание на «примечание» — мы не сохранили этот план, поэтому, хотя у нас есть хорошее представление о том, что Terraform сделает, когда мы его применяем, это не гарантированно попытаться сделать то же самое. Мы можем сохранить план в файле с уникальным именем, добавив временную метку, т.е. План Terraform -out "План -$ (дата +%s)"
Анкет
Запуск, который мы вместо этого получаем в конце вывода:
... This plan was saved to: plan-1527707537 To perform exactly these actions, run the following command to apply: terraform apply "plan-1527707537"
Если мы довольны этим планом, мы можем применить его по -настоящему.
Применение изменений
Когда мы бежим терраформ применить
и передайте его файл плана, который мы получаем, который выглядит как следующее:
$ terraform apply "plan-1527707537" random_pet.server: Creating... length: "" => "2" separator: "" => "-" random_pet.server: Creation complete after 0s (ID: leading-piranha) local_file.random: Creating... content: "" => "leading-piranha" filename: "" => "/home/vagrant/workspace/tfdemo/random.txt" local_file.random: Creation complete after 0s (ID: 681f312327eab60da028b397bc85af8682fdc185) Apply complete! Resources: 2 added, 0 changed, 0 destroyed. Outputs: name = leading-piranha
Случайный провайдер дал нам имя домашнего животного, состоящее из 2 слов и вывод
Директива показала это в конце программы. local_file
Ресурс написал имя в файл с именем random.txt
В текущем каталоге:
$ cat random.txt leading-piranha[vagrant@localhost tfdemo]$
Внося больше изменений
Хм, в конце файла нет новой линии. Я бы предпочел, чтобы это было отформатировано с одним Так что я добавлю один в HCL. Контент
в local_file
можно изменить на \ n
добавлено:
... content = "${random_pet.server.id}\n" ...
Если мы планируем изменения, мы увидим это только Файл должен измениться. Нет причин для random_pet
Ресурс будет изменен вообще, поэтому Terraform использует его как есть.
$ terraform plan -out "plan-$(date +%s)" Refreshing Terraform state in-memory prior to plan... The refreshed state will be used to calculate this plan, but will not be persisted to local or remote state storage. random_pet.server: Refreshing state... (ID: leading-piranha) local_file.random: Refreshing state... (ID: 681f312327eab60da028b397bc85af8682fdc185) ----------------------------------------------------------------------------- An execution plan has been generated and is shown below. Resource actions are indicated with the following symbols: -/+ destroy and then create replacement Terraform will perform the following actions: -/+ local_file.random (new resource required) id: "681f312327eab60da028b397bc85af8682fdc185" =>(forces new resource) content: "leading-piranha" => "leading-piranha\n" (forces new resource) filename: "/home/vagrant/workspace/tfdemo/random.txt" => "/home/vagrant/workspace/tfdemo/random.txt" Plan: 1 to add, 0 to change, 1 to destroy. ----------------------------------------------------------------------------- This plan was saved to: plan-1528126805 To perform exactly these actions, run the following command to apply: terraform apply "plan-1528126805"
Применение изменений из только что внесенного нами плана может кошка
Файл еще раз показывает, что теперь в конце есть новая линия:
$ terraform apply "plan-1528126805" local_file.random: Destroying... (ID: 681f312327eab60da028b397bc85af8682fdc185) local_file.random: Destruction complete after 0s local_file.random: Creating... content: "" => "leading-piranha\n" filename: "" => "/home/vagrant/workspace/tfdemo/random.txt" local_file.random: Creation complete after 0s (ID: 82c2862c8ae7053eb94b7aa498265335c5d22b22) Apply complete! Resources: 1 added, 0 changed, 1 destroyed. Outputs: name = leading-piranha $ cat random.txt leading-piranha
Переменные
В Пример.tf
Файл вы можете видеть, что мы объявили переменная
называется name_length
и ссылался на это в random_pet
ресурс ( длина
); Почему бы просто не жесткий код этого числа?
Чтобы помочь повторному использованию кода, Terraform позволяет нам проходить в разных значениях для определенных нами переменных. Мы используем -Вар
флаг и название переменной, как это:
$ terraform plan -var name_length=3 Refreshing Terraform state in-memory prior to plan... The refreshed state will be used to calculate this plan, but will not be persisted to local or remote state storage. random_pet.server: Refreshing state... (ID: leading-piranha) local_file.random: Refreshing state... (ID: 82c2862c8ae7053eb94b7aa498265335c5d22b22) ----------------------------------------------------------------------------- An execution plan has been generated and is shown below. Resource actions are indicated with the following symbols: -/+ destroy and then create replacement Terraform will perform the following actions: -/+ local_file.random (new resource required) id: "82c2862c8ae7053eb94b7aa498265335c5d22b22" =>(forces new resource) content: "leading-piranha\n" => "${random_pet.server.id}\n" (forces new resource) filename: "/home/vagrant/workspace/tfdemo/random.txt" => "/home/vagrant/workspace/tfdemo/random.txt" -/+ random_pet.server (new resource required) id: "leading-piranha" => (forces new resource) length: "2" => "3" (forces new resource) separator: "-" => "-" Plan: 2 to add, 0 to change, 2 to destroy. ----------------------------------------------------------------------------- Note: You didn't specify an "-out" parameter to save this plan, so Terraform can't guarantee that exactly these actions will be performed if "terraform apply" is subsequently run.
План снова говорит нам, что произойдет — оба ресурса будут уничтожены, а другие созданы на их месте. Файл должен быть воссоздан в этом случае, потому что он зависит от значения от random_pet
Анкет Terraform работает из графа зависимостей, который он генерирует — он может решить, что ему нужно для воссоздания в зависимости от того, что изменилось, и что от этого зависит.
В сторону: График зависимости
График зависимостей для вашей инфраструктуры можно увидеть в [DOT Language] ( https://en.wikipedia.org/wiki/dot_(graph_description_language) запустив Terraform Graph
. Если у вас есть График Установлено, затем вы можете отобразить его, передавая выходной вывод прямо к точка
Программа:
$ terraform graph | dot -Tpng -o tfdemo.png
Это действительно простой пример, и на карту не поставлена критическая инфраструктура, поэтому мы можем применить эти изменения без сохранения в файл плана, просто запустив терраформ применить
и либо ввод, что «да» в приглашении, либо передавая -Auto-одобрение
флаг:
$ terraform apply -var name_length=3 -auto-approve random_pet.server: Refreshing state... (ID: leading-piranha) local_file.random: Refreshing state... (ID: 82c2862c8ae7053eb94b7aa498265335c5d22b22) local_file.random: Destroying... (ID: 82c2862c8ae7053eb94b7aa498265335c5d22b22) local_file.random: Destruction complete after 0s random_pet.server: Destroying... (ID: leading-piranha) random_pet.server: Destruction complete after 0s random_pet.server: Creating... length: "" => "3" separator: "" => "-" random_pet.server: Creation complete after 0s (ID: scarcely-intense-mammoth) local_file.random: Creating... content: "" => "scarcely-intense-mammoth\n" filename: "" => "/home/vagrant/workspace/tfdemo/random.txt" local_file.random: Creation complete after 0s (ID: a3f2f24388d1e4ddd72872a833469002f2ad5b75) Apply complete! Resources: 2 added, 0 changed, 2 destroyed. Outputs: name = scarcely-intense-mammoth
Обратите внимание, что нам нужно передать те же параметры на фазу применения, который мы проходили при планировании. Это одна очень хорошая причина, чтобы сохранить план и использовать его при запуске применить
Анкет
Состояние
Вместе с .terraform/
каталог, который хранит плагины поставщика, вы заметите, что есть Terraform.tfstate
Файл тоже там. Быстрый экзамен показывает, что это текст, который мы можем прочитать!
$ file terraform.tfstate terraform.tfstate: ASCII text
Это состояние наших ресурсов, в формате JSON. Государство представляет собой точку зрения терраформ на определенные ресурсы. Если вы запустите план
командовать с теми же аргументами в том же каталоге, а затем Terraform скажет нам, что нечего делать:
$ terraform plan -var name_length=3 Refreshing Terraform state in-memory prior to plan... The refreshed state will be used to calculate this plan, but will not be persisted to local or remote state storage. random_pet.server: Refreshing state... (ID: scarcely-intense-mammoth) local_file.random: Refreshing state... (ID: a3f2f24388d1e4ddd72872a833469002f2ad5b75) ----------------------------------------------------------------------------- No changes. Infrastructure is up-to-date. This means that Terraform did not detect any differences between your configuration and real physical resources that exist. As a result, no actions need to be performed.
Если вы запускаете Terraform для создания вашей облачной инфраструктуры, убедитесь, что государство привержен контролю источника или, особенно если вы работаете с другими инженерами, сохраняется в одном из Поддерживаемые бэкэнды .
Завершая
Это иллюстрирует типичный рабочий процесс для Terraform: Code -> Plan -> Apply -> Commit. Чтобы сделать это как можно более простым, чтобы следовать по провайдерам, которые работают только локально, но если вы добавили aws_instance
Ресурс, тогда сгенерированное нами имя случайного сервера может быть легко использовано для установки Имя
Теги в экземпляре EC2. Terraform заберет стандарт AWS_ACCESS_KEY_ID
и AWS_SECRET_ACCESS_KEY
Переменные окружающей среды и ваш рабочий процесс остаются неизменными, поскольку вы обеспечиваете реальную инфраструктуру.
Оригинал: «https://dev.to/grahamlyons/a-zero-fricton-terraform-primer-58g2»