首页 > 解决方案 > 添加新“组件”时更新现有 terraform 计算实例

问题描述

我是 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"
  }
}

出于可维护性和灵活性的原因,我想在同一个实例中添加一些“组件”,它可以是任何东西,但在这里我尝试了一个配置文件和远程执行。事实上,当我在我的计算实例中添加这个参数时,我注意到我的计算实例不会被更新。例如:

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 planterraform apply时,我的实例没有任何变化。我有 infos 消息通知我:

申请完成!资源:添加 0 个,更改 0 个,销毁 0 个。

将我的更改应用于我的计算实例的正确方法是什么。

标签: openstackterraformdevopsiaasterraform-provider-openstack

解决方案


Following Terraform documentation:

Provisioners are used to execute scripts on a local or remote machine as part of resource creation or destruction.

If you want the provisionners to run again, you should destroy (terraform destroy) and create (terraform apply) the resource again.


推荐阅读