Терраформ Часть I | Кодементор
Введение в Терраформ
Terraform — это инструмент для безопасного и эффективного создания, изменения и управления версиями инфраструктуры. Terraform может управлять существующими и популярными поставщиками услуг, а также собственными решениями. Управление существующими ресурсами на aws потребует импорта ресурсов в Terraform и управления ими с помощью Terraform, что позволит создавать вокруг него другие ресурсы.
Инфраструктура как код
Инфраструктура описывается с использованием высокоуровневого синтаксиса конфигурации. Это позволяет управлять версиями плана вашего центра обработки данных и обрабатывать его так же, как и любой другой код. Кроме того, инфраструктуру можно совместно использовать и использовать повторно.
Планы выполнения
В Terraform есть этап «планирования», на котором создается план выполнения. План выполнения показывает, что будет делать Terraform, когда вы вызовете команду apply. Это позволяет избежать неожиданностей, когда Terraform манипулирует инфраструктурой.
terraform plan
+ aws_instance.example.11 ami: "ami-v1" instance_type: "t2.micro"
+ aws_instance.example.12 ami: "ami-v1" instance_type: "t2.micro"
+ aws_instance.example.13 ami: "ami-v1" instance_type: "t2.micro"
+ aws_instance.example.14 ami: "ami-v1" instance_type: "t2.micro"
+ aws_instance.example.15 ami: "ami-v1" instance_type: "t2.micro"
Plan: 5 to add, 0 to change, 0 to destroy.
Выше показано, что будет добавлено до внесения изменений в инфраструктуру.
График ресурсов
Terraform строит график всех ваших ресурсов и распараллеливает создание и модификацию любых независимых ресурсов. Благодаря этому Terraform максимально эффективно строит инфраструктуру, а операторы получают представление о зависимостях в своей инфраструктуре.
График также можно использовать для устранения неполадок,
Автоматизация изменений
Сложные наборы изменений можно применять к вашей инфраструктуре с минимальным участием человека. С ранее упомянутым планом выполнения и графом ресурсов вы точно знаете, что Terraform изменит и в каком порядке, избегая многих возможных человеческих ошибок.
Функции
Использование переменных
импорт ресурсов
файл состояния инфраструктуры
генератор диаграмм инфраструктуры на основе состояния
пользовательские выходные переменные
Сравнение инструментов инфраструктуры как кода
интерполяция
Следующий: Развертывание инфраструктуры с помощью terraform.
Шаги:
Настройте свою учетную запись AWS
Установить Терраформ
Прикрепить учетные данные aws
Разверните один экземпляр aws
Развернуть несколько экземпляров
Прикрепите эластичный адрес ко всем развернутым экземплярам
Настройка учетной записи AWS
Войдите в свою учетную запись aws, перейдите в консоль IAM, перейдите в раздел «Пользователи», нажмите «Добавить пользователя», чтобы сгенерировать ключ доступа и секретный ключ. тип доступаПроверьте Programmatic access
, Нажмите кнопку «Создать пользователя» на последнем шаге, и вы сможете увидеть учетные данные безопасности для этого пользователя, которые состоят из идентификатора ключа доступа и секретного ключа доступа. Вы должны немедленно сохранить эти ключи, так как секретный ключ доступа больше никогда не будет показан.
Чтобы terraform мог вносить изменения в нашу инфраструктуру aws, нам нужно установить учетные данные AWS для пользователя. На вашем терминале:
export AWS_ACCESS_KEY_ID=(your access key id)
export AWS_SECRET_ACCESS_KEY=(your secret access key)
$ env |grep AWS
AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXXXXX
AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXX
Установить Терраформ
Чтобы установить Terraform, найдите соответствующий пакет для вашей системы и загрузите его. После загрузки разархивируйте пакет. Terraform работает как единый двоичный файл с именем terraform. Любые другие файлы в пакете можно безопасно удалить, и Terraform по-прежнему будет работать.
Последний шаг — убедиться, что двоичный файл terraform доступен в PATH. На этой странице приведены инструкции по установке PATH в Linux и Mac. Эта страница содержит инструкции по установке PATH в Windows.
Простая установка:
линукс
Скачать терраформ для Linux
$ wget
$ unzip terraform_0.xx.x_linux_amd64.zip
установить путь $ sudo mv terraform /usr/local/bin
Мак
Использование brew install — это самый быстрый способ brew install terraform. Если у вас нет homebre, установите его.
ruby -e "$(curl -fsSL < /dev/null 2> /dev/null
установить рубинbrew install terraform
Окно
— Скачать терраформ для виндовс
Примечание. Terraform упакован в виде zip-архива, поэтому после загрузки Terraform распакуйте пакет. Terraform работает как единый двоичный файл с именем terraform. Любые другие файлы в пакете можно безопасно удалить, и Terraform по-прежнему будет работать.
Скопируйте файлы из zip в c:\terraform
Например. Это наш путь терраформирования.
Последний шаг — убедиться, что двоичный файл terraform доступен в PATH.
Укажите путь в системной утилите в панели управления.
Проверка установки
После установки Terraform убедитесь, что установка работает, открыв новый сеанс терминала и проверив, что terraform доступен. Выполнив terraform, вы должны увидеть вывод справки, похожий на этот:
$ terraform
Usage: terraform [--version] [--help] <command> [args]
The available commands for execution are listed below.
The most common, useful commands are shown first, followed by
less common or more advanced commands. If you're just getting
started with Terraform, stick with the common commands. For the
other commands, please read the help and docs before usage.
Common commands:
apply Builds or changes infrastructure
console Interactive console for Terraform interpolations
# ...
Если вы получаете сообщение об ошибке, что terraform не может быть найден, ваша переменная среды PATH не была настроена должным образом. Вернитесь назад и убедитесь, что ваша переменная PATH содержит каталог, в котором был установлен Terraform.
Развертывание сервера
Код Terraform написан на языке под названием HCL в файлах с расширением .tf
. Это декларативный язык. Так что главная цель будет заключаться в том, чтобы описать нужную нам инфраструктуру, а Terraform ее создаст. Во-первых, нам нужно настроить облачных провайдеров, которых мы хотим использовать. Создайте файл с именем resources.tf
и добавьте в него следующий код:
provider "aws" {
region = "us-east-1"
}
Это указывает Terraform на облачный прувер, который вы будете использовать, в данном случае это aws
и что вы хотите развернуть свою инфраструктуру в us-east-1
область, край. Если вы уже настроили свои учетные данные в качестве переменных среды, вам нужно указать только регион. Однако, если вы не настроили свои кредиты как переменную среды, ниже работает. то есть он указывает местоположение ваших учетных данных/конфигурации aws
provider "aws" {
region = "us-east-1"
shared_credentials_file = "/PATH/TO/AWS/CONFIG"
profile = "myAWSprofile"
}
После обновления выполните приведенную ниже команду, чтобы инициализировать проект:
$ terraform init
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.
Теперь мы хотим развернуть экземпляр ec2 типа t2.micro
. Для этого нам нужно указать ресурсный блок и настроить конфигурацию ресурсного блока. т.е. нам нужно установить ami
(образ машины Amazon для запуска на инстансе EC2) и instance_type
. Добавьте следующий код в resources.tf
resource "aws_instance" "server" {
ami = "ami-2d39803a"
instance_type = "t2.micro"
}
Чтобы идентифицировать ресурс в коде терраформирования, ресурс указывает тип (в данном случае aws_instance
), имя (в данном случае server
) и набор параметров конфигурации, специфичных для ресурса. Блок ресурсов описывает один или несколько объектов инфраструктуры, таких как виртуальные сети, вычислительные экземпляры или компоненты более высокого уровня, такие как записи DNS. Проверьте ресурсная документация.
Чтобы создать ресурс, рекомендуется просмотреть ресурсы, которые будут созданы, прежде чем они будут созданы… используйте приведенный ниже код, чтобы увидеть, что произойдет с вашей инфраструктурой, прежде чем применять/развертывать его. Это способ запустить проверку работоспособности ваших изменений перед их развертыванием/применением.
$ 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:
+ aws_instance.server
id: <computed>
ami: "ami-2d39803a"
arn: <computed>
associate_public_ip_address: <computed>
availability_zone: <computed>
cpu_core_count: <computed>
cpu_threads_per_core: <computed>
ebs_block_device.#: <computed>
ephemeral_block_device.#: <computed>
get_password_data: "false"
host_id: <computed>
instance_state: <computed>
instance_type: "t2.micro"
ipv6_address_count: <computed>
ipv6_addresses.#: <computed>
key_name: <computed>
network_interface.#: <computed>
network_interface_id: <computed>
password_data: <computed>
placement_group: <computed>
primary_network_interface_id: <computed>
private_dns: <computed>
private_ip: <computed>
public_dns: <computed>
public_ip: <computed>
root_block_device.#: <computed>
security_groups.#: <computed>
source_dest_check: "true"
subnet_id: <computed>
tenancy: <computed>
volume_tags.%: <computed>
vpc_security_group_ids.#: <computed>
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 apply. Чтобы обойти yes
быстрое использование terraform apply -auto-approve.
$ terraform apply -auto-approve
aws_instance.server: Creating...
ami: "" => "ami-2d39803a"
arn: "" => "<computed>"
associate_public_ip_address: "" => "<computed>"
availability_zone: "" => "<computed>"
cpu_core_count: "" => "<computed>"
cpu_threads_per_core: "" => "<computed>"
ebs_block_device.#: "" => "<computed>"
ephemeral_block_device.#: "" => "<computed>"
get_password_data: "" => "false"
host_id: "" => "<computed>"
instance_state: "" => "<computed>"
instance_type: "" => "t2.micro"
ipv6_address_count: "" => "<computed>"
ipv6_addresses.#: "" => "<computed>"
key_name: "" => "<computed>"
network_interface.#: "" => "<computed>"
network_interface_id: "" => "<computed>"
password_data: "" => "<computed>"
placement_group: "" => "<computed>"
primary_network_interface_id: "" => "<computed>"
private_dns: "" => "<computed>"
private_ip: "" => "<computed>"
public_dns: "" => "<computed>"
public_ip: "" => "<computed>"
root_block_device.#: "" => "<computed>"
security_groups.#: "" => "<computed>"
source_dest_check: "" => "true"
subnet_id: "" => "<computed>"
tenancy: "" => "<computed>"
volume_tags.%: "" => "<computed>"
vpc_security_group_ids.#: "" => "<computed>"
aws_instance.server: Still creating... (10s elapsed)
aws_instance.server: Still creating... (20s elapsed)
aws_instance.server: Still creating... (30s elapsed)
aws_instance.server: Creation complete after 36s (ID: i-0bf984bef5ff354d6)
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Примечание. Terraform потребовалось 36 секунд для предоставления экземпляра ec2 в aws, вручную это может занять не менее 2 минут. Другой файл terraform.tfstate
будет создан файл, содержащий состояние и всю информацию, относящуюся к экземпляру ec2. В настоящее время он сохраняется локально, в следующей главе мы будем автоматически сохранять файл в защищенной корзине s3 по соображениям безопасности.
{
"version": 3,
"terraform_version": "0.11.11",
"serial": 1,
"lineage": "c2d70ed5-xxxxx-xxxx-xxxx-xxxxxxxx",
"modules": [
{
"path": [
"root"
],
"outputs": {},
"resources": {
"aws_instance.server": {
"type": "aws_instance",
"depends_on": [],
"primary": {
"id": "i-0bf984bef5ff354d6",
"attributes": {
"ami": "ami-2d39803a",
"arn": "arn:aws:ec2:us-east-1:139912354378:instance/i-0bf984bef5ff354d6",
"associate_public_ip_address": "true",
"availability_zone": "us-east-1c",
"cpu_core_count": "1",
"cpu_threads_per_core": "1",
"credit_specification.#": "1",
"credit_specification.0.cpu_credits": "standard",
"disable_api_termination": "false",
"ebs_block_device.#": "0",
"ebs_optimized": "false",
"ephemeral_block_device.#": "0",
"get_password_data": "false",
"iam_instance_profile": "",
"id": "i-0bf984bef5ff354d6",
"instance_state": "running",
"instance_type": "t2.micro",
"ipv6_addresses.#": "0",
"key_name": "",
"monitoring": "false",
"network_interface.#": "0",
"network_interface_id": "eni-0372xxxxxx",
"password_data": "",
"placement_group": "",
"primary_network_interface_id": "eni-0372xxxxxxx",
"private_dns": "ip-172-31-53-112.ec2.internal",
"private_ip": "172.31.53.112",
"public_dns": "ec2-52-91-71-43.compute-1.amazonaws.com",
"public_ip": "52.91.71.43",
"root_block_device.#": "1",
"root_block_device.0.delete_on_termination": "true",
"root_block_device.0.iops": "100",
"root_block_device.0.volume_id": "vol-0394832bb747e9bf1",
"root_block_device.0.volume_size": "8",
"root_block_device.0.volume_type": "gp2",
"security_groups.#": "1",
"security_groups.xxxx": "default",
"source_dest_check": "true",
"subnet_id": "subnet-xxxxxxx",
"tags.%": "0",
"tenancy": "default",
"volume_tags.%": "0",
"vpc_security_group_ids.#": "1",
"vpc_security_group_ids.xxxxx": "sg-xxxxxxxx"
},
"meta": {
"e2bfb730-xxxx-xxxx-xxx-xxxxxxx": {
"create": 600000000000,
"delete": 1200000000000,
"update": 600000000000
},
"schema_version": "1"
},
"tainted": false
},
"deposed": [],
"provider": "provider.aws"
}
},
"depends_on": []
}
]
}
Развертывание сервера завершено с помощью Terraform! Чтобы проверить, войдите в консоль EC2, и вы увидите что-то вроде этого:
Обратите внимание, вывод идентификатора экземпляра ec2 i-0bf984bef5ff354d6
соответствует идентификатору экземпляра в консоли aws. Теперь давайте изменим наш экземпляр ec2, дав имя для нашего экземпляра ec2, мы знаем, что имя настроено из тега, поэтому мы добавим раздел тега в наш код терраформирования для ресурса ec2.
Обновить существующий экземпляр ec2
Обновите файл resources.tf, добавив теги вещей.
provider "aws" {
region = "us-east-1"
shared_credentials_file = "/PATH/TO/AWS/CONFIG"
profile = "myAWSprofile"
}
resource "aws_instance" "server" {
ami = "ami-2d39803a"
instance_type = "t2.micro"
tags {
Name = "server-one"
Environment = "Production"
App = "ecommerce"
}
}
Запустите план для предварительного просмотра
$ 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.
aws_instance.server: Refreshing state... (ID: i-0bf984bef5ff354d6)
------------------------------------------------------------------------
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
~ update in-place
Terraform will perform the following actions:
~ aws_instance.server
tags.%: "0" => "3"
tags.App: "" => "ecommerce"
tags.Environment: "" => "Production"
tags.Name: "" => "server-one"
Plan: 0 to add, 1 to change, 0 to destroy.
------------------------------------------------------------------------
Примечание. Вы не указали -out
параметр для сохранения этого плана, поэтому Terraform
не может гарантировать, что именно эти действия будут выполнены, еслиterraform apply
впоследствии запускается.
Поскольку terraform отслеживает все созданные им ресурсы, он знает, что экземпляр ec2 уже существует. id
для развернутого экземпляра ec2 i-0bf984bef5ff354d6
то он показывает разницу между текущим и новым предполагаемым изменением, обозначаемым знаком ~
. Примените изменение и проверьте на консоли.
$ terraform apply -auto-approve
aws_instance.server: Refreshing state... (ID: i-0bf984bef5ff354d6)
aws_instance.server: Modifying... (ID: i-0bf984bef5ff354d6)
tags.%: "0" => "3"
tags.App: "" => "ecommerce"
tags.Environment: "" => "Production"
tags.Name: "" => "server-one"
aws_instance.server: Modifications complete after 3s (ID: i-0bf984bef5ff354d6)
Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
Terraform потребовалось 3 секунды, чтобы применить это изменение к экземпляру ec2.
Полное видео
Исходный код:
Это все фольклор. Не стесняйтесь указать на любую опечатку, внести некоторые исправления и внести свой вклад в этот пост или отправить PR
СЛЕДУЮЩИЙ: Развертывание нескольких разных экземпляров