ADMIN-Tipp: Remote Execution

Jede Woche erscheint in unserem Newsletter ein neuer ADMIN-Tipp. Eine Sammlung aller Tipps finden Sie im Archiv der ADMIN-Tipps.

Will man Anwendungen auf verschiedene Hosts verteilen und/oder entfernt Kommandos ausführen, bieten sich etliche mächtige Werkzeuge an, darunter etwa Chef, Puppet oder Cfengine. Ist deren Komplexität aber zu viel des Guten, dann geht es auch eine Nummer kleiner gut: Mit dem Python-Tool fabric .

Das Tool fabric , das sich im Debian- und Ubuntu-Repository findet, fungiert als Python-Libary und Kommendozeilentool. Es bringt für einfache Aufgaben der Remoteadministration eine fertige Infrastruktur mit. Die zu erledigenden Aufgaben sind dabei Python-Funktionen, die im File fabfile.py im Homeverzeichnis des ausführenden Nutzers abgelegt sein müssen. Ein sehr einfaches Beispiel für ein solches fabfile könnte so aussehen:

from fabric.api import *

env.hosts = ['xxxxx.medialinx-gruppe.de']
env.user  = 'jbrendel'

def remote_uptime():
    run('uptime')

def local_uptime():
        local('uptime')

Aufgerufen passiert Folgendes:

jcb@hercules:~$ fab remote_uptime
[mail.medialinx-gruppe.de] Executing task 'remote_uptime'
[mail.medialinx-gruppe.de] run: uptime
[mail.medialinx-gruppe.de] out:  13:20:09 up 1 day, 23:52, 17 users,  load average: 0.29, 1.31, 2.42

Done.
Disconnecting from xxxxx.medialinx-gruppe.de... done.

f ab local_runtime würde genauso funktionieren und die Uptime der lokalen Maschine ausgeben.
Da die entfernt auszuführenden Kommandos vollwertige Python-Funktionen sind, kann man hier auch recht komplexe Aufgaben formulieren. Unter anderem lassen sich mit put() lokale Files auf die entfernte Maschine transferieren und dort Kommandos mittels sudo() ausführen, etwa:

from fabric.api import *

env.hosts = ['xxx.medialinx-gruppe.de'], 'yyy.medailinx-gruppe.de','zzz.medialinx-gruppe.de' ]
env.user  = 'jbrendel'

def update():
    put ("/tmp/new.config.cfg", "~/new.config.cfg")
    sudo( "mv ~/new.config.cfg /etc/dummyservice/", pty=true )
    sudo( "/etc/init.d/dummyservice restart", pty=true )

Das File als Root-User hochzuladen wäre hier nicht möglich, deshalb braucht man zuerst ein Zielverzeichnis, das man beschreiben darf, und muss in einem zweiten Schritt sudo() nutzen. Mit ein wenig Python-Know how ist hier natürlich noch sehr viel mehr möglich, als wir in diesem kurzen Tipp demonstrieren können. Hinweise gibt die ausführliche Dokumentation von fabric , Beispiele liefert ein Tutorial .

13.11.2012

Ähnliche Artikel

comments powered by Disqus
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023