Func staat voor Fedora Unified Network Controller. Het is geschreven in Python en biedt een API aan zodat je het gemakkelijk kunt gebruiken in Python-scripts. Maar Func is ook gewoon vanaf de commandline aan te roepen. De architectuur is typisch client-server: de computers die je wilt besturen (in de Func-documentatie 'minions' genoemd) draaien de daemon funcd, die de computer contacteren waarmee je alles bestuurt (in de Func-documentatie 'overlord' genoemd). Vanaf de overlord kun je dan opdrachten sturen naar individuele minions, een deelverzameling of alle minions.

Aan de slag

Op de overlord installeren we Func eenvoudig, als het om een Fedora-machine gaat:

# yum install func

Op Red Hat Enterprise Linux en CentOS moet je eerst nog de repository Extras Packages For Enterprise Linux toevoegen. Instructies hiervoor zijn te vinden op de wiki van Func.

Het netwerkverkeer tussen de overlord en de minions wordt uiteraard versleuteld. Voor het beheren van de sleutels gebruikt Func het pakket Certmaster, dat tools en een Python API voor SSL-certificaten aanbiedt. De minions genereren certificate signing requests (CSR's) met een publieke sleutel en zenden die naar de Certmaster op de overlord. De beheerder kan deze certificaten dan tekenen. Nadat de minions de ondertekende certificaten ontvangen hebben, kan de communicatie tussen minions en overlord versleuteld gebeuren.

Daarom schakelen we op de overlord eerst de Certmaster-service in:

# chkconfig --level 345 certmaster on

# service certmaster start

Op de minions installeren we eveneens het Func-pakket. Specificeer dan op elke minion in het configuratiebestand /etc/certmaster/minion.conf van welke Certmaster-host we het certificaat willen ontvangen:

[main]

certmaster = master.example.org

certmaster_port = 51235

log_level = DEBUG

cert_dir = /etc/pki/certmaster

Daarna schakelen we op elke minion de funcd-service in:

# chkconfig --level 345 funcd on

# service funcd start

Hebben we alle minions zo klaargemaakt, dan gaan we terug naar de overlord en kijken we welke minions zich hebben aangeboden:

# certmaster-ca --list

En dan ondertekenen we één voor één de certificaten van de minions:

# certmaster-ca --sign hostname

Wanneer je de Func-commando's niet altijd als root wilt uitvoeren, kun je er met een aantal ACL-commando's ook voor zorgen dat een normale account toegang krijgt. Het is mogelijk om op de minions in te stellen welke commando's de overlord mag uitvoeren.

Func op de commandline

Voor eenvoudige taken kun je Func gewoon vanaf de commandline aanroepen. Het eerste wat je zou moeten doen is het volgende:

# func "*" check

Dit commando voert een aantal controles uit om vaak voorkomende problemen te helpen oplossen. Als je ooit een probleem tegenkomt met Func, dan kan dit commando je in veel gevallen helpen. Een ander commando dat je nuttige informatie geeft is:

# func "*" ping

Hiermee krijg je onmiddellijk te zien welke minions de overlord kan bereiken.

Maar nu het echte werk. In het algemeen geef je als eerste parameter aan func de naam van de machines waarop je een commando wilt uitvoeren. Dat kan een wildcard zijn of de hostname van een specifieke machine. Als tweede parameter komt de naam van een methode en daarna, indien nodig, extra parameters voor die methode.

We kunnen eenvoudig opvragen welke modules er beschikbaar zijn op een machine:

# func foo.example.org call system list_modules

Van een specifieke module, bijvoorbeeld hardware, kunnen we dan de lijst van functies in die module opvragen:

# func foo.example.org call hardware list_methods

Als we een geschikte functie gevonden hebben, voeren we deze uit, bijvoorbeeld om op te vragen welke hardware de machine foo.example.org draait:

# func foo.example.org call hardware info

Voor de namen van machines kun je ook gebruik maken van globbing, bijvoorbeeld:

# func "*.example.org" call service restart httpd

Hiermee herstart je op alle minions in het domein example.org de webserver.

Modules

Op de wiki van Func vind je een lijst van beschikbare modules. Zo is er naast de hardwaremodule en servicemodule die we als voorbeeld gaven ook een module om een netwerkbridge aan te maken, een module om de filtertabel in iptables-firewalls aan te passen, een module om bestandssystemen aan te koppelen, een module met allerlei diagnostische tools voor netwerken, een module om kernelparameters met sysctl in te stellen of op te vragen, een module om minions te rebooten, modules voor RPM en Yum, een module voor libvirt, en nog heel wat andere.

Als er voor een bepaald Linux-commando nog geen Func-module bestaat, kun je dit heel eenvoudig op alle minions uitvoeren dankzij de CommandModule. Processen beheren is ook mogelijk met de ProcessModule. Het is bovendien niet zo moeilijk om zelf een module voor Func te maken. Dit is gewoon een Python-script, waarvoor je een template laat genereren met het commando func-create-module. Op deze manier kun je de mogelijkheden van de minions eenvoudig uitbreiden.

Func in Python-scripts

Wil je ingewikkelder opdrachten uitvoeren dan one-liners, dan kun je de Python API gebruiken. Op de wikipagina van elke module vind je informatie over de API en de datastructuren. Een voorbeeld dat de wiki geeft:

import func.overlord.client as fc

results = fc.Client("*").service.status("httpd")

for (host, returns) in results.iteritems():

if returns == 0:

fc.Client(host).reboot.reboot()

Met deze code zoek je naar minions die een webserver draaien en reboot je deze. Dit is natuurlijk nogal een geforceerd voorbeeld, maar de wiki vermeldt nog een aantal nuttiger scripts.

En verder

Func is gestart als een Fedora-project (of beter gezegd, als een Red Hat Emerging Technology project), maar hoeft op zich niet Fedora-specifiek te zijn. Voor gebruik in andere distributies hoeven alleen distributie-onafhankelijke zaken zoals het herstarten van services te worden aangepast. Maar voorlopig lijkt Func buiten de Red Hat wereld nog niet echt doorgebroken.

Je kunt Func ook integreren met een installatieserver zoals Cobbler. En je hoeft het aansturen van minions niet te centraliseren in één overlord: delegeren is ook mogelijk. Tot slot zijn er ook een aantal toepassingen geschreven die functionaliteit bovenop Func aanbieden, zoals de Func-shell.

Bron: Techworld