Terraform provider to provision infrastructure with Linux's KVM using libvirt
Go Shell Other
Clone or download
Latest commit 58cc066 Aug 14, 2018


Terraform provider for libvirt

alpha Build Status

This is a terraform provider that lets you provision servers on a libvirt host via Terraform.

Table of Content

Website Docs


Builds for openSUSE, CentOS, Ubuntu, Fedora are created with openSUSE's OBS. The build definitions are available for both the stable and master branches.

Using published binaries/builds

Using packages

Follow the instructions for your distribution:

Building from source

Before building, you will need the following

  • libvirt 1.2.14 or newer development headers
  • latest golang version
  • cgo is required by the libvirt-go package. export CGO_ENABLED="1"

This project uses glide to vendor all its dependencies.

You do not have to interact with glide since the vendored packages are already included in the repo.

Ensure you have the latest version of Go installed on your system, terraform usually takes advantage of features available only inside of the latest stable release.

You need also need libvirt-dev(el) package installed.

go get github.com/dmacvicar/terraform-provider-libvirt
cd $GOPATH/src/github.com/dmacvicar/terraform-provider-libvirt
go install

You will now find the binary at $GOPATH/bin/terraform-provider-libvirt.


  • Check that libvirt daemon 1.2.14 or newer is running on the hypervisor
  • mkisofs is required to use the CloudInit

Copied from the Terraform documentation:

At present Terraform can automatically install only the providers distributed by HashiCorp. Third-party providers can be manually installed by placing their plugin executables in one of the following locations depending on the host operating system:

On Linux and unix systems, in the sub-path .terraform.d/plugins in your user's home directory.

On Windows, in the sub-path terraform.d/plugins beneath your user's "Application Data" directory.

terraform init will search this directory for additional plugins during plugin initialization.

Using the provider

Here is an example that will setup the following:

  • A virtual server resource

(create this as libvirt.tf and run terraform commands from this directory):

provider "libvirt" {
    uri = "qemu:///system"

You can also set the URI in the LIBVIRT_DEFAULT_URI environment variable.

Now, define a libvirt domain:

resource "libvirt_domain" "terraform_test" {
  name = "terraform_test"

Now you can see the plan, apply it, and then destroy the infrastructure:

$ terraform init
$ terraform plan
$ terraform apply
$ terraform destroy

Look at more advanced examples here

Using multiple hypervisors / provider instances

You can target different libvirt hosts instantiating the provider multiple times. Example.

Using qemu-agent

From its documentation, qemu-agent:

It is a daemon program running inside the domain which is supposed to help management applications with executing functions which need assistance of the guest OS.

Until terraform-provider-libvirt 0.4.2, qemu-agent was used by default to get network configuration. However, if qemu-agent is not running, this creates a delay until connecting to it times-out.

In current versions, we default to not to attempt connecting to it, and attempting to retrieve network interface information from the agent needs to be enabled explicitly with TF_USE_QEMU_AGENT. Note that you still need to make sure the agent is running in the OS, and that is unrelated to this option.

TF_SKIP_QEMU_AGENT is deprecated and has no effect (except for a warning).

Be aware that this variables may be subject to change again in future versions.

Troubleshooting (aka you have a problem)

Have a look at TROUBLESHOOTING, and feel free to add a PR if you find out something is missing.


See also the list of contributors who participated in this project.

The structure and boilerplate is inspired from the Softlayer and Google Terraform provider sources.


  • Apache 2.0, See LICENSE file