Глава 6. Рабочие потоки Terraform
Содержание
В своей предыдущей главе мы обсудили command-line interface (CLI) Terraform и увидели некоторый вывод из команд Terraform.
В этой главе мы взглянем на центральный рабочий процесс самого инструмента Terraform, который вовлекает создание некого файла конфигурации
Terraform (write
), предварительный просмотр изменений (plan
),
затем окончательная фиксация этих изменений в вашей целевой среде (apply
). После того, как мы выполнили
создание необходимых ресурсов, мы можем потребовать избавиться от инфраструктур (destroy
). В сердцевине
всего, мы планируем охватить центральные рабочие процессы Terraform, которые в основном состоят из операций terraform
init
, terraform plan
, terraform apply
и
terraform destroy
, а также соответствующих подчинённых команд и их вывода. Понимание рабочих процессов
Terraform поможет вам предоставлять и обновлять инфраструктуру применяя infrastructure as
code (IaC) Terraform. Мы также поясним интеграцию рабочих процессов
Terraform с основными поставщиками Облачных решений, такими как Azure. Двигаясь далее мы намерены обсудить рабочие процессы Terraform, применяющие
службу DevOps Azure.
В этой главе будут рассмотрены следующие темы:
-
Понимание жизненного цикла Terraform
-
Понимание рабочих процессов Terraform с применением DevOps Azure
Чтобы следовать данной главой вам требуется обладать представлением о CLI Terraform и различных методах аутентификации Terraform с основными поставщиками Облачных решений, такими как Azure, Google Cloud Platform (GCP) и Amazon Web Services (AWS). Вы также должны знать как устанавливать Terraform в различных машинах и должны обладать базовым пониманием написания файла конфигурации Terraform. Некоторые знания об DevOps Azure и Git добавили бы вам преимуществ. Вы можете найти весь применяемый в этой главе код по такой ссылке в GitHub: https://github.com/PacktPublishing/HashiCorp-Infrastructure-Automation-Certification-Guide/tree/master/chapter6.
Чтобы увидеть видео "Код в действии", перейдите по следующей ссылке: https://bit.ly/3qVPyf8.
Поскольку вы познакомились с тем как применять CLI Terraform и выполнять соответствующие команды Terraform, вам также должно заинтересовать
как Terraform создаёт или обновляет некую инфраструктуру. Terraform соблюдает последовательность команд которая определяется в его жизненном цикле.
Давайте попробуем разобраться как общий жизненный цикла Terraform работает с terraform init
,
terraform plan
, terraform apply
и
terraform destroy
. Рабочий процесс Terraform стартует с написания соответствующего файла кода Terraform,
выгрузки всех поставщиков и подключаемых модулей, отображения в предварительном представлении того, какие действия Terraform намерен осуществлять
и затем - наконец - желаете ли вы развернуть те ресурсы, которые были определены в файле кода конфигурации Terraform. После создания или обновления
такой инфраструктуры, давайте допустим, что вы желаете уничтожить эти ресурсы - как вы сделаете это? Всё это можно прояснить следуя рабочим
процессом clarifed, что начертано на следующей схеме:
terraform init
это самая первая и передовая команда Terraform, которую вы обычно выполняете для
инициализации Terraform в своём рабочем каталоге. Может иметься несколько причин для исполнения команды terraform
init
, такие как:
-
Когда вам приходится добавлять новые модуль, поставщик или оснастку
-
Когда вам приходится обновлять требующуюся версию модуля, поставщика или оснастки
-
Когда вы желаете изменить или выполнить миграцию уже сконфигурированной серверной основы
Модули Terraform (которые мы обсудим в следующей главе, Главе 7, Модули Terraform) и такие
выгружаемые файлы подлежат сохранению в том текущем рабочем каталоге, который вы предоставили. Команда terraform
init
поддерживает множество подчинённых команд или аргументов. Вы можете получить все имеющиеся поддерживаемые параметры, набрав
terraform init -р
и вот совместный ресурс для некоторых из них:
-
-backend=true
: Настраивать данную серверную основу под эту конфигурацию. -
-backend-config=path
: Это может быть либо путь к файлу HCL ( Hashicorp Confguration File) с назначениями ключ/ значение (тот же самый формат, что и дляterraform.tfvars
) или же форматkey=value
. Это сливается с тем, что имеется в файле конфигурации, который может быть определён множество раз. Данный тип серверной основы должен присутствовать в самом файле конфигурации. -
-from-module=SOURCE
: Копирует всё содержимое заданного модуля в указанный целевой каталог перед инициализацией. -
-lock=true
: При поддержке блокирований блокирует соответствующий файл состояния. -
-no-color
: Когда опредеделён, получаемый вывод не содержит никаких цветов. -
-plugin-dir
: Каталог содержит исполняемые файлы подключаемого модуля. Это перекрывает все установленные по умолчанию пути поиска для подключаемых методо в предотвращает автоматическую установку подключаемых модулей. Данный флаг может применяться множество раз. -
-reconfigure
: Повторно выполняет конфигурирование данной серверной основы, игнорируя все сохранённые конфигурации. -
-upgrade=false
: Когда станавливаются модули (-get
) или подключаемые модули (-get-plugins
), ранее выгруженные объекты игнорируются и устанавливается самая последняя версия, допустимая ограничениями конфигурации. -
-verify-plugins=true
: Удостоверяет аутентификацию и целостность автоматически выгружаемых подключаемых модулей.
Давайте попробуем разобраться с тем, что именно происходит когда мы исполняем команду terraform init
с никем простым образцом кода. В данном примере мы общаемся с поставщиком Azure Resource
Manager (AzureRM). В следующем фрагменте кода мы поместили его в
файле providers.tf
:
terraform {
required_version = ">= 1.0"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "2.55.0"
}
}
}
provider "azurerm" {
features {}
}
С точки зрения выполняемых при запуске terraform init
действий, если вы пристальнее вглядитесь в
наш следующий фрагмент кода, мы запросто можем понять что выполнил terraform init
. Мы можем вдеть, что
он осуществил инициализацию указанной серверной основы для сохранения файла состояния, а также выгрузил подключаемый модуль поставщика из
HashiCorp. Terraform не будет способен выгружать сторонние подключаемые модули.
Вместо этого они могут устанавливаться вручную в католог подключаемых модулей пользователя, расположенного в
~/.terraform.d/plugins
для операционных систем Linux/Mac и в
%APPDATA%\terraform.d\plugins
для Windows. Для получения подробных сведений относительно сторонних
подключаемых модулей вы можете обратиться к справочным сведениям в https://www.hashicorp.com/blog/automatic-installation-of-third-party-providers-with-terraform-0-13. Здесь вы можете видеть
этот код:
$ terraform init
Initializing the backend...
Initializing provider plugins...
- Finding hashicorp/azurerm versions matching "2.55.0"...
- Installing hashicorp/azurerm v2.55.0...
- Installed hashicorp/azurerm v2.55.0 (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl to record the provider selections it made above. Include this file in your version control repository so that Terraform can guarantee to make the same selections by default when you run "terraform init" in the future.
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 init
в текущем
рабочем каталоге была создана папка .terraform
, которая содержит подключаемые модули поставщика
azurerm
:
PS C:\terraform> tree
.
├── .terraform
│ ├── environment
│ └── providers
│ ├── registry.terraform.io
│ │ └── hashicorp
│ │ └── azurerm
│ │ └── 2.55.0
│ │ └── windows_amd64
│ │ └── terraform-provider-azurerm_v2.55.0_x5.exe
├── .terraform.lock.hcl
└── providers.tf
Давайте попробуем разобраться как мы можем выполнять инициализацию Terraform в своём текущем локальном каталоге, предоставляя некий путь к
соответствующим файлам Terraform. Чтобы понять это, нам придётся переместить файл providers.tf
в свою папку
provider
и затем из своего текущего каталога придётся выполнить terraform init
-backend-config='C:\provider'
. Это выгрузит все необходимые подключаемые модули поставщика в представленный рабочий каталог.
Это код иллюстрируется в приводимом ниже фрагменте:
$ terraform init -backend-config='C:\provider'
Initializing the backend...
Initializing provider plugins...
- Finding hashicorp/azurerm versions matching "2.55.0"...
- Installing hashicorp/azurerm v2.55.0...
- Installed hashicorp/azurerm v2.55.0 (signed by HashiCorp)
Warning: Missing backend configuration
-backend-config was used without a "backend" block in the configuration.
If you intended to override the default local backend configuration, no action is required, but you may add an explicit backend block to your configuration to clear this warning:
terraform {
backend "local" {}
}
However, if you intended to override a defined backend, please verify that the backend configuration is present and valid.
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 init
мы получили некоторый вид предостережения
относительно своей конфигурации. Если вы желаете установить удалённую серверную основу - например, хранилище Azure Blob - тогда мы можем в
своём файле providers.tf
иметь такой код:
terraform {
required_version = ">= 1.0"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "2.55.0"
}
}
backend "azurerm" {
resource_group_name = "terraform-rg"
storage_account_name = "terraformstatestg"
container_name = "tfstate-container"
key = "tfstate"
}
}
provider "azurerm" {
features {}
}
Этот определённый выше код помог бы нам удерживать файл состояния Terraform в нашей удалённой серверной основе. Когда мы не определяем такую удалённую серверную основу, Terraform применял бы имеющуюся локальную серверную основу и хранил бы соответствующий файл состояния там.
У нас нет возможности обсуждать все имеющиеся подчинённые команды terraform init
и именно по этой
причине мы уже выставили на обозрение перечень имеющихся подчинённых команд/ аргументов и их соответствующие описания в самом начале данного
раздела с тем, чтобы вы могли получить представление о том что именно вы можете делать.
![]() | Замечание |
---|---|
Обсуждаемая команда |
Когда у вас имеются некоторые синтаксические ошибки Terraform в вашем коде конфигурации, вы, должно быть, задаётесь вопросом:
Предоставляет ли Terraform какой- либо способ проверки таких ошибок?. Ответ да, Terraform обладает
встроенной командой terraform validate
, которая сообщит вам имеются ли какие- либо синтаксические ошибки
в вашем коде конфигурации Terraform в предписанном каталоге.
Вы можете выполнить команду terraform validate
в явном виде, в противном случае ратификация вашего
файла конфигурации будет осуществлена в неявном виде в процессе исполнения команд terraform plan
или
terraform apply
, пэтому не обязательно выполнять эту команду. Terraform достаточно осведомлён относительно
исполнения ратификации в процессе прочих рабочих процессов Terraform, таких как terraform plan
или
terraform apply
.
Единственный момент, необходимый перед выполнением Terraform ратификации кода конфигурации состоит в команде terraform
init
, которая выгружает по умолчанию все подключаемые модули и всех поставщиков. Вот некий пример по- быстрому чтобы дать вам
представление некоторых возможных ошибок ратификации синтаксиса:
terraform {
required_version = ">= 1.0"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "2.55.0"
}
}
}
provider "azurerm" {
features {}
}
resource "azurerm_resource_group" "example" {
name = "Terraform-lab-RG"
location = "eastus"
terraform_location = "eastus"
}
Когда мы выполним terraform validate
для приведённой конфигурации, мы получим такую ошибку:
PS C:\provider> terraform validate
Error: Unsupported argument
on resourcegroup.tf line 16, in resource "azurerm_resource_group" "example":
16: terraform_location = "eastus"
An argument named "terraform_location" is not expected here.
Она отображает тот факт, что terraform_location
не является допустимым аргументом для
azurerm_resource_group
.
Давайте рассмотрим что произойдёт когда мы удалим аргумент terraform_location
из своего кода
конфигурации и затем исполним terraform validate
. Вы можете видеть полученный результат в следующем
фрагменте кода:
PS C:\provider> terraform validate
Success! The configuration is valid.
Итак, terraform validate
может помочь вам выполнять синтаксическую проверку кода конфигурации Terraform
в том каталоге, на который мы ссылаемся.
![]() | Замечание |
---|---|
Команда |
После выполнения terraform init
от вас ожидается исполнение команды
terraform plan
, которая выработала бы некий план выполнения. После исполнения команды
terraform plan
Terraform осуществляет обновление в своей серверной основе (если тоько вы не запретили его
в явном виде) и далее Terraform определяет какие действия ему требуется предпринять чтобы прийти в соответствие с желательным состоянием,
которое вы задали в файлах конфигурации. Если в имеющихся файлах конфигурации нет никаких изменений, тогда
terraform plan
даст вам знать что он не внёс никаких изменений в вашу инфраструктуру. Здесь приводятся
некоторые из подчинённых команд/ аргументов, которые вы можете запускать с terraform plan
- полный список
всех подчинённых команд/ аргументов, поддерживаемых этапом terraform plan
можно увидеть, исполнив команду
terraform plan -h
:
-
-destroy
: В случае установки будет выработан план уничтожения всех ресурсов, управляемых заданными конфигурацией и состоянием. -
-input=true
: Запрашивает ввод для переменных, когда они не установлены напрямую. -
-out=path
: Записывает файл плана в заданном пути. Его можно применять в качестве входных данных для командыapply
. -
-state=statefile
: Предоставляет путь к файлу состояния Terraform, применяемый дл просмотра управляемых Terraform ресурсов. По умолчанию будет применяться файл состоянияterraform.tfstate
, если он имеется. -
-target=resource
: Предоставляет в качестве цели ресурс. Соответствующая операция будет ограничена данным ресурсом и его зависимостями. Данный флаг может применяться множество раз. -
-var 'foo=bar'
: Устанавливает переменную в имеющейся конфигурации Terraform. Этот флаг может устанавливаться множество раз. -
-var-file=foo
: Устанавливает в имеющейся конфигурации Terraform переменные из некого файла. Когда присутствуют файлыterraform.tfvars
или любой.auto.tfvars
, они будут загружаться автоматически.
Чтобы разобраться с командой terraform plan
, вот некая строка кода, которая определяется в файле
resourcegroup.tf
:
resource "azurerm_resource_group" "example" {
name = "Terraform-lab-RG"
location = "east us"
}
Когда мы запускаем команду terraform plan
, мы можем ожидать следующий вывод:
PS C:\terraform> terraform plan
Acquiring state lock. This may take a few moments...
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:
# azurerm_resource_group.example will be created
+ resource "azurerm_resource_group" "example" {
+ id = (known after apply)
+ location = "eastus"
+ name = "Terraform-lab-RG"
}
Plan: 1 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.
Releasing state lock. This may take a few moments...
Из определённого выше вывода команды terraform plan
нам становятся известными все те ресурсы,
которые мы намерены создавать и обновлять. В нашем примере показано намерение создания группы ресурсов с названием
Terraform-lab-RG
.
Давайте разберёмся как сохранять вывод terraform plan
в неком файле. Для сохранения вывода
terraform plan
, нам требуется исполнить команду terraform plan -out
<filename>
следующим образом:
PS C:\provider> terraform plan -out plan.txt
Acquiring state lock. This may take a few moments...
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:
# azurerm_resource_group.example will be created
+ resource "azurerm_resource_group" "example" {
+ id = (known after apply)
+ location = "eastus"
+ name = "Terraform-lab-RG"
}
Plan: 1 to add, 0 to change, 0 to destroy.
------------------------------------------------------------------------
This plan was saved to: plan.txt
To perform exactly these actions, run the following command to apply:
terraform apply "plan.txt"
Releasing state lock. This may take a few moments...
Наша команда terraform plan -out plan.txt
создала в представленном локально рабочем каталоге файл
plan.txt
и будет обладать неким файлом двоичного вывода terraform plan
,
который видеть ниже в распахнутом каталоге:
PS C:\provider> ls
Directory: C:\provider
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 09-12-2020 03:53 .terraform
-a---- 09-12-2020 16:41 2040 plan.txt
-a---- 09-12-2020 03:53 316 providers.tf
-a---- 09-12-2020 16:21 105 resourcegroup.tf
Когда мы хотим воспользоваться этим сохранённым двоичным файлом (то есть plan.txt
) в процессе
команды terraform plan
, тогда мы можем исполнить
terraform apply "plan.txt"
.
Двигаясь далее мы попытаемся разобраться следует ли нам входное значение переменной в процессе времени исполнения Terraform или же нам надлежит передавать значение переменной из некого локального файла.
В resourcegroup.tf
мы определили такой код:
resource "azurerm_resource_group" "example" {
name = var.rgname
location = "eastus"
}
Поскольку мы определили name = var.rgname
, нам затем требуется объявить некую переменную
rgname
, которая будет содержаться в неком отдельном файле, variables.tf
,
следующим образом:
variable "rgname"{
description = "name of the resource group"
type = string
}
После выполнения terraform plan
мы можем наблюдать следующий фрагмент кода, в котором Terraform
выполняет поиск значения rgname
, которое может быть представлено в процессе времени исполнения:
PS C:\provider> terraform plan
var.rgname
name of the resource group
Enter a value:
После того, как мы предоставим соответствующие данные на ввод, он продолжит дальнейшее выполнение и даст нам знать какой ресурс он намерен предоставить, что иллюстрируется следующим фрагментом кода:
PS C:\provider> terraform plan
var.rgname
name of the resource group
Enter a value: terraform-lab-rg
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:
# azurerm_resource_group.example will be created
+ resource "azurerm_resource_group" "example" {
+ id = (known after apply)
+ location = "eastus"
+ name = "terraform-lab-rg"
}
Plan: 1 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 выполнит поиск любых файлов, заканчивающихся на .tfvars
или
.auto.tfvars
в своём текущем рабочем каталоге. Когда такой файл обнаружен, Terraform считает необходимое
значение переменной из такого файла. Допустим, мы задали значение переменной в своём файле testing.txt
- в таком случае, в процессе исполнения команды terraform plan
, нам требуется предоставить название пути
такого файла: terraform plan -var-file="testing.txt"
. Мы определили значение переменной в
своём файле testing.txt
- то есть,
rgname = "terraformlab-rg"
.
При исполнении упомянутой выше команды вы получите следующий код вывода:
PS C:\provider> terraform plan -var-file="testing.txt"
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:
# azurerm_resource_group.example will be created
+ resource "azurerm_resource_group" "example" {
+ id = (known after apply)
+ location = "eastus"
+ name = "terraform-lab-rg"
}
Plan: 1 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 plan
способен получать значения переменной множеством
вариантов. Terraform получает значения переменной в следующей последовательности:
Terraform CLI >> any filename/terraform.tfvars >> default value provided in the variable declaration
Мы уже представляли список тех подчинённых команд/ аргументов, которые поддерживаются командой terraform plan
(с их описанием) в самом начале данной темы, а потому мы не будем пояснять здесь все подчинённые команды. Чтобы дополнительно ознакомиться
с terraform plan
, вы можете проследовать на https://www.terraform.io/docs/commands/plan.html.
После выполнения terraform init
и terraform plan
, если вы
сочли изменения соответствующие вашим ожиданиям, вы затем можете выполнить terraform apply
, что поможет
вам предоставить необходимую инфраструктуру или обновить её. Это обновит файл состояния Terrafor и получит его сохранённым в ваней локальной
или удалённой серверной основе. Вот перечень необходимых флагов подчинённых команд, которые вы можете исполнять при помощи
terraform apply
- вы можете обнаружить этот список выполнив команду
terraform apply -h
:
-
-auto-approve
: Пропускает интерактивное одобрение ранее применённого плана. -
-backup=path
: Предоставляет путь для резервного копирования существующего файла состояния перед его изменением. По умолчанию это путь-state-out
с расширением.backup
. Для отключения резервного копирования установите-
. -
-compact-warnings
: Когда Terraform производит большое число всяких предупреждений, которые не сопровождаются ошибками, отображать их в более компактном виде, который содержит лишь суммарные сообщения. -
-input=true
: Запрашивает ввод переменных, когда они не установлены непосредственно. -
-lock=true
: Блокирует файл состояния при поддержке блокировок. -
-lock-timeout=0s
: Продолжительность для повтора блокировки состояния. -
-no-color
: Когда определён, получаемый вывод не содержит никаких цветов. -
-parallelism=n
: Ограничивает значение числа одновременных операций. По умолчанию установлено10
. -
-refresh=true
: Обновляет состояние перед проверкой на различия. -
-state=path
: Предоставляет путь для считывания и сохранения состояния (только когда не задан-state-out
). Значение по умолчаниюterraform.tfstate
. -
-state-out=path
: Представляет путь для записи состояния , которое отличается от-state
. Может применяться для сохранения старого состояния. -
-target=resource
: Предоставляет для цели некий ресурс. Данная операция будет ограничена лишь этим ресурсом и его зависимостями. Данный флаг может применять множество раз. -
-var 'foo=bar'
: Устанавливает переменную в имеющейся конфигурации Terraform. Этот флаг может использоваться неоднократно. -
-var-file=foo
: Устанавливает из некого файла переменные в имеющейся конфигурации Terraform. Когда присутствуют файлterraform.tfvars
или файлы.auto.tfvars
, они могут загружаться автоматически.
В продолжение примера с этапа terraform plan
(то есть, когда testing.txt
содержит необходимое значение переменной Terraform), давайте попробуем разобраться как сработает с этим примером
terraform apply
:
PS C:\provider> terraform apply -var-file="testing.txt"
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:
# azurerm_resource_group.example will be created
+ resource "azurerm_resource_group" "example" {
+ id = (known after apply)
+ location = "eastus"
+ name = "terraform-lab-rg"
}
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value:
Теперь мы можем ввести для продолжения здесь значение yes
или же мы можем предоставить отличное от
yes
значение для прекращения terraform apply
и выхода в свой
терминал исполнения. Если мы желаем чтобы на протяжении нашего этапа terraform apply
не было бы последующих
подтверждений, мы бы просто могли поместить terraform apply -auto-approve
. В нашем случае мы можем
определить terraform apply -var-file="testing.txt" -auto-approve
для получения в результате такого
вывода:
azurerm_resource_group.example: Creating...
azurerm_resource_group.example: Creation complete after 3s [id=/subscriptions/97c3799f-2753-40b7-a4bd-157ab464d8fe/resourceGroups/terraform-lab-rg]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Как вы можете видеть, наша предыдущая команда не выдаёт никакого приглашения на ввод подтверждения и управилась с созданием в Azure группы ресурсов.
В самом начале этого раздела мы ознакомились со всеми флагами подчинённых команд, поддерживаемых terraform
apply
. Вы можете прочитать и проверить вывод каждой из команд в CLI Terraform. Для получения дополнительных сведений относительно
terraform apply
вы можете посетить https://www.terraform.io/docs/commands/apply.html.
![]() | Замечание |
---|---|
Мы не рекомендуем вам применять команду |
Вы можете удивиться зачем нужно в жизненном цикле вашей инфраструктуры иметь destroy
. Могут иметься
ситуации, когда вы хотите избавиться от ресурсов, которые вы предоставили при помощи terraform apply
, и
в таком случае вы можете выполнять команду terraform destroy
. Это удалит все те ресурсы или службы,
которые вы определили в своём файле конфигурации и обновит соответствующим образом файл состояния. Команда terraform
destroy
очень мощная и когда вы выполняете её, она предоставит вам план исполнения для всех ресурсов, которые она намерена удалить
и после этого запросит подтверждения, так как после того как эта команда исполнится, нет возможности возврата. Некоторые из флагов подчинённых
команд или аргументов, поддерживаемых terraform destroy
, мы перечислили здесь - вы можете получить полный
список поддерживаемых аргументов, запустив terraform destroy -h
:
-
-backup=path
: Предоставляет путь для резервного копирования существующего файла состояния перед его изменением. По умолчанию это путь-state-out
с расширением.backup
. Для отключения резервного копирования установите-
. -
-auto-approve
: Пропускает интерактивное одобрение перед удалением. -
-lock=true
: Блокирует файл состояния при поддержке блокировок. -
-refresh=true
: Обновляет файл состояния для проверки различий. Это не имеет эффекта когда файлplan
задан сapply
. -
-state=path
: Предоставляет путь для считывания и сохранения состояния (только когда не задан-state-out
). Значение по умолчаниюterraform.tfstate
. -
-state-out=path
: Представляет путь для записи состояния , которое отличается от-state
. Может применяться для сохранения старого состояния. -
-target=resource
: Предоставляет для цели некий ресурс. Данная операция будет ограничена лишь этим ресурсом и его зависимостями. Данный флаг может применять множество раз. -
-var 'foo=bar'
: Устанавливает переменную в имеющейся конфигурации Terraform. Этот флаг может использоваться неоднократно. -
-var-file=foo
: Устанавливает из некого файла переменные в имеющейся конфигурации Terraform. Когда присутствуют файлterraform.tfvars
или файлы.auto.tfvars
, они могут загружаться автоматически.
Вы могли заметить, что все имеющиеся подчинённые команды, поддерживаемые terraform apply
, также
поддерживаются и terraform destroy
. terraform destroy
исполняет
в точности противоположные действия команде terraform apply
. Точно так же как мы наблюдаем, что команда
terraform apply
помогает нам предоставлять или обновлять инфраструктуру, команда
terraform destroy
помогает нам удалять всю ту инфраструктуру, которая представлена в имеющемся
файле состояния.
Мы не обсуждаем здесь подчинённые команды/ аргументы terraform destroy
, но вы можете обратиться за справкой
к вариантам использования подчинённых команд terraform apply
и, соответственно, когда вы планируете
воспользоваться terraform destroy
, просто замените terraform apply
на
terraform destroy
с идущими следом надлежащими подчинёнными командами.
Вы можете удивиться как мы можем удалять некую инфраструктуру не применяя команду terraform destroy
,
поэтому давайте рассмотрим как мы можем предпринимать такие действия. В своём разделе Применение
Terraform мы создали имя группы ресурса terraform-lab-rg
. Давайте попробуем удалить эту группу ресурсов
непосредственно при помощи команды terraform destroy
следующим образом:
PS C:\provider> terraform apply -var-file="testing.txt" -auto-approve
azurerm_resource_group.example: Creating...
azurerm_resource_group.example: Creation complete after 3s [id=/subscriptions/97c3799f-2753-40b7-a4bd-157ab464d8fe/resourceGroups/terraform-lab-rg]
В конце концов, мы исполним terraform plan
с флагом destroy
и сохраним вывод terraform plan
в delete.txt
(то есть, командой terraform plan -destroy -out delete.txt
), а затем будем следовать ему при помощи
terraform apply "delete.txt"
, как то иллюстрирует наш следующий фрагмент кода:
PS C:\provider> terraform plan -var-file="testing.txt" -destroy -out delete.txt
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.
azurerm_resource_group.example: Refreshing state... [id=/subscriptions/97c3799f-2753-40b7-a4bd-157ab464d8fe/resourceGroups/terraform-lab-rg]
------------------------------------------------------------------------
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
- destroy
Terraform will perform the following actions:
# azurerm_resource_group.example will be destroyed
- resource "azurerm_resource_group" "example" {
- id = "/subscriptions/97c3799f-2753-40b7-a4bd-157ab464d8fe/resourceGroups/terraform-lab-rg" -> null
- location = "eastus" -> null
- name = "terraform-lab-rg" -> null
- tags = {} -> null
}
------------------------------------------------------------------------
This plan was saved to: delete.txt
To perform exactly these actions, run the following command to apply:
terraform apply "delete.txt"
PS C:\provider> terraform apply "delete.txt"
azurerm_resource_group.example: Destroying... [id=/subscriptions/97c3799f-2753-40b7-a4bd-157ab464d8fe/resourceGroups/terraform-lab-rg]
azurerm_resource_group.example: Still destroying... [id=/subscriptions/97c3799f-2753-40b7-a4bd-...4d8fe/resourceGroups/terraform-lab-rg, 10s elapsed]
azurerm_resource_group.example: Destruction complete after 11s
Apply complete! Resources: 0 added, 0 changed, 1 destroyed.
Отсюда мы узнаём насколько просто мы можем удалять ресурсы при помощи последовательного terraform plan
и terraform apply
без использования terraform destroy
. Это
просто иной способ удаления ресурсов и вы можете применять его вместо команды terraform destroy
.
![]() | Замечание |
---|---|
Выполняйте По умолчанию Terraform перед исполнением операций Всякий раз когда вы исполняете команды рабочего процесса Terraform, такие как |
Очень важно понимать как мы можем применять Terrafom в любых инструментах CI/CD ( continuous integration/continuous deployment, непрерывной интеграции/ непрерывной разработки), так как вы знаете, что в наши дни DevOps востребован, причём почти 90 компаний применяют подход DevOps. Итак, чтобы разобраться с Terraform для инструментариея CI/CD, мы рассмотрим инструменты DevOps Azure.
Давайте попробуем понять как мы можем хранить свой код в Repo Azure и далее применять Конвейеры Azure для осуществления необходимого развёртывания своей инфраструктуры. В этом примере мы намерены воспользоваться облачной платформой Azure, но вы можете применять DevOps Azure и с прочими основными поставщиками, такими как GCP, AWS и тому подобными.
Взгляните на следующую схему, которая предоставляет обзор применения Terraform для рабочих процесов CI/CD:
Приводимые ниже этапы показывают вам как применять Службу DevOps Azure для развёртывания инфраструктуры в Azure при помощи Terraform:
-
Для выполнения данной демонстрации мы создали в DevOps Azure проект с названием,
terraform-lab-Project
, как это отображено далее на снимке экрана:
-
Наш следующий этап состоит в интеграции своего проекта DevOps Azure с Azure и для этого вам требуется проследовать в вариант Project Settings | Service connections, где вы будете способны перечислять возможные подключения, которые поддерживаются DevOps Azure. Здесь выбираем Azure Resource Manager, как это показано на приводимом далее снимке экрана:
После выбора варианта Azure Resource Manager, кликните по Next. Далее мы будем способны обнаружить множество вариантов построения интеграции DevOps Azure со своим порталом Azure, как это отображено на приводимом ниже снимке экрана. Мы намерены воспользоваться самым ппервым вариантом (рекомендуемым) для автоматического создания главной службы в Azure и получение надлежащего доступа с тем, чтобы имелась возможность внесения изменений в наши подписки Azure:
-
В своём следующем экране мы выбираем нашу подписку Azure и группу ресурсов, а также предоставляем название для этого подключения. В Azure мы уже создали группу ресурсов
Terraform-lab-rg
, а также подключениеTerraform-lab-connection
, как вы можете наблюдать на следующем снимке экрана. Вы можете пометить вариант Grant access permission to all pipelines с тем, чтобы у вас была возможность применять данное подключение со всеми конвейерами в данном проекте:
Теперь у нас есть все настройки с точки зрения интеграции DevOps Azure c Azure, поэтому давайте клонируем свой Repo Azure и добавим все свои файлы конфигурации в этот Repo Azure. Для осуществления этой задачи у вас должна иметься Git Bash или любая IDE (integrated development environment, интегрированная среда разработки), такая как VS Code (Visual Studio Code). Для изначальной настройки Git вам надлежит придерживаться https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup. Мы воспользуемся примером создания прикладного приложения web в Azure с применением DevOps Azure. Мы поддерживаем весь необходимый код Terraform и сборки конвейера в своём пакете GitHub для этой главы, который доступен из нашего раздела Технические требования. Мы поместили все файлы конфигурации Terraform и кода конвейера CI в Repo Azure, что отображено на приводимом ниже снимке экрана:
Теперь нам требуется создать некий конвейер CI, в котором мы воспользуемся файлом с названием Azure-pipeline.yaml
,
который уже был доставлен в наш Repo Azure. На следующем снимке экрана вы можете наблюдать этот конвейер CI, который был успешно запущен:
Что дальше нам следует делать для интеграции и своего конвейера CI? Ладно, теперь нам надлежит создать некий выпуск конвейера для представления своего прикладного приложения веб Azure. Итак, для создания такого выпуска конвейера нам требуется определить Artifact Azure. Затем мы устанавиваем значением типа источника Build, как это отображено на Рисунке 6-9:
В своём выпуске конвейера с названием этапа Terraform-IaC-Deployment-Pipeline
мы определили все необходимые
задачи, как это показано на снимке экрана внизу:
![]() | Замечание |
---|---|
Вы можете предоставлять некую инфраструктуру при помощи конвейера CI/build - нет никакой необходимости для выпуска конвейера. Здесь мы включили выпуск конвейера чтобы помочь вам разобраться с полным рабочим процессом CI/CD. |
Замечательно обнаружить что наш конвейер запущен успешно, что показано на следующем снимке экрана:
На приводимом далее снимке экрана мы можем наблюдать, что Terraform создал некую службу прикладного приложения веб Azure и план Службы Azure для
нас в имеющейся группе ресурсов Terraform-lab-rg
:
На основании этого раздела вам должно стать понятным как можно использовать при помощи Terraform инструменты CI/CD (то есть инструментарий DevOps Azure) для управления инфраструктурой (обновляемой и предоставляемой)в Облачном решении Azure. Совершенно аналогично вы должны обладать способностью применения этих навыков для развёртывания таких ресурсов как AWS и GCP.
Из всей этой главы вы получили развитие и понимание рабочих процессов Terraform, включая terraform init
,
terraform plan
, terraform validate
,
terraform apply
и terraform destroy
. Вы теперь должны быть
способны предоставлять или обновлять инфраструктуру в основных поставщиках облачных решений, таких как AWS,
Azure или GCP. Мы также обсудили как мы можем применять конвейеры
CI/CD (например, конвейер DevOps Azure) с применением Terraform для предоставления в Azure служб.
В своей следующей главе мы собираемся обсудить то, как мы можем писать модули Terraform для span class="emphasis">AWS, Azure или GCP и то, как они могут публиковаться и употрребляться.
Ответы на данные вопросы можно обнаружить в разделе Аттестация в самом конце этой книги:
-
Какое из следующих действий выполняется в процессе операции
terraform init
?-
Инициализируется выгрузка или устанавливаются поставщики
-
Выгружаются объявленные поставщики
-
Предоставляются определяемые ресурсы
-
Инициализируется конфигурация имеющейся серверной основы
-
-
Какую из следующих подчинённых команд вы можете применять для разблокирования файла состояния Terraform?
-
Что способна делать команда
terraform plan
?-
Предоставлять определяемые ресурсы
-
Выполнять инициализацию имеющейся серверной основы
-
Создавать некий план исполнения и определять какие изменения необходимо выполнить для достижения желательного состояния из файла конфигурации
-
Выполнять синтаксический контроль файла конфигурации Terraform
-
-
Вы определили следующий блок кода конфигурации:
resource "azurerm_resource_group" "example" { name = var.rgname location = "eastus" }
Каким из возможных способов Terraform способен получить значение переменной
rgname
?-
Через создание файла
terraform.tfvars
и помещения в негоrgname="Terraform-lab-rg"
-
Выполнив
terraform apply -var 'rgname=Terraform-lab-rg'
-
Выполнив
terraform plan
-
Выполнив
terraform apply -var-file="example.txt"
-
-
Вы получили некую ошибку подобную этой при исполнении команды
terraform apply
resource "azurerm_resource_group" "example" { name = "Terraform-lab-RG" location = "eastus" terraform_location = "eastus" } Error: Unsupported argument on resourcegroup.tf line 4, in resource "azurerm_resource_group" "example": 4: terraform_location = "eastus" An argument named "terraform_location" is not expected here.
Какую из команд вы можете выполнить для расширенной проверки такой ошибки?
-
terraform init
-
terraform validate
-
terraform plan
-
terraform apply
-
-
Ваша команда создала при помощи Terraform неую инфраструктуру AWS и теперь они хотят избавиться от этой инфраструктуры. Какая команда выполнит это?
-
terraform validate
-
terraform plan
-
terraform destroy
-
terraform init
-
Для получения дополнительных сведений по рассматривавшимся в этой главе темам вы можете обратиться к следующим ссылкам:
-
Сетевые протоколы для профессионалов безопасности, Йорам Орзач, Дипаншу Ханна, Packt Publishing, октябрь 2022
-
JavaScript для хакеров. Научитесь думать как хакер, Гарет Хейс, Leanpub, декабрь 2022
-
Как заниматься взломом словно легенда. Прорываемся в Windows, Спарк Флоу, No Starch Press, октябрь 2022
-
Управление оперативной памятью в реляционных системах баз данных, Педро Мехия Альварес, Марсело Леон Айяла, Сусана Ортега Сиснерос, Springer, август 2022
-
Атакующий код запуска оболочки с нуля, Ришалин Пиллэй, Packt Publishing, май 2022
-
Linux подсистема Windows (WSL) для профессионалов, Хайден Барнс, Apress, июнь 2021
-
Внутреннее устройство CPython, Энтони Шоу, Real Python, январь 2021
-
Контейнеры Linux и Виртуализация: с точки зрения ядра, Шашанк Мохан Джейн, Apress, октябрь 2020
-
Изучаем подсистемы Windows для Linux, Прэйтик Сингх, Apress, сентябрь 2020
-
Всё что требуется для RabbitMQ, 2е изд., Ловайса Йохансон, Дэйвид Доссо, Packt Publishing, август 2020
-
Практика загрузки. Изучение процесса загрузки Linux, Windows и Unix, Йогеш Бабар, Apress, июль 2020
-
Распределённые системы для практиков, Даймос Раптис, Leanpub, май 2020
-
Практическая автоматизация предприятия в Linux, Джеймс Фриман, Packt Publishing, январь 2020, Действенное выполнение крупномасштабной автоматизации инфраструктуры Linux с применением Ansible.
-
Внутреннее устройство баз данных, Алекс Петров, O`Reilly Media, Inc., октябрь 2019
-
Книга рецептов параллельного программирования Python. 2е изд., Джанкарло Закконе, Packt Publishing, сентябрь 2019
-
Полное руководство Ansible. 3е изд., Джеймс Фриман и Джесс Китинг, Packt Publishing, март 2019
-
Книга рецептов NGINX Дерек ДеДжонге, O’Reilly Media, Inc, ноябрь 2018
-
Полное руководство Ceph, 2е изд. Ник Фиск, Packt Publishing, февраль 2019
-
Docker для разработчиков Rails Роб Айзенберг, The Pragmatic Programmers, LLC., февраль 2019, с дополнениями по настройкам Django и 100Gb IB
-
Глава 11. SQL Server и контейнеры (включая Kubernetes) Боб Вордс, "Профессиональный SQL Server поверх Linux", Apress, октябрь 2018
-
Полное руководство параллельного программирования на Python Куан Нгуен, Packt Publishing, ноябрь 2018
-
Asyncio в Python 3 Цалеб Хаттингх, O’Reilly Media, Inc, март 2018
-
RabbitMQ для профессионалов Гайвин Рой, Manning Publications, сентябрь 2017
-
Proxmox. Полное руководство. 3е изд Васим Ахмед, Packt Publishing, ноябрь 2017
-
Книга рецептов Ceph, 2е изд Викхайят Умрао,Мишель Хаккет,Каран Сингх, Packt Publishing, ноябрь 2017
-
Изучаем Ceph, 2е изд., Энтони Д`Атри, Вайбхав Бхембре, Каран Сингх, Packt Publishing, октябрь 2017
-
Книга рецептов виртуализации KVM Константин Иванов, Packt Publishing, июнь 2017
-
Полное руководство работы с сетями на Python. Эрик Чоу, Июнь 2017
-
Контейнеризация при помощи LXC Константин Иванов, Packt Publishing, март 2017
-
Proxmox. Полное руководство. 2е изд., Васим Ахмед, Packt Publishing, май 2016
-
Книга рецептов Ceph Каран Сингх, Packt Publishing, февраль 2016
-
Полная виртуализация. Базовая коммерческая редакция: Proxmox-freeNAS-Zentyal-pfSense. Ли Р. Сюрбер, февраль 2016
-
Zabbix. Полное руководство. 2е изд., Андреа Далле Ваккье, сентябрь 2015
-
Книга рецептов Proxmox. Главы 1-6, Дополнения: Преобразование OpenVZ в LXC, Организация ограждения Васим Ахмед, Packt Publishing, август 2015
-
Изучаем Ceph Каран Сингх, Packt Publishing, январь 2015
Дополнительные ссылки:
Перевод: Copyright © 2016-2021 ![]() All rights reserved. Ссылки обязательны (Refs and links are obligatory). | http://www.mdl.ru портфолио SD DC |
HPE DL360 G10 since 4300$ |