Jag har sutt och testat lite, och med vanliga "kommandot" får du inte komma åt libvirt som vanlig användare (trodde jag, läs vidare). Observera att du behöver ange --connect qemu:///system (eller -c) om du kör virsh som vanlig användare då den annars går lokalt mot session.
[root@kvm01 ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@kvm01 ~]# virsh list --all
Id Name State
----------------------------------------------------
- web01 shut off
- web02 shut off
[ansible@kvm01 ~]$ id
uid=1000(ansible) gid=1000(ansible) groups=1000(ansible)
[ansible@kvm01 ~]$ virsh --connect qemu:///system list --all
error: failed to connect to the hypervisor
error: authentication failed: no agent is available to authenticate
Jag hittade denna tråd denna tråd som jag misstänker att du såg angående policykit (som libvirt använder för auth som default i centos7 - mer info här). Detta tillåter din användare att göra allting via libvirt, motsvarande en "rw-socket".
[root@kvm01 ~]# cat /etc/polkit-1/rules.d/50-org.libvirt.unix.manage.rules
polkit.addRule(function(action, subject) {
if (action.id == "org.libvirt.unix.manage" &&
subject.user == "ansible") {
return polkit.Result.YES;
polkit.log("action=" + action);
polkit.log("subject=" + subject);
}
});
[ansible@kvm01 ~]$ virsh --connect qemu:///system list --all
Id Name State
----------------------------------------------------
6 web01 running
7 web02 running
Däremot är jag inte alls särskilt förtjust i att en användare som endast används för monitorering plötsligt skulle få stänga av virtuella maskiner.
[ansible@kvm01 ~]$ virsh --connect qemu:///system destroy web02
Domain web02 destroyed
Jag kikade vidare och såg att det fanns en policy som hette org.libvirt.unix.monitor som istället motsvarar en "ro-socket" vilket låter betydligt mer intressant. Denna verkar vara tillåten för alla som default
Om vi lägger på -r växeln i virsh-kommandot så ansluter man istället readonly. Eftersom "ro-socketen" tillåts för alla så går kommandot igenom. Nedan kommando körs alltså utan att ha skapat några regler eller gjort några modifieringar i huvudtaget.
[ansible@kvm01 ~]$ virsh -r -c qemu:///system list --all
Id Name State
----------------------------------------------------
6 web01 running
8 web02 running
När jag kör ditt script som vanlig användare utan att ändra någonting:
[ansible@kvm01 ~]$ ./check_kvm.sh
error: failed to connect to the hypervisor
error: no valid connection
error: Cannot create user runtime directory '/run/user/0/libvirt': Permission denied
Unknown guests
Och om vi byter ut rad 34 med våra andra växlar från
LIST=$(virsh list --all | sed '1,2d' | sed '/^$/d'| awk '{print $2":"$3 $4}')
till
LIST=$(virsh -r -c qemu:///system list --all | sed '1,2d' | sed '/^$/d'| awk '{print $2":"$3 $4}')
... så verkar scriptet fungera mycket bättre:
[ansible@kvm01 ~]$ ./check_kvm.sh
hosts:2 OK:2 WARN:0 CRIT:0 - web01:running web02:running
Så för att sammanfatta det hela så behöver du bara modifiera hur scriptet kör virsh-kommandot. Den behöver ansluta sig mot qemu:///system och göra det readonly.