Рубрики
Uncategorized

Террафом Часть I

Начало работы с террафором для автоматизации обеспечения облачной инфраструктуры.

Автор оригинала: Bolatito Kabir.

Введение в террафору

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

Инфраструктура как код

Инфраструктура описана с использованием синтаксиса конфигурации высокого уровня. Это позволяет версию и лечить план вашего DataCenter вашего DataCenter. Кроме того, инфраструктура может быть разделена и повторно использована.

Планы исполнения

У террафора есть шаг «планирования», где он генерирует план выполнения. План выполнения показывает, что сделает террафору, когда вы призываете применять. Это позволяет избежать каких-либо сюрпризов, когда террафом манипулирует инфраструктуру.

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.

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

График ресурсов

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

Функции

Использование переменных ресурсов Импорт инфраструктуры состояния инфраструктуры инфраструктуры диаграммы инфраструктуры на основе состояния пользовательских выходных переменных Сравнение инфраструктуры в качестве интерполяции инструментов кода

Далее: Развертывание инфраструктуры с использованием террафора. Шаги: Настройте учетную запись AWS Установите террафом Прикрепите учетные данные AWS Разверните один экземпляр AWS Развернуть несколько экземпляров Прикрепите упругий адрес для всех развернутых экземпляров

Настройка AWS Account

Войдите в свою учетную запись AWS, перейдите на свою консоль IAM, перейдите к «пользователям», нажмите «Добавить пользователя», чтобы создать ключ доступа и секретный ключ. Под Тип доступа Проверить Программный доступ Нажмите кнопку «Создать пользователя» на последнем шаге, и вы сможете увидеть учетные данные безопасности для этого пользователя, состоюми от идентификатора ключей доступа и ключа секретного доступа. Вы должны сразу сохранить эти ключи, так как ключ секретного доступа никогда не будет отображаться снова. Для того чтобы 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 будет работать. Последний шаг состоит в том, чтобы убедиться, что двоичный бинасор террафора доступен на пути. См. Эта страница для инструкции по установке пути на Linux и Mac. Эта страница содержит инструкции для настройки пути в Windows. Простая установка: Linux Скачать террафом для Linux

$ wget https://releases.hashicorp.com/terraform/0.xx.x/terraform_0.xx.x_linux_amd64.zip
$ unzip terraform_0.xx.x_linux_amd64.zip

Установить путь $ sudo mv Terraform/usr/local/bin Mac Использование Brew Установка — это самый быстрый путь Brew Unit Terraporm. Если у вас нет дома, установите его.

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null

Установите Ruby Brew Установить террафом Окно — Скачать террафом для Windows

Примечание. Террафор упакован в качестве архива ZIP, поэтому после загрузки террафора, расстегнув пакет. Террафору бежит как один двоичный по имени террафора. Любые другие файлы в пакете могут быть безопасно удалены, а Terraform все еще функционирует Скопируйте файлы из ZIP на C: \ Terraform Например. Это наш путь террафора. Последний шаг состоит в том, чтобы убедиться, что двоичный бинасор террафора доступен на пути. Установите путь в вашей системной утилите на панели управления.

Проверка установки После установки Terraform убедитесь, что установка, работающая, открывая новую сеанс терминала и проверяя, что Terraform доступен. Выполняя Terraform, вы должны увидеть вывод справки, аналогичный этому:

