首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在添加新的“组件”时更新现有的terraform计算实例

在添加新的“组件”时更新现有的terraform计算实例
EN

Stack Overflow用户
提问于 2019-01-04 15:19:55
回答 2查看 401关注 0票数 0

我对terraform很陌生,但是我已经创建了一个openstack计算实例,如下所示:

代码语言:javascript
复制
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"
  }
}

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

代码语言:javascript
复制
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销毁。

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

EN

回答 2

Stack Overflow用户

发布于 2019-01-04 15:38:25

跟随地形文档

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

如果希望提供程序再次运行,则应该再次销毁(terraform destroy)和创建(terraform apply)资源。

票数 1
EN

Stack Overflow用户

发布于 2019-01-05 21:44:50

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

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

如果您要更新的资源受到污染,那么当terraform下次再次运行时,资源将被重新执行。但是注意我说的关于锤子的话。

或者,您可以利用您选择的CM工具来管理实例的内容- Chef/Ansible,或者通过类似于packer的工具创建Openstack使用的映像(即不可变),并对其进行更新。我会做后者的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54041699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档