libvirt
is an openshift-ansible
provider that uses libvirt
to create local Fedora VMs that are provisioned exactly the same way that cloud VMs would be provisioned.
This makes libvirt
useful to develop, test and debug OpenShift and openshift-ansible locally on the developer’s workstation before going to the cloud.
- Install ansible
- Install dnsmasq
- Install ebtables
- Install qemu and qemu-system-x86
- Install libvirt-python and libvirt
- Install genisoimage
- Enable and start the libvirt daemon, e.g:
systemctl enable libvirtd
systemctl start libvirtd
- Grant libvirt access to your user¹
- Check that your
$HOME
is accessible to the qemu user² - Configure dns resolution on the host³
- Install libselinux-python
¹ Depending on your distribution, libvirt access may be denied by default or may require a password at each access.
You can test it with the following command:
virsh -c qemu:///system pool-list
If you have access error messages, please read https://libvirt.org/acl.html and https://libvirt.org/aclpolkit.html .
In short, if your libvirt has been compiled with Polkit support (ex: Arch, Fedora 21), you can create /etc/polkit-1/rules.d/50-org.libvirt.unix.manage.rules
as follows to grant full access to libvirt to $USER
sudo /bin/sh -c "cat - > /etc/polkit-1/rules.d/50-org.libvirt.unix.manage.rules" << EOF
polkit.addRule(function(action, subject) {
if (action.id == "org.libvirt.unix.manage" &&
subject.user == "$USER") {
return polkit.Result.YES;
polkit.log("action=" + action);
polkit.log("subject=" + subject);
}
});
EOF
If your libvirt has not been compiled with Polkit (ex: Ubuntu 14.04.1 LTS), check the permissions on the libvirt unix socket:
ls -l /var/run/libvirt/libvirt-sock
srwxrwx--- 1 root libvirtd 0 févr. 12 16:03 /var/run/libvirt/libvirt-sock
usermod -a -G libvirtd $USER
# $USER needs to logout/login to have the new group be taken into account
(Replace $USER
with your login name)
All the disk drive resources needed by the VMs (Fedora disk image, cloud-init files) are put inside ~/libvirt-storage-pool-openshift/
.
As we’re using the qemu:///system
instance of libvirt, qemu will run with a specific user:group
distinct from your user. It is configured in /etc/libvirt/qemu.conf
. That qemu user must have access to that libvirt storage pool.
If your $HOME
is world readable, everything is fine. If your $HOME
is private, ansible
will fail with an error message like:
error: Cannot access storage file '$HOME/libvirt-storage-pool-openshift/lenaic-master-216d8.qcow2' (as uid:99, gid:78): Permission denied
In order to fix that issue, you have several possibilities:
- set
libvirt_storage_pool_path
insideplaybooks/libvirt/openshift-cluster/launch.yml
andplaybooks/libvirt/openshift-cluster/terminate.yml
to a directory:- backed by a filesystem with a lot of free disk space
- writable by your user;
- accessible by the qemu user.
- Grant the qemu user access to the storage pool.
On Arch or Fedora 22+:
setfacl -m g:kvm:--x ~
- Verify NetworkManager is configured to use dnsmasq:
$ sudo vi /etc/NetworkManager/NetworkManager.conf
[main]
dns=dnsmasq
- Configure dnsmasq to use the Virtual Network router for example.com:
sudo vi /etc/NetworkManager/dnsmasq.d/libvirt_dnsmasq.conf
server=/example.com/192.168.55.1
- cd openshift-ansible/
- Try to list all instances (Passing an empty string as the cluster_id argument will result in all libvirt instances being listed)
bin/cluster list libvirt ''
The following options can be passed via the -o
flag of the create
command or as environment variables:
image_url
(default tohttp://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2.xz
): URL of the QCOW2 image to downloadimage_name
(default toCentOS-7-x86_64-GenericCloud.qcow2
): Name of the QCOW2 image to boot the VMs onimage_compression
(default toxz
): Source QCOW2 compression (only xz supported at this time)image_sha256
(default todd0f5e610e7c5ffacaca35ed7a78a19142a588f4543da77b61c1fb0d74400471
): Expected SHA256 checksum of the downloaded imagelibvirt_storage_pool
(default toopenshift-ansible
): name of the libvirt storage pool for the VM images. It will be created if it does not existlibvirt_storage_pool_path
(default to$HOME/libvirt-storage-pool-openshift-ansible
): path tolibvirt_storage_pool
, i.e. where the VM images are storedlibvirt_network
(default toopenshift-ansible
): name of the libvirt network that the VMs will use. It will be created if it does not existlibvirt_instance_memory_mib
(default to1024
): memory of the VMs in MiBlibvirt_instance_vcpu
(default to2
): number of vCPUs of the VMsskip_image_download
(default tono
): Skip QCOW2 image download. This requires theimage_name
QCOW2 image to be already present in$HOME/libvirt-storage-pool-openshift-ansible
- To create a cluster with one master and two nodes
bin/cluster create libvirt lenaic
- To update the cluster
bin/cluster update libvirt lenaic
- To terminate the cluster
bin/cluster terminate libvirt lenaic