我使用的是存储在外部云存储上的远程状态文件,我的terraform资源被分割在不同的模块中。我只想在图像模块中下载一次基本图像,并希望在我想要创建的每个域的定义中引用它们。域和图像文件都是由libvirt的第三方terraform提供者定义的。状态文件由组件分隔,因为terraform希望在每次terraform apply-ing单个组件的所需状态时破坏资源。
https://github.com/dmacvicar/terraform-provider-libvirt
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"
}# 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}"
}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文件中没有定义的其他域/资源。当然,当我在另一个模块中定义外部图像时,我不能引用它:
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。
因此,当下一次资源不易识别时,我想学习一种更好的方法来一般性地解决这个问题。
对路径进行硬编码无效:
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。
发布于 2018-02-12 19:51:56
经过进一步调查,我找到了我自己问题的答案:
base_volume_id必须与目标卷的完整路径一起使用(默认池具有路径:/var/lib/libvirt/映像)。
状态文件包含以'/‘分隔的组件名称。这导致了在云存储中写入状态文件的问题。I fi
https://serverfault.com/questions/895937
复制相似问题