Назад | Перейти на главную страницу

Как определить идентификатор libvirt_volume в terraform для повторного использования в разделенных файлах конфигурации

Настроить

Я использую файлы удаленного состояния, которые хранятся во внешнем облачном хранилище, и мои ресурсы терраформ разделены на разные модули. Я хочу загрузить базовые изображения только один раз в модуле изображений и хотел бы ссылаться на них в определениях каждого домена, который я хочу создать. И домен, и файл изображения определяются сторонним поставщиком терраформ для libvirt. Файлы состояния разделены по компонентам, так как terraform хочет уничтожить ресурсы, когда terraform apply-задача желаемого состояния для отдельных компонентов по одному.

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

Код Terraform

images / main.tf

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

бастион-хост / main.tf

# 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

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

Проблема

Ресурсы работают нормально, когда я определяю их в одинаковых конфигурациях терраформ. Однако каждый домен затем захочет загрузить одно и то же базовое изображение. Файлы состояний разделены, чтобы при построении одного домена не удалялись другие домены / ресурсы, которые не определены в конкретном файле 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 dsl.

Возможно, мне нужно жестко запрограммировать идентификатор. Похоже, я могу использовать для этого путь: /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

Верно для полного и частичного пути к файлу изображения.

Вопросы

После дальнейшего расследования я нашел ответ на свой вопрос:

В base_volume_id должен использоваться с полным путем к целевому тому (пул по умолчанию имеет путь: / var / lib / libvirt / images).

Файл состояния содержал имя компонента, разделенное символом "/". Это вызвало проблему с записью файла состояния в облачное хранилище. Если я