首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何识别terraform中的libvirt_volume id以便在拆分配置文件中重用

如何识别terraform中的libvirt_volume id以便在拆分配置文件中重用
EN

Server Fault用户
提问于 2018-02-06 17:47:22
回答 1查看 1.6K关注 0票数 0

设置

我使用的是存储在外部云存储上的远程状态文件,我的terraform资源被分割在不同的模块中。我只想在图像模块中下载一次基本图像,并希望在我想要创建的每个域的定义中引用它们。域和图像文件都是由libvirt的第三方terraform提供者定义的。状态文件由组件分隔,因为terraform希望在每次terraform apply-ing单个组件的所需状态时破坏资源。

https://github.com/dmacvicar/terraform-provider-libvirt

Terraform代码

images/main.tf

代码语言:javascript
复制
resource "libvirt_volume" "centos-7" {
   name = "centos-7.qcow2"
   pool = "default"
   source = "http://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2"
   format = "qcow2"
}

bastion-host/main.tf

代码语言:javascript
复制
# Create a volume to attach to the "mgmt_bastion" domain as main disk
resource "libvirt_volume" "mgmt_bastion_volume" {
   name = "mgmt_bastion.qcow2"
   base_volume_id = "${libvirt_volume.centos-7.id}"
}

terraform.state

代码语言:javascript
复制
libvirt_volume.centos-7:
  id = /var/lib/libvirt/images/centos-7.qcow2
  format = qcow2
  name = centos-7.qcow2
  pool = default
  size = 8589934592
  source = http://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2

问题

当我在相同的terraform配置中定义资源时,这些资源工作得很好。但是,每个域都希望下载相同的基本映像。状态文件是分开的,这样构建一个域就不会删除在特定main.tf文件中没有定义的其他域/资源。当然,当我在另一个模块中定义外部图像时,我不能引用它:

代码语言:javascript
复制
Error: resource 'libvirt_volume.mgmt_bastion_volume' config: unknown resource 'libvirt_volume.centos-7' referenced in variable libvirt_volume.centos-7.id

可能的解决方案/我尝试过的

当使用像AWS这样的云提供程序时,这通常不是一个问题,可以通过配置数据源和过滤来解决。https://www.terraform.io/docs/configuration/data-sources.html

然而,使用libvirt提供程序需要一些额外的想法。

我知道如何使用terraform show来检查另一个组件的当前terraform状态文件。在那里,我可以从tbe shell读取ids。

也许我只需要运行一个外部脚本,就可以在terraform中重复使用这个id来填充一个变量。

也许我得硬编码身份。似乎我可以使用路径:/var/lib/libvirt/images/centos-7.qcow2,但是我不是硬编码的朋友,我的测试显示,一些图像还包含uuid来引用它们:/var/lib/libvirt/images/commoninit.iso;5a79dcf5-4420-5169-b9f4-5340e9904944

因此,当下一次资源不易识别时,我想学习一种更好的方法来一般性地解决这个问题。

编辑:

对路径进行硬编码无效:

代码语言:javascript
复制
libvirt_volume.mgmt_bastion_volume: Creating...
  base_volume_id: "" => "centos-7.qcow2"
  name:           "" => "mgmt_bastion.qcow2"
  pool:           "" => "default"
  size:           "" => "<computed>"
Failed to save state: Resource not found

对于图像文件的完整和部分路径,为True。

问题

  • 如何获得已下载文件的id以便将其指定为CoW备份卷?(无需手动查看状态文件和硬编码id)
  • 有没有更好的方法来引用同一云图在不同的地形定义,而不下载它?毕竟,我想引用相同的基本图像,以空间高效的方式生成大量的libvirt域。
EN

回答 1

Server Fault用户

发布于 2018-02-12 19:51:56

经过进一步调查,我找到了我自己问题的答案:

base_volume_id必须与目标卷的完整路径一起使用(默认池具有路径:/var/lib/libvirt/映像)。

状态文件包含以'/‘分隔的组件名称。这导致了在云存储中写入状态文件的问题。I fi

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

https://serverfault.com/questions/895937

复制
相关文章

相似问题

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