Terraform не может создать виртуальную машину в провайдере openstack (в каталоге служб не удалось найти подходящую конечную точку)

#terraform #openstack

#terraform #openstack

Вопрос:

У меня есть проект в terraform — provider «openstack» версии 16:

   provider "openstack" {
  auth_url = "${var.auth_url}"
  user_name = "${var.username}"
  password = "${var.password}"
  region = "${var.region}"
  project_domain_id = "${var.project_id}"
  project_domain_name = "${var.project_domain_name}"
  endpoint_type = "public"
}
  

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

 resource "openstack_compute_instance_v2" "terraform_test" {
  name = "test"
  region = "${var.region}"
  availability_zone = "nova"
  image_id = "${var.image}"
  flavor_name = "m1.medium"
  key_pair = "${var.ssh_key}"
  security_groups = ["default"]

  network {
    uuid = "${var.network}"
  }
}
  

«terraform plan» без каких-либо ошибок.

При попытке применить план я получаю эту ошибку:

 Error: Error applying plan:

1 error(s) occurred:

* openstack_compute_instance_v2.terraform_test: 1 error(s) occurred:

* openstack_compute_instance_v2.terraform_test: Error creating OpenStack compute client: No suitable endpoint could be found in the service catalog.
  

Когда я делаю

 openstack catalog list
  

Я беру

  nova        compute   regionName
                         public: https://compute.$url:8774/v2.1
                       regionName   
                         admin: $url
                       regionName
                         internal: $url

 keystone    identity  regionName
                         internal: $url
                       regionName
                         admin: $url
                       regionName
                         public: https://auth.$url:5000/v2.0
  

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

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

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

Ответ №1:

Я нашел решение: openstack предоставляет *-openrc.sh скрипт со всеми переменными среды для подключения:

 # With the addition of Keystone we have standardized on the term **tenant**
# as the entity that owns the resources.
export OS_TENANT_ID=$ID
export OS_TENANT_NAME="$NAME"

# unsetting v3 items in case set
unset OS_PROJECT_ID
unset OS_PROJECT_NAME
unset OS_USER_DOMAIN_NAME
  

Я обнаружил, что использовал переменные для API v3, но разместил их в API v2. Поэтому я изменил имена переменных на те же значения:

 project_domain_id > tenant_id
project_domain_name > tenant_name
  

Поставщик теперь выглядит как:

 provider "openstack" {
  auth_url = "${var.auth_url}"
  user_name = "${var.username}"
  password = "${var.password}"
  region = "${var.region}"
  tenant_name = "${var.tenant_name}"
  tenant_id = "${var.tenant_id}"
}
  

Теперь это работает нормально!