Обновить существующий экземпляр Terraform Compute при добавлении новых "компонентов"

Я новичок в terraform, но я создал вычислительный экземпляр openstack следующим образом:

provider "openstack" {
  auth_url    = "https://my-auth/v2.0/" 
  domain_name = "default"                         
  alias       = "alias"                              
  user_name   = "username"
  tenant_name = "tenantname"
  password    = "pwd"
  region      = "region"
}

# Import SSH key pair into openstack project
resource "openstack_compute_keypair_v2" "keypair" {
  provider   = "myprovider"               
  name       = "keypair"                 
  public_key = "${file("~/.ssh/id_rsa.pub")}"
}

# Create a new virtual machine
resource "openstack_compute_instance_v2" "compute_instance" {
  name        = "compute_instance" # Instance Name
  provider    = "myprovider"       # Instance distr
  image_name  = "Centos 7"         # Image name
  flavor_name = "b2-7"             # Machine type name

  key_pair = "${openstack_compute_keypair_v2.keypair.name}"

  network {
    name = "Ext-Net"
  }
}

Из соображений удобства обслуживания и гибкости я хотел бы добавить несколько "компонентов" в один и тот же экземпляр, это может быть что угодно, но здесь я попробовал с файлом инициатора и удаленным выполнением. Действительно, когда я добавил эти аргументы в мой экземпляр compute, я заметил, что мой экземпляр compute не будет обновлен. Например:

provider "openstack" {
  auth_url    = "https://my-auth/v2.0/" 
  domain_name = "default"                         
  alias       = "alias"                              
  user_name   = "username"
  tenant_name = "tenantname"
  password    = "pwd"
  region      = "region"
}

resource "openstack_compute_keypair_v2" "keypair" {
  provider   = "myprovider"               
  name       = "keypair"                 
  public_key = "${file("~/.ssh/id_rsa.pub")}"
}

resource "openstack_compute_instance_v2" "compute_instance" {
  name        = "compute_instance" # Instance Name
  provider    = "myprovider"       # Instance distr
  image_name  = "Centos 7"         # Image name
  flavor_name = "b2-7"             # Machine type name

  key_pair = "${openstack_compute_keypair_v2.keypair.name}"

  network {
    name = "Ext-Net"
  }

  # Add a provisionner file on the ressource
  provisioner "file" {
    source      = "foo_scripts/bar-setup.sh"
    destination = "/tmp/bar-setup.sh"

    connection {
      type        = "ssh"
      user        = "user"
      private_key = "${file("~/.ssh/id_rsa")}"
    }
  }

  # execute server setup file
  provisioner "remote-exec" {
    inline = [
      "chmod +x /tmp/bar-setup.sh",
      "sudo bash /tmp/bar-setup.sh",
    ]

    connection {
      type        = "ssh"
      user        = "centos"
      private_key = "${file("~/.ssh/id_rsa")}"
    }
}

Действительно, добавив файл Provionner в ресурс, когда я запускаю команду terraform plan или же terraform applyНичего не изменилось в моем случае. У меня есть информационные сообщения, уведомляющие меня, что:

Подать заявку завершено! Ресурсы: 0 добавлено, 0 изменено, 0 уничтожено.

Какой правильный способ применить мои изменения к моему вычислительному экземпляру.

2 ответа

Следующая документация Terraform:

Поставщики используются для выполнения сценариев на локальном или удаленном компьютере в процессе создания или уничтожения ресурса.

Если вы хотите, чтобы провайдеры запускались снова, вы должны уничтожить (terraform destroy) и создать (terraform apply) ресурс снова.

Terraform не может проверить состояние локального или удаленного выполнения, не похоже на вызов API, который может сказать вам, что происходит с вашим пользовательским кодом - bar-setup.sh, Это было бы похоже на магию или настоящую магию.

Terraforms 'для управления инфраструктурой, конфигурации экземпляра, а не на самом деле для содержимого на экземпляре. Неизменный контент и воссоздание - вот верный путь. Создание совершенно нового экземпляра. Однако, если это ваш Хаммер, есть способы.

Если вы испортили ресурс, который хотите обновить, то при следующем запуске terraform в следующий раз ресурс будет перезапущен. Но учти то, что я сказал о Молотках.

В качестве альтернативы вы можете использовать выбранный вами инструмент CM для управления содержимым вашего экземпляра - Chef/Ansible или создавать изображения (т.е. неизменяемые), используемые Openstack, с помощью такого инструмента, как упаковщик, и обновлять их. Я бы сделал последнее.

Другие вопросы по тегам