Документация
Инструкции
Создание виртуальных серверов в Openstack из Terraform


Terraform - инструмент для создания виртуальных окружений в соответствии с подходом IaaS - инфраструктура как сервис и Iac - инфраструктура как код. Инструкция описывает порядок действий на примере диструбутива Ubuntu.

Установите виртуальный сервер из шаблона 'Ansible & Openstack' или пройдите установку софта по инструкции в статье Установка клиента Openstack и подключение Ansible.



В случае установки хоста из Heat шаблона, виртуальный сервер будет уже настроен и можно сразу переходить к пункту 3.

Установленный виртуальный сервер будет содержать файл /root/keystone_<datacenter_name> c переменными окружения для авторизации вида:
    unset OS_USERNAME OS_PASSWORD OS_TENANT_NAME OS_AUTH_URL OS_TOKEN OS_URL
    unset SERVICE_TOKEN SERVICE_ENDPOINT
    unset OS_USER_DOMAIN_NAME OS_PROJECT_DOMAIN_NAME OS_PROJECT_NAME
    export OS_IMAGE_API_VERSION=2
    export OS_URL=<< dc_endpoint_public_url >>
    export OS_AUTH_URL=<< dc_endpoint_public_url >>
    export NEW_OS_AUTH_URL=<< dc_endpoint_public_url >>
    export OS_USER_DOMAIN_NAME=myaccount003-domain
    export OS_PROJECT_DOMAIN_NAME=myaccount003-domain
    export OS_USERNAME=myaccount003
    export OS_PROJECT_NAME=myaccount003-dc01
    export OS_PASSWORD=<< openstack_password >>
    export OS_IDENTITY_API_VERSION=3
    EOF
  
Или создаем файл самостоятельно.

1. Заходим на хост и устанавливаем необходимые пакеты:
    myhost$ ssh-agent bash

    myhost$ ssh -A ubuntu@shellbox01

    shellbox01$ sudo -i

    shellbox01# curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -

    shellbox01# apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
  
2. Cоздаем директорию Terraform проекта и файл описания ресурсов
    shellbox01:~# mkdir testtf

    shellbox01:~# cat > testtf/main.tf <<EOF
    resource "openstack_compute_instance_v2" "tf-01" {
      name = "tf-01"
      image_name = "Ubuntu Focal 20.04 (2020-05-16)"
      flavor_name = "vibox1"
      key_pair = "my_ssh_pub_key"
      # можно указывать уже добавленный SSH ключ или создать новый, используя
      # ресурс openstack_compute_keypair_v2
    }
    EOF
  
3. Подгружаем переменные окружения, дальше мы готовы к использованию Terraform
    shellbox01:~# cd testtf

    shellbox01:~/testtf# source /root/keystone_dc01

    shellbox01:~/testtf# terraform 0.13upgrade -yes

    shellbox01:~/testtf# terraform init
    Initializing the backend...
    Initializing provider plugins...
    - Using previously-installed terraform-providers/openstack v1.31.0
    Terraform has been successfully initialized!

    shellbox01:~/testtf# terraform apply
    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:
      # openstack_compute_instance_v2.terraform will be created
      + resource "openstack_compute_instance_v2" "tf-01" {
        + flavor_name         = "vibox1"
        + force_delete        = false
        + image_name          = "Ubuntu Focal 20.04 (2020-05-16)"
        + key_pair            = "my_ssh_pub_key"
        + name                = "terraform"
        + power_state         = "active"
     }
    Plan: 1 to add, 0 to change, 0 to destroy.
    Do you want to perform these actions?
    Enter a value: yes
    openstack_compute_instance_v2.terraform: Creating...
    openstack_compute_instance_v2.terraform: Still creating... [10s 20s 30s 40s elapsed]
    openstack_compute_instance_v2.terraform: Creation complete after 43s [id=84227b14-4743-4564-9413-3f05ee90e3a5]

    shellbox01:~/testtf# terraform show
    # openstack_compute_instance_v2.tf-01:
    resource "openstack_compute_instance_v2" "tf-01" {
      access_ip_v4        = "10.20.1.12"
      all_metadata        = {}
      all_tags            = []
      availability_zone   = "nova"
      flavor_id           = "49ca3a66-df84-4d73-a28d-177152ac1179"
      flavor_name         = "vibox1"
      force_delete        = false
      id                  = "a4ddb7ce-3f59-48ae-94a5-007962cf6122"
      image_id            = "828376f9-61f3-4d94-ae14-f09f568e56d7"
      image_name          = "Ubuntu Focal 20.04 (2020-05-16)"
      key_pair            = "my_ssh_pub_key"
      name                = "tf-01"
      power_state         = "active"
      security_groups     = [
          "default",
      ]
      stop_before_destroy = false
      network {
        access_network = false
        fixed_ip_v4    = "10.20.1.12"
        mac            = "fa:16:3e:b1:04:c3"
        name           = "myaccount-dc01-lan"
      }
    }

    shellbox01:~/testtf# openstack server list -c 'Name' \
    -c 'Status' -c 'Image' -c 'Flavor'
    +-------------------+--------+----------------------------------+--------+
    | Name              | Status | Image                            | Flavor |
    +-------------------+--------+----------------------------------+--------+
    | shellbox          | ACTIVE | Ubuntu Bionic 18.04 (2020-03-27) | vibox2 |
    | tf-01             | ACTIVE | Ubuntu Focal 20.04 (2020-05-16)  | vibox1 |
    +-------------------+--------+----------------------------------+--------+

  
Официальная документация по использованию Terraform в Openstack: https://www.terraform.io/docs/providers/openstack/index.html