Обновить существующий экземпляр 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, с помощью такого инструмента, как упаковщик, и обновлять их. Я бы сделал последнее.