Как управлять облачной инфраструктурой с помощью Terraform

    В этой статье мы рассмотрим из чего состоит Terraform, а также поэтапно запустим собственную инфраструктуру в облаке с VMware — подготовим три VM для разных целей: прокси, файловое хранилище и CMS.

    Обо всем подробно и в три этапа:

    1. Terraform — описание, преимущества и составляющие

    Terraform — это  IaC (Infrastructure-as-Code) инструмент для построения и управления виртуальной инфраструктурой с помощью кода .

    В работе с инструментом мы отметили несколько преимуществ:

    • Скорость развертывания новых тенантов (пользовательских виртуальных сред). Обычно, чем больше новых клиентов, тем больше "кликов" требуется сделать сотрудникам технической поддержки для публикации новых ресурсов. С Terraform пользователи могут изменять параметры виртуальных машин (например, автоматически выключать ОС и увеличивать раздел виртуального диска ) без участия технической поддержки и выключения самой машины.

    • Моментальная проверка плана активации нового теннанта. С помощью описания кода инфраструктуры мы можем сразу же проверить, что и в каком порядке будет добавлено, а также в каком конечном состоянии будет та или иная виртуальная машина или виртуальная сеть с подключениями к виртуальным машинам.

    • Возможность описывать большинство популярных облачных платформ. Вы можете использовать инструмент от Amazon и Google Cloud, до частных платформ на базе VMware vCloud Director, предлагающих услуги в рамках IaaS, SaaS и PaaS решений.

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

    • Удобное использование для создания демо-стендов под тестирование и отладку программного обеспечения. Вы можете создавать и передавать стенды для отдела тестирования, параллельно проверять ПО в разных средах, а также моментально изменять и удалять ресурсы, создав всего лишь один план построения ресурсов

    "Террариум" Terraform

    Кратко рассказали про преимущества инструмента, теперь разберем его на составляющие

    Providers (провайдеры). 

    В Terraform практически любой тип инфраструктуры  можно представить в качестве ресурса. Связь между ресурсами и платформой API обеспечивается providers модулями, которые позволяют создавать ресурсы в рамках определённой платформы, например, Azure или VMware vCloud Director.

    В рамках проекта вы можете взаимодействовать с разными провайдерами на разных платформах.

    Resources (описание ресурсов).

    Описание ресурсов позволяет управлять компонентами платформы, например виртуальными машинами или сетями. 

    Вы можете самостоятельно создать описание ресурсов для провайдера VMware vCloud Director и использовать это описание для создания ресурсов у любого хостинг-провайдера, который использует vCloud Director.  Вам потребуется лишь заменить параметры аутентификации и параметры сетевого подключения к необходимому хостинг-провайдеру

    Provisioners.

    Эта составляющая дает возможность выполнять операции по первоначальной установке и обслуживанию операционной системы после создания виртуальных машин. После того, как вы создали ресурс виртуальной машины, с помощью provisioners вы можете настроить и подключиться по SSH, выполнить обновление операционной системы, а также загрузить и выполнить скрипт. 

    Переменные Input и Output.

    Input переменные —  входные переменные для любых типов блоков. 

    Output переменные позволяют сохранить значения после создания ресурсов и могут быть использованы, как входные переменные в других модулях, например в блоке Provisioners.

    States (состояния).

    States-файлы хранят информацию о конфигурации ресурсов платформы провайдера. При первом создании платформы никаких сведений о ресурсах нет и перед любой операцией Terraform обновляет состояние с реальной инфраструктурой уже описанных ресурсов.

    Основная цель состояний, это сохранение связки объектов уже созданных ресурсов для сравнение конфигурации добавляемых ресурсов и объектов, чтобы избежать повторного создания и изменений платформы.

    Информация о состоянии по умолчанию хранится в локальном файле  terraform.tfstate, но при необходимости есть возможность использовать удаленное хранение для работы в команде.

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

    2. Создание инфраструктуры

    Составляющие разобрали, теперь с помощью Terraform мы поэтапно создадим инфраструктуру с тремя виртуальными машинами. Первая с установленным прокси-сервером nginx, вторая с файловым хранилищем на базе Nextcloud и третья с CMS Bitrix.

    Писать код и исполнять его мы будем на примере нашего облака на VMware vCloud Director. У нас пользователи получают учётную запись правами Organization Administrator, если вы используете учетную запись с теми же правами в другом облаке VMware, то сможете воспроизвести код из наших примеров. Поехали!

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

    mkdir project01

    Затем опишем компоненты инфраструктуры. Terraform создаёт связи и обрабатывает файлы на основании описания в файлах. Сами файлы можно именовать исходя из целевого назначения описываемых блоков, например, network.tf - описывает сетевые параметры для инфраструктуры.

    Для описания компонентов нашей инфраструктуры, мы создали следующие файлы:

    Список файлов.

    main.tf - описание параметров для виртуальной среды - виртуальные машины, виртуальные контейнеры;

    network.tf - описание параметров виртуальной сети и правил NAT, Firewall;

    variables.tf - список переменных, которые используем;

    vcd.tfvars - значения переменных проекта для модуля VMware vCloud Director.

    Язык конфигурации в Terraform является декларативным и порядок блоков не имеет значения, кроме блоков provisioner, т.к. в этом блоке мы описываем команды для выполнения при подготовке инфраструктуры и они будут выполнятся по порядку.

    Структура блоков.

    <BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>" {

    # Block body

    <IDENTIFIER> = <EXPRESSION> # Argument

    }

    Для описания блоков используется собственный язык программирования HCL (HashiCorp Configuration Language), возможно описывать инфраструктуру и с помощью JSON. Подробнее о синтаксисе можно прочитать на сайте разработчика.

    Конфигурация переменной окружения, variables.tf и vcd.tfvars

    Сначала создадим два файла, которые описывают список всех  используемых переменных и их значений для модуля VMware vCloud Director. Первым создадим файл variables.tf.

    Cодержимое файла variables.tf.

    variable "vcd_org_user" {

      description = "vCD Tenant User"

    }

    variable "vcd_org_password" {

      description = "vCD Tenant Password"

    }

    variable "vcd_org" {

      description = "vCD Tenant Org"

    }

    variable "vcd_org_vdc" {

      description = "vCD Tenant VDC"

    }

    variable "vcd_org_url" {

      description = "vCD Tenant URL"

    }

    variable "vcd_org_max_retry_timeout" {

      default = "60"

    }

    variable "vcd_org_allow_unverified_ssl" {

      default = "true"

    }

    variable "vcd_org_edge_name" {

      description = "vCD edge name"

    }

    variable "vcd_org_catalog" {

      description = "vCD public catalog"

    }

    variable "vcd_template_os_centos7" {

      description = "OS CentOS 7"

      default = "CentOS7"

    }

    variable "vcd_org_ssd_sp" {

      description = "Storage Policies"

      default = "Gold Storage Policy"

    }

    variable "vcd_org_hdd_sp" {

      description = "Storage Policies"

      default = "Bronze Storage Policy"

    }

    variable "vcd_edge_local_subnet" {

      description = "Organization Network Subnet"

    }

    variable "vcd_edge_external_ip" {

      description = "External public IP"

    }

    variable "vcd_edge_local_ip_nginx" {}

    variable "vcd_edge_local_ip_bitrix" {}

    variable "vcd_edge_local_ip_nextcloud" {}

    variable "vcd_edge_external_network" {}

    Значения переменных, которые мы получаем от провайдера.
    • vcd_org_user - имя пользователя с правами Organization Administrator,

    • vcd_org_password - пароль пользователя,

    • vcd_org - название организации,

    • vcd_org_vdc - название виртуального дата-центра,

    • vcd_org_url - API URL,

    • vcd_org_edge_name - название виртуального маршрутизатора,

    • vcd_org_catalog - название каталога с шаблонами виртуальных машин,

    • vcd_edge_external_ip - публичный IP-адрес,

    • vcd_edge_external_network - название внешней сети,

    • vcd_org_hdd_sp - название политики хранения HDD,

    • vcd_org_ssd_sp - название политики хранения SSD.

    И вводим свои переменные:

    • vcd_edge_local_ip_nginx - IP-адрес виртуальной машины с NGINX,

    • vcd_edge_local_ip_bitrix - IP-адрес виртуальной машины с 1С: Битрикс,

    • vcd_edge_local_ip_nextcloud - IP-адрес виртуальной машины с Nextcloud.

    Вторым файлом создаем и указываем переменные для модуля VMware vCloud Director в файле vcd.tfvars: Напомним, что в нашем примере мы используем собственное облако mClouds, если вы работаете с другим провайдером уточните значения у него. 

    Содержимое файла vcd.tfvars.

    vcd_org_url = "https://vcloud.mclouds.ru/api"

    vcd_org_user = "orgadmin"

    vcd_org_password = "*"

    vcd = "org"

    vcd_org_vdc = "orgvdc"

    vcd_org_maxretry_timeout = 60

    vcd_org_allow_unverified_ssl = true

    vcd_org_catalog = "Templates"

    vcd_templateos_centos7 = "CentOS7"

    vcd_org_ssd_sp = "Gold Storage Policy"

    vcd_org_hdd_sp = "Bronze Storage Policy"

    vcd_org_edge_name = "MCLOUDS-EDGE"

    vcd_edge_external_ip = "185.17.66.1"

    vcd_edge_local_subnet = "192.168.110.0/24"

    vcd_edge_local_ip_nginx = "192.168.110.1"

    vcd_edge_local_ip_bitrix = "192.168.110.10"

    vcd_edge_local_ip_nextcloud = "192.168.110.11"

    vcd_edge_external_network = "NET-185-17-66-0"

    Сетевая конфигурация, network.tf.

    Переменные окружения заданы, теперь настроим схему подключения виртуальных машин —  к каждой виртуальной машине назначим приватный IP-адрес и с помощью Destination NAT "пробрасываем" порты во внешнюю сеть. Для ограничения доступа к портам управления установим доступ только для нашего IP-адреса.

    Схема сети для создаваемой Terraform платформы
    Схема сети для создаваемой Terraform платформы

    Создаем виртуальную организационную сеть с названием net_lan01, шлюзом по умолчанию: 192.168.110.254, а также  с адресным пространством: 192.168.110.0/24.

    Описываем виртуальную сеть.

    resource "vcd_network_routed" "net" {

      name = "net_lan01"

      edge_gateway = var.vcd_org_edge_name

      gateway = "192.168.110.254"

      dns1 = "1.1.1.1"

      dns2 = "8.8.8.8"

     static_ip_pool {

    start_address = "192.168.110.1"

    end_address = "192.168.110.253"

      }

    }

    Создадим правила для межсетевого экрана, которое позволяет предоставить виртуальным машинам доступ в сеть Интернет. В рамках этого блока все виртуальные ресурсы в облаке будут иметь доступ в сеть Интернет:

    Описываем правила для доступа VM в интернет.

    resource "vcd_nsxv_firewall_rule" "fw_internet_access" {

      edge_gateway   = var.vcdorgedgename

      name = "Internet Access"

      source {

    gateway_interfaces = ["internal"]

      }

      destination {

    gateway_interfaces = ["external"]

      }

      service {

    protocol = "any"

      }

      depends_on = [vcdnetworkrouted.net]

    }

    Установив зависимость, что после обработки блока vcdnetworkrouted.net мы приступаем к конфигурации блока vcdnsxvfirewallrule, с помощью dependson. Используем эту опцию, так как некоторые зависимости могут быть распознаны неявно в конфигурации.

    Далее создадим правила разрешающее доступ к портам из внешней сети и указываем наш IP-адрес для подключения по SSH к серверам. Любой пользователь сети Интернет имеет доступ к портам 80 и 443 на веб-сервере и пользователь с IP-адресом 90.1.15.1 имеет доступ к портам SSH виртуальных серверов.

    Разрешаем доступ к портам из внешней сети.

    resource "vcd_nsxv_firewall_rule" "fwnatports" {

      edge_gateway   = var.vcd_org_edge_name

      name = "HTTPs Access"

      source {

    gateway_interfaces = ["external"]

      }

      destination {

      gateway_interfaces = ["internal"]

      }

      service {

    protocol = "tcp"

    port = "80"

      }

      service {

    protocol = "tcp"

    port = "443"

      }

      depends_on = [vcd_network_routed.net]

    }

    resource "vcd_nsxv_firewall_rule" "fw_nat_admin_ports" {

      edge_gateway   = var.vcd_org_edge_name

      name = "Admin Access"

      source {

      ip_addresses = [ "90.1.15.1" ]

      }

      destination {

      gateway_interfaces = ["internal"]

      }

      service {

    protocol = "tcp"

    port = "58301"

      }

      service {

    protocol = "tcp"

    port = "58302"

      }

      service {

    protocol = "tcp"

    port = "58303"

      }

      depends_on = [vcd_network_routed.net]

    }

    Создаём правила Source NAT для доступа в сеть Интернет из облачной локальной сети:

    Описываем правила Source NAT.

    resource "vcd_nsxv_snat" "snat_local" {

    edge_gateway = var.vcd_org_edge_name

      network_type = "ext"

      network_name = var.vcdedgeexternalnetwork

      original_address   = var.vcd_edge_local_subnet

    translated_address = var.vcd_edge_external_ip

      depends_on = [vcd_network_routed.net]

    }

    И в завершении конфигурации сетевого блока добавляем правила Destination NAT для доступа к сервисам из внешней сети:

    Добавляем правила Destination NAT.

    resource "vcd_nsxv_dnat" "dnat_tcp_nginx_https" { edge_gateway = var.vcd_org_edge_name network_name = var.vcd_edge_external_network network_type = "ext"

      description = "NGINX HTTPs"

    original_address = var.vcd_edge_external_ip original_port = 443

    translated_address = var.vcd_edge_local_ip_nginx translated_port = 443 protocol = "tcp"

    depends_on = [vcd_network_routed.net] } resource "vcd_nsxv_dnat" "dnat_tcp_nginx_http" { edge_gateway = var.vcd_org_edge_name network_name = var.vcd_edge_external_network network_type = "ext"

    description = "NGINX HTTP"

    original_address = var.vcd_edge_external_ip original_port = 80

    translated_address = var.vcd_edge_local_ip_nginx translated_port = 80 protocol = "tcp"

    depends_on = [vcd_network_routed.net]

    }

    Добавляем правило NAT для трансляции портов к SSH-серверу под Nginx.

    resource "vcd_nsxv_dnat" "dnat_tcp-nginx_ssh" { edge_gateway = var.vcd_org_edge_name network_name = var.vcd_edge_external_network network_type = "ext"

    description = "SSH NGINX"

    original_address = var.vcd_edge_external_ip original_port = 58301

    translated_address = var.vcd_edge_local_ip_nginx translated_port = 22 protocol = "tcp"

    depends_on = [vcd_network_routed.net]

    }

    Добавляем правило NAT для трансляции портов к SSH-серверу с 1С-Битрикс.

    resource "vcd_nsxv_dnat" "dnat_tcp_bitrix_ssh" { edge_gateway = var.vcd_org_edge_name network_name = var.vcd_edge_external_network network_type = "ext"

    description = "SSH Bitrix"

    original_address = var.vcd_edge_external_ip original_port = 58302

    translated_address = var.vcd_edge_local_ip_bitrix translated_port = 22 protocol = "tcp"

    depends_on = [vcd_network_routed.net]

    }

    Добавляем правило NAT для трансляции портов к SSH-серверу с Nextcloud.

    resource "vcd_nsxv_dnat" "dnat_tcp_nextcloud_ssh" { edge_gateway = var.vcd_org_edge_name network_name = var.vcd_edge_external_network network_type = "ext"

    description = "SSH Nextcloud"

    original_address = var.vcd_edge_external_ip original_port = 58303 translated_address = var.vcd_edge_local_ip_nextcloud translated_port = 22 protocol = "tcp"

    depends_on = [vcd_network_routed.net]

    }

    Конфигурация виртуальной среды main.tf

    Как мы и планировали в начале статьи, создадим три виртуальные машины. Они будут подготовлены с помощью "Guest Customization". Сетевые параметры пропишем согласно указанным нами настройками, а пароль от пользователя генерируется автоматически.

    Опишем vApp в котором будут находится виртуальные машины и их конфигурацию.

    Конфигурация виртуальных машин
    Конфигурация виртуальных машин

    Создадим контейнер vApp. Чтобы мы могли сразу же подключить vApp и ВМ к виртуальной сети также добавляем параметр depends_on:

    Создаем контейнер

    resource "vcd_vapp" "vapp" { name = "web" power_on = "true" depends_on = [vcd_network_routed.net]

    }

    Создадим виртуальную машину с описанием

    resource "vcd_vapp_vm" "nginx" {

    vapp_name = vcd_vapp.vapp.name

    name = "nginx"

    catalog_name = var.vcd_org_catalog

    template_name = var.vcd_template_os_centos7

    storage_profile = var.vcd_org_ssd_sp

    memory = 8192

    cpus = 1

    cpu_cores = 1

    network {

    type = "org"

    name = vcd_network_routed.net.name

    is_primary = true

    adapter_type = "VMXNET3"

    ip_allocation_mode = "MANUAL"

    ip = var.vcd_edge_local_ip_nginx

    }

    override_template_disk {

    bus_type = "paravirtual"

    size_in_mb = "32768"

    bus_number = 0

    unit_number = 0

    storage_profile = var.vcd_org_ssd_sp

    }

    }

    Основные параметры в описании VM:

    • name - имя виртуальной машины,

    • vappname - название vApp в который добавить новую ВМ,

    • catalogname / templatename - название каталога и название шаблона виртуальной машины,

    • storageprofile - политика хранения по умолчанию.

    Параметры блока network:

    • type - тип подключаемой сети,

    • name - к какой виртуальной сети подключить ВМ,

    • isprimary - основной сетевой адаптер,

    • ipallocation_mode - режим выделения адреса MANUAL / DHCP / POOL,

    • ip - IP-адрес для виртуальной машины, укажем вручную.

    Блок override_template_disk:

    • sizeinmb - размер boot-диска для виртуальной машины

    • storage_profile - политика хранения для диска

    Создадим вторую VM с описанием файлового хранилища Nextcloud

    resource "vcd_vapp_vm" "nextcloud" {

    vapp_name = vcd_vapp.vapp.name

    name = "nextcloud"

    catalog_name = var.vcd_org_catalog

    template_name = var.vcd_template_os_centos7

    storage_profile = var.vcd_org_ssd_sp

    memory = 8192

    cpus = 1

    cpu_cores = 1

    network {

    type = "org"

    name = vcd_network_routed.net.name

    is_primary = true

    adapter_type = "VMXNET3"

    ip_allocation_mode = "MANUAL"

    ip = var.vcd_edge_local_ip_nextcloud

    }

    override_template_disk {

    bus_type = "paravirtual"

    size_in_mb = "32768"

    bus_number = 0

    unit_number = 0

    storage_profile = var.vcd_org_ssd_sp

    }

    }

    resource "vcd_vm_internal_disk" "disk1" {

    vapp_name = vcd_vapp.vapp.name

    vm_name = "nextcloud"

    bus_type = "paravirtual"

    size_in_mb = "102400"

    bus_number = 0

    unit_number = 1

    storage_profile = var.vcd_org_hdd_sp

    allow_vm_reboot = true

    depends_on = [ vcd_vapp_vm.nextcloud ]

    }

    В секции vcdvminternal_disk опишем новый виртуальный диск, который подключается к виртуальной машине.

    Пояснения по блоку vcdvminternaldisk:

    • bustype - тип дискового контроллера

    • sizeinmb - размер диска

    • busnumber / unitnumber - место подключения в адаптере

    • storage_profile - политика хранения для диска

    Опишем последнюю VM на Битрикс

    resource "vcd_vapp_vm" "bitrix" {

    vapp_name = vcd_vapp.vapp.name

    name = "bitrix"

    catalog_name = var.vcd_org_catalog

    template_name = var.vcd_template_os_centos7

    storage_profile = var.vcd_org_ssd_sp

    memory = 8192

    cpus = 1

    cpu_cores = 1

    network {

    type = "org"

    name = vcd_network_routed.net.name

    is_primary = true

    adapter_type = "VMXNET3"

    ip_allocation_mode = "MANUAL"

    ip = var.vcd_edge_local_ip_bitrix

    }

    override_template_disk {

    bus_type = "paravirtual"

    size_in_mb = "81920"

    bus_number = 0

    unit_number = 0

    storage_profile = var.vcd_org_ssd_sp

    }

    }

    Обновление ОС и установка дополнительных скриптов

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

    Рассмотрим как обновить ОС и запустить установочный скрипт CMS Bitrix с помощью provisioner блока.

    Сначала выполним установку пакетов обновления CentOS.

    resource "null_resource" "nginx_update_install" {

    provisioner "remote-exec" {

    connection {

    type = "ssh"

    user = "root"

    password = vcd_vapp_vm.nginx.customization[0].admin_password

    host = var.vcd_edge_external_ip

    port = "58301"

    timeout = "30s"

    }

    inline = [

    "yum -y update && yum -y upgrade",

    "yum -y install wget nano epel-release net-tools unzip zip" ]

    }

    }

    }

    Обозначение составляющих:

    • provisioner "remote-exec" - подключаем блок удаленного "провижининга"

    • В блоке connection описываем тип и параметры для подключения:

    • type - протокол, в нашем случае SSH;

    • user - имя пользователя;

    • password - пароль пользователя. В нашем случае указываем на параметр vcdvappvm.nginx.customization[0].admin_password, который хранит сгенерированный пароль от пользователя системы.

    • host - внешний IP-адрес для подключения;

    • port - порт для подключения, который ранее указывали в настройках DNAT;

    • inline - перечисляем список команд, которые будут вводится. Команды будут введены по порядку, как и указано в этой секции.

    Как пример, дополнительно выполним скрипт установки 1С-Битрикс. Вывод результата выполнения скрипта будет доступен во время выполнения плана. Для установки скрипта, сначала опишем блок:

    Опишем установку 1С-Битрикс.

    provisioner "file" {

    source = "prepare.sh"

    destination = "/tmp/prepare.sh"

    connection {

    type = "ssh"

    user = "root"

    password = vcd_vapp_vm.nginx.customization[0].admin_password

    host = var.vcd_edge_external_ip

    port = "58301"

    timeout = "30s"

    }

    }

    provisioner "remote-exec" {

    inline = [

    "chmod +x /tmp/prepare.sh", "./tmp/prepare.sh"

    ]

    }

    И сразу же опишем обновление Битрикс.

    Пример провижининга 1С-Битрикс.

    resource "null_resource" "install_update_bitrix" {

    provisioner "remote-exec" {

    connection {

    type = "ssh"

    user = "root"

    password = vcd_vapp_vm.bitrix.customization[0].admin_password

    host = var.vcd_edge_external_ip

    port = "58302"

    timeout = "60s"

    }

    inline = [

    "yum -y update && yum -y upgrade",

    "yum -y install wget nano epel-release net-tools unzip zip",

    "wget http://repos.1c-bitrix.ru/yum/bitrix-env.sh -O /tmp/bitrix-env.sh",

    "chmod +x /tmp/bitrix-env.sh",

    "/tmp/bitrix-env.sh"

    ]

    }

    }

    Важно! Скрипт может не сработать, если не отключить заранее SELinux! Если вам требуется подробная статья по установке и настройке CMS 1С-Битрикс с помощью bitrix-env.sh, оо вы можете воспользоваться нашей статьей в блоге на сайте.

    3. Инициализация инфраструктуры

    Инициализация модулей и плагинов
    Инициализация модулей и плагинов

    Для работы мы используем простой “джентельменский набор”: лэптоп с ОС Windows 10 и дистрибутив с официального сайта terraform.io. Распакуем и проинициализируем с помощью команды: terraform.exe init

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

    1. Выполняем команду - terraform plan -var-file=vcd.tfvars.

    2. Получаем результат - Plan: 16 to add, 0 to change, 0 to destroy. То есть по этому плану будет создано 16 ресурсов.

    3. Запускаем план по команде - terraform.exe apply -var-file=vcd.tfvars.

    Виртуальные машины будут созданы, а затем выполняются перечисленные нами пакеты в рамках секции provisioner — ОС будет обновлена и установится CMS Bitrix.

    Получение данных для подключения

    После выполнения плана мы хотим получить в текстовом виде данные для подключения к серверам, для этого оформим секцию output следующим образом:

    output "nginxpassword" {

     value = vcdvappvm.nginx.customization[0].adminpassword

    }

    И следующий вывод сообщает нам пароль от созданной виртуальной машины:

    Outputs: nginx_password = F#4u8!!N

    В итоге мы получаем доступ к виртуальным машинам с обновлённой операционной системой и предустановленными пакетами для нашей дальнейшей работы. Все готово!

    Но что если у вас уже есть существующая инфраструктура?

    3.1. Работа Terraform с уже существующей инфраструктурой

    Всё просто, вы можете импортировать текущие виртуальные машины и их vApp контейнеры с помощью команды import.

    Опишем ресурс vAPP и виртуальную машину.

    resource "vcd_vapp" "Monitoring" {

    name = "Monitoring"

    org = "mClouds"

    vdc = "mClouds"

    }

    resource "vcd_vapp_vm" "Zabbix" {

    name = "Zabbix"

    org = "mClouds"

    vdc = "mClouds"

    vapp = "Monitoring"

    }

    Следующий шаг, это выполнить импорт свойств ресурсов vApp в формате vcdvapp.<vApp> <org>.<orgvdc>.<vApp>, где:

    • vApp - имя vApp;

    • org - название организации;

    • org_vdc - название виртуального дата-центра.

    Импорт свойств ресурса vAPP
    Импорт свойств ресурса vAPP

    Выполним импорт свойств ресурсов VM в формате: vcdvappvm.<VM> <org>.<orgvdc>.<vApp>.<VM>, в котором:

    • VM - имя VM;

    • vApp - имя vApp;

    • org - название организации;

    • orgvdc - название виртуального дата-центра.

    Импорт прошел успешно

    C:\Users\Mikhail\Desktop\terraform>terraform import vcd_vapp_vm.Zabbix mClouds.mClouds.Monitoring.Zabbix

    vcd_vapp_vm.Zabbix: Importing from ID "mClouds.mClouds.Monitoring.Zabbix"...

    vcd_vapp_vm.Zabbix: Import prepared!

    Prepared vcd_vapp_vm for import

    vcd_vapp_vm.Zabbix: Refreshing state... [id=urn:vcloud:vm:778f4a89-1c8d-45b9-9d94-0472a71c4d1f]

    Import successful!

    The resources that were imported are shown above. These resources are now in your Terraform state and will henceforth be managed by Terraform.

    Теперь мы можем посмотреть на новый импортированный ресурс:

    Импортированный ресурс

    > terraform show

    ...

    # vcd_vapp.Monitoring:

    resource "vcd_vapp" "Monitoring" {

    guest_properties = {}

    href = "https://vcloud.mclouds.ru/api/vApp/vapp-fe5db285-a4af-47c4-93e8-55df92f006ec"

    id = "urn:vcloud:vapp:fe5db285-a4af-47c4-93e8-55df92f006ec"

    ip = "allocated"

    metadata = {}

    name = "Monitoring"

    org = "mClouds"

    status = 4

    status_text = "POWERED_ON"

    vdc = "mClouds"

    }

    # vcd_vapp_vm.Zabbix:

    resource "vcd_vapp_vm" "Zabbix" {

    computer_name = "Zabbix"

    cpu_cores = 1

    cpus = 2

    expose_hardware_virtualization = false

    guest_properties = {}

    hardware_version = "vmx-14"

    href = "https://vcloud.mclouds.ru/api/vApp/vm-778f4a89-1c8d-45b9-9d94-0472a71c4d1f"

    id = "urn:vcloud:vm:778f4a89-1c8d-45b9-9d94-0472a71c4d1f"

    internal_disk = [

    {

    bus_number = 0

    bus_type = "paravirtual"

    disk_id = "2000"

    iops = 0

    size_in_mb = 122880

    storage_profile = "Gold Storage Policy"

    thin_provisioned = true

    unit_number = 0

    },

    ]

    memory = 8192

    metadata = {}

    name = "Zabbix"

    org = "mClouds"

    os_type = "centos8_64Guest"

    storage_profile = "Gold Storage Policy"

    vapp_name = "Monitoring"

    vdc = "mClouds"

    customization {

    allow_local_admin_password = true

    auto_generate_password = true

    change_sid = false

    enabled = false

    force = false

    join_domain = false

    join_org_domain = false

    must_change_password_on_first_login = false

    number_of_auto_logons = 0

    }

    network {

    adapter_type = "VMXNET3"

    ip_allocation_mode = "DHCP"

    is_primary = true

    mac = "00:50:56:07:01:b1"

    name = "MCLOUDS-LAN01"

    type = "org"

    }

    }

    Теперь точно готово - мы закончили с последним моментом (импорт в существующую инфраструктуру) и рассмотрели все основные моменты работы с Terraform. 

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

    При этом независимость от окружения дает возможность работать с локальными, облачными ресурсами, так и, заканчивая управлением платформой. А при отсутствии поддерживаемой платформы и желании добавления нового, можно написать свой провайдер и использовать его.

    mClouds.ru
    IaaS и VPS провайдер на платформе VMware.

    Комментарии 0

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое