обновить существующий экземпляр Terraform Compute при добавлении новых «компонентов» - PullRequest
0 голосов
/ 04 января 2019

Я новичок в 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"
  }
}

Из соображений удобства обслуживания и гибкости я хотел бы добавить несколько «компонентов» в один и тот же экземпляр, это может быть что угодно, но здесь я попытался с файлом Providerner и удаленным выполнением . Действительно, когда я добавил эти аргументы в мой экземпляр 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 ]

0 голосов
/ 06 января 2019

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

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

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

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

0 голосов
/ 04 января 2019

После Terraform документация :

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

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

...