Openstack 添加新的“时更新现有地形计算实例”;组件“;

Openstack 添加新的“时更新现有地形计算实例”;组件“;,openstack,terraform,devops,iaas,terraform-provider-openstack,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

我是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")}"
    }
}
事实上,通过在ressource上添加provionner文件,当我运行命令
terraform plan
terraform apply
时,我的实例没有任何变化。我收到infos消息通知我:

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

将更改应用于计算实例的正确方式。

以下地形:

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

如果希望provisionners再次运行,则应销毁(
terraform Distroy
)并再次创建(
terraform apply
)资源。

以下terraform:

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


如果您想让provisionners再次运行,您应该销毁(
terraform destroy
)并再次创建(
terraform apply
)资源。

terraform无法检查本地或远程执行的状态,这并不是说有一个API调用可以告诉您在自定义代码上发生了什么-
bar setup.sh
。 那就像是魔法,或者说是真正的魔法

Terraforms用于管理基础设施、实例的配置,而不是实例上的内容。不变的内容和重新创建才是真正的路径。创造一个全新的例子。然而,如果是你的锤子,有办法

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


或者,您可以利用您选择的CM工具来管理实例的内容—Chef/Ansible,或者通过诸如packer之类的工具创建Openstack使用的图像(即不可变),并更新这些图像。我会做后者。

Terraform无法检查本地或远程执行的状态,它不像有API调用可以告诉您在自定义代码上发生了什么-
bar setup.sh
。 那就像是魔法,或者说是真正的魔法

Terraforms用于管理基础设施、实例的配置,而不是实例上的内容。不变的内容和重新创建才是真正的路径。创造一个全新的例子。然而,如果是你的锤子,有办法

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


或者,您可以利用您选择的CM工具来管理实例的内容—Chef/Ansible,或者通过诸如packer之类的工具创建Openstack使用的图像(即不可变),并更新这些图像。我会做后者。

我了解将provisionner添加到计算实例的实践。但是,向现有实例添加新配置的正确方法是什么呢?我了解向计算实例添加provisionner的实践。但是,向现有实例添加新配置的正确方法是什么?