$ terraform
Usage: terraform [--version] [--help]  [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
# ...

Если вы получите ошибку, которую не найден террафом, ваша переменная среды пути не была правильно настроена. Пожалуйста, вернитесь обратно и убедитесь, что ваша переменная пути содержит каталог, где был установлен Terraporm.

Развертывание сервера

Терраформ код написан на языке под названием HCL В файлах с расширением .tf. . Это декларативный язык. Таким образом, главная цель будет описывать инфраструктуру, которую мы хотим, а Terraform создаст это. Во-первых, мы должны настроить облачный провайдер, который мы хотим использовать. Создайте файл под названием Resources.tf и добавьте следующий код в нем:

provider "aws" {
  region = "us-east-1"
}

Это поручает террафору облачного проверу, которую вы будете использовать, в этом случае это AWS И что вы хотите развернуть свою инфраструктуру в США-Восток-1 область. Если вы уже настроили свои учетные данные в качестве переменных среды, вам нужно только указать регион. Однако, если вы не настроили свои кредиты в качестве переменной среды, приведенные ниже работы. I.e Это указывает местонахождение ваших учетных данных AWS/Config

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 Отказ Для этого нам нужно указать блок ресурсов и SE конфигурацию блока ресурсов. я нам нужно установить AMI (изображение Amazon Machine для работы на экземпляре EC2) и induction_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:                           
      ami:                          "ami-2d39803a"
      arn:                          
      associate_public_ip_address:  
      availability_zone:            
      cpu_core_count:               
      cpu_threads_per_core:         
      ebs_block_device.#:           
      ephemeral_block_device.#:     
      get_password_data:            "false"
      host_id:                      
      instance_state:               
      instance_type:                "t2.micro"
      ipv6_address_count:           
      ipv6_addresses.#:             
      key_name:                     
      network_interface.#:          
      network_interface_id:         
      password_data:                
      placement_group:              
      primary_network_interface_id: 
      private_dns:                  
      private_ip:                   
      public_dns:                   
      public_ip:                    
      root_block_device.#:          
      security_groups.#:            
      source_dest_check:            "true"
      subnet_id:                    
      tenancy:                      
      volume_tags.%:                
      vpc_security_group_ids.#:     


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.

Примечание. Ресурсы с плюс знаком + Будет создан, ресурсы с минусным знаком - Будут удалены, а ресурсы с табличкой Tilde ~ будет модифицирован. Чтобы создать экземпляр, применить Terraporm. Обойти Да Оперативное использование террафора применимо -Ато-одобрение.

$ terraform apply -auto-approve
aws_instance.server: Creating...
  ami:                          "" => "ami-2d39803a"
  arn:                          "" => ""
  associate_public_ip_address:  "" => ""
  availability_zone:            "" => ""
  cpu_core_count:               "" => ""
  cpu_threads_per_core:         "" => ""
  ebs_block_device.#:           "" => ""
  ephemeral_block_device.#:     "" => ""
  get_password_data:            "" => "false"
  host_id:                      "" => ""
  instance_state:               "" => ""
  instance_type:                "" => "t2.micro"
  ipv6_address_count:           "" => ""
  ipv6_addresses.#:             "" => ""
  key_name:                     "" => ""
  network_interface.#:          "" => ""
  network_interface_id:         "" => ""
  password_data:                "" => ""
  placement_group:              "" => ""
  primary_network_interface_id: "" => ""
  private_dns:                  "" => ""
  private_ip:                   "" => ""
  public_dns:                   "" => ""
  public_ip:                    "" => ""
  root_block_device.#:          "" => ""
  security_groups.#:            "" => ""
  source_dest_check:            "" => "true"
  subnet_id:                    "" => ""
  tenancy:                      "" => ""
  volume_tags.%:                "" => ""
  vpc_security_group_ids.#:     "" => ""
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.

Примечание. Для предоставления экземпляра EC2 потребовалось 36S для предоставления экземпляра 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": []
        }
    ]
}

Развертывание сервера завершено с использованием террафора! Чтобы проверить, войдите в консоль EC2, и вы увидите что-то подобное:

Снятый экран 2019-07-04 в 8.36.27 PM.PNG

Уведомление, выход ID EC2-экземпляра I-0BF984BEF5FF354D6 Соответствует идентификатору экземпляра на консоли AWS. Теперь давайте изменим наш экземпляр EC2, предоставив имя для нашего экземпляра EC2, мы знаем, что имя настроено из тега, поэтому мы добавим раздел тега на наш код Terraform для ресурса 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 Параметр, чтобы сохранить этот план, поэтому террафом не может гарантировать, что именно эти действия будут выполнены, если Террафом применяется впоследствии работает. Поскольку террафом отслеживает все ресурсы, которые он создал, поэтому он знает, что экземпляр 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.

Для террафора потребовалось 3, чтобы применить это изменение в экземпляра EC2. Полное видео https://bolatito.s3.amazonaws.com/terraformvideo1.mov.

meegif.gif.gif.

Исходный код: https://github.com/iamtito/DevOps/tree/Terraform/Terraform/example1

Это все фольклор. Не стесняйтесь указывать на любую опечачу, сделать некоторые исправления и внести свой вклад в этот пост или отправить PR

Следующий : Развертывание нескольких разных экземпляров

Оригинал: «https://www.codementor.io/@bolatitokabir/terraform-part-i-tnwwer5n4»