添加新的“组件”时更新exisitng terraform计算实例

时间:2019-01-04 15:19:55

标签: openstack terraform devops iaas terraform-provider-openstack

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

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

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

  

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

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

2 个答案:

答案 0 :(得分:1)

遵循地形documentation

  

配置程序用于在本地或远程计算机上执行脚本,作为资源创建销毁的一部分。

如果您希望供应商再次运行,则应销毁(terraform destroy)并再次创建(terraform apply)资源。

答案 1 :(得分:1)

Terraform不能检查本地或远程执行的状态,这不像有一个API调用可以告诉您自定义代码发生了什么-bar-setup.sh。 那就像魔术,或实际的魔术。

Terraforms'用于管理基础结构,实例的配置,而不是实例中的内容。不变的内容和重新创建是这里的真实路径。制作一个全新的实例。但是,如果这是您的锤子,那么有很多方法。

如果污染了要更新的资源,则下次再次运行terraform时,将重新执行该资源。但是请注意我所说的锤子。

或者,您可以利用所选的CM工具来管理实例的内容-Chef / Ansible,或通过打包程序之类的工具创建Openstack使用的图像(即不可变),并对其进行更新。我愿意去做。