Curso Python DGA 2011/sistemas/admin monitor

De WikiEducator
< Curso Python DGA 2011‎ | sistemas
Revisión a fecha de 05:51 1 sep 2011; Luis.perez (Discusión | contribuciones)

(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Saltar a: navegación, buscar
Road Works.svg Trabajo en proceso, espera cambios frecuentes. Tu ayuda y retroalimentación son bienvenidos.
Ver página de charlas.
Road Works.svg


Administración y monitorización de sistemas con Python

Administración de sistemas con Fabric

¿ Qué es Fabric ?

  • Herramienta de línea de comandos y librería para facilitar la administración de sistemas y despliegue de aplicaciones a través de SSH.
  • Los scripts en fabric son python usando el api que provee.
  • Permite ejecutar comandos shell localmente o remotamente, así como subir y bajar ficheros de sistemas remotos.
  • Ejecuta mismas tareas en múltiples hosts definidos.
  • Es capaz de manejar las peticiones de input por parte de los programas ejecutados a través de la shell remota (ej: petición de passwords)

Instalación

  • Usaremos la última release 1.x, a día de hoy 1.2.1
  • Ubuntu 11.04 (natty) trae fabric 0.9.3, aunque la próxima oneiric ya saldrá con una 1.0.

Por tanto instalaremos la última release de https://github.com/fabric/fabric/downloads.

Necesitaremos:

  • tener setuptools instalada
  • python-paramiko - nos sirve el paquete que trae ubuntu

Una vez descargada la release y cumplidas las dependencias:

python setup.py install


Herramienta fab y tareas

Fabric trae la herramienta fab, con la que podemos ejecutar funciones (tareas) que escribamos en fabfile.py

# fabfile.py
def hello(name="world"):
    print("Hello {0}".format(name))
$ fab hello
Hello world
 
Done.
  • Se pueden pasar parámetros:
$ fab hello:luis
Hello luis
 
Done.
 
$ fab hello:name=luis
Hello luis
 
Done.
  • Podemos hacer tareas que llamen a tareas, puesto que las tareas son funciones python.

Ejecución de operaciones en local

# fabfile.py
from fabric.api import local
 
def sysinfo():
    cpu_info = local("cat /proc/stat")
    mem_info = local("cat /proc/meminfo")
 
    print(cpu_info)
    print(mem_info)


Ejecución de operaciones en remoto

# fabfile.py
from fabric.api import local
 
def sysinfo():
    cpu_info = run("cat /proc/stat")
    mem_info = run("cat /proc/meminfo")
 
    print(cpu_info)
    print(mem_info)
  • Si ejecutamos esta operación, dado que no hemos definido ningún host, fabric nos pedirá donde queremos ejecutar las operaciones (user@host)
$ fab sysinfo
No hosts found. Please specify (single) host string for connection:
  • Podemos definir los hosts donde ejecutar las operaciones de forma global al script:
env.hosts = ['192.168.0.11', '192.168.0.20', 'my_server']

Aunque esto asumirá que que el usuario con el que nos autenticamos es el mismo usuario que ejecuta el script.

  • Podemos poner el usuario con el que se ejecutará:
env.hosts = ['luis@192.168.0.11', 'root@192.168.0.20', 'my_server']
  • Podemos especificar hosts para una tarea en concreto:
@hosts('user1@logserver1', 'logserver')
def diskusage():
    disk_usage = run("df -h /dev/sda1")
  • ... o pasar por línea de comandos los hosts
$ fab diskusage --hosts=192.168.0.11

Roles en Fabric

Se pueden agrupar hosts de forma que se puedan ejecutar tareas para un determinado grupo, usando @roles

env.roledefs.update({
    'locales': ['192.168.1.1', '192.168.1.2'],
    'logservers': ['logserver1, logserver2']
})
 
@roles('logservers')
def diskusage():
    pass
  • También se puede ejecutar sobre un rol en concreto desde línea de comandos:
$ fab -R logservers diskusage

Subiendo y bajando ficheros

put('bin/project.zip', '/tmp/project.zip')
put('*.py', 'cgi-bin/')
put('index.html', 'index.html', mode=0755)
 
get('/path/to/remote_file.txt')

Icon present.gif
Tip: Aquí se ha descrito la funcionalidad "core" de Fabric. Sin embargo, el paquete fabric.contrib trae varias utilidades comunes. Echad un vistazo a http://docs.fabfile.org/en/latest/index.html#contrib-api