En ocasiones es necesario realizar una ampliación del espacio de disco de una máquina virtual en entorno KVM. Esta receta de Luis Palacios (Ampliar disco qcow2) es perfectamente funcional, y he podido comprobar que funciona a la perfección para ampliar el disco de una máquina virtual Windows 7:
Posteriormente, se pueden eliminar los ficheros intermedios y el de la copia de seguridad.
Decíamos ayer que uno de los elementos del entorno de prueba de la solución con la que estoy trabajando en Ansible era un servidor CirrOS. Pero… ¿qué es un servidor CirrOS?
CirrOS es un servidor ligero, muy ligero, especialmente desarrollado para servir como demostrador de la capacidad de despliegue de máquinas en entornos cloud, como Openstack (de ahí el juego de palabras, claro). Es un servidor cuya imagen ocupa tan sólo 12 megas, se puede desplegar con 32 megas de RAM y una sola CPU. No se le pueden instalar -al menos, no fácilmente- paquetes, y las funcionalidades que ofrece son sumamente limitadas.
Por tanto, ¿qué razón habría para querer desplegar un sevidor así en un entorno? No muchas, en realidad, salvo que tu entorno de demo sea especialmente reducido, como es mi caso. :mgreen: En realidad, también tiene algún problema adicional: aunque la imagen a desplegar es una imagen QCOW2 convencional, que en Openstack despliega de manera sencilla en KVM, fuera de un entorno Openstack, aún usando KVM, da un poco de guerra para desplegarlo.Por ejemplo, en Gnome, aunque puedes crear la máquina desde el “Virtual Machine Manager”, utilizando la imagen descargada, la máquina no arranca. Es preciso exportar el fichero XML de configuración de la máquina, modificar el tipo de disco de “raw” a “qcow2″, eliminar la máquina y volver a crearla importando el XML para hacerla funcionar.
Además, un despliegue convencional de la imagen proporcionada por Launchpad tiene otro problema: como espera ser llamada desde un entorno de computación cloud espera recibir determinados parámetros de configuración a través de los servicios metadatos de éste. Y como no los recibe, se queda esperando durante 20 segundos su recepción… 20 veces.
Además, no hay gran cosa que puedas hacer, salvo acceder a ella por SSH. Ni servidor web, ni de correo, ni de nada.
Pero, pese a todo, es una pequeña maravilla que merece una oportunidad. Porque para cada uno de los problemas anteriores, existe una solución:
MYIP=$(ifconfig eth0|grep 'inet addr'|awk -F: '{print $2}'| awk '{print $1}')
while true; do echo -e "HTTP/1.0 200 OK\r\n\r\n<h1>Hi IBM. Welcome to $MYIP</h1>" | sudo nc -l -p 80 ; done&
Así que recomiendo de manera encarecida darle una oportunidad a esta pequeña maravilla. Porque lo merece.
P.D.: Otro pequeño recordatorio. Cómo configurar de manera estática el direccionamiento de red en CirrOS, y definir rutas estáticas:
CirrOS configure network:
COMPUTE: /etc/network/interfaces
auto lo
iface lo inet loopback
auto mybr0
iface mybr0 inet static
address 10.1.0.1
netmask 255.255.0.0
network 10.1.0.0
gateway 10.1.0.2
bridge_ports eth5
bridge_stp off
bridge_maxwait 0
bridge_fd 0
up route add -net 10.0.0.0 netmask 255.255.0.0 gw 10.1.0.2 dev eth5
up route add -net 10.1.0.0 netmask 255.255.0.0 gw 10.1.0.2 dev eth5
up route add -net 0.0.0.0 gw 10.1.0.2 eth5
Estas últimas jornadas he estado trabajando en un sistema de automatización de despliegue de cortafuegos en Softlayer. Llevo un tiempo trabajando con cortafuegos Vyatta, que si bien son bastante prácticos para desplegarlos tanto sobre entornos virtuales como sobre máquinas físicas, adolecen de un grave problema: carecen de un sistema de gestión centralizado. Y cuando manejas del orden de medio centenar de cortafuegos, esto se hace especialmente necesario, no sólo para mantener un sistema homogéneo y manejable, sino también para evitar, en la medida de lo posible, fallos humanos.
¿Y cuál ha sido el sistema elegido para automatizar ciertas tareas de despliegue y gestión? Pues como no podía ser menos, ha sido Ansible. Hasta este momento he sido capaz de:
Para ello, lo primero ha sido preparar un entorno de demo, que ha tenido casi más chicha que la propia configuracion con Ansible:
Ansible -y esto no pretente ser una descripción exhaustiva de sus características, por lo que ruego se me perdone cualquier incorrección que pueda perpetrar- puede actuar bien enviando comandos únicos a los equipos administrados, bien haciendo uso de recetas (playbooks). Estas recetas consisten en un grupo de tareas, plantillas y parámetros que se combinan para realizar las labores de automatización de configuración y labores de gestión en los dispositivos:
Una vez configurado el entorno, el recetario, las plantillas y parámetros, la configuración quedó lista para ser aplicada a los dispositivos. Las tareas de un recetario pueden ser ejecutadas de manera secuencial o en una sucesión específica, usando para ello las oportunas etiquetas. En mi entorno, y hasta el momento, he definido tres tipos de tareas:
Un ejemplo de ejecución de Ansible para este entorno sería el siguiente:
i82hisaj@debian:~/ansible/vyos# ansible-playbook main.yml -t initial
PLAY [all] ********************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.122.252]
ok: [192.168.122.253]
TASK: [initial-config | upload script for configuring description] ************
changed: [192.168.122.252]
changed: [192.168.122.253]
TASK: [initial-config | run script for configuring description] ***************
changed: [192.168.122.252]
changed: [192.168.122.253]
TASK: [initial-config | debug var=desc_value.stdout_lines] ********************
ok: [192.168.122.253] => {
"desc_value.stdout_lines": "{{ desc_value.stdout_lines }}",
"item": ""
}
ok: [192.168.122.252] => {
"desc_value.stdout_lines": "{{ desc_value.stdout_lines }}",
"item": ""
}
PLAY RECAP ********************************************************************
192.168.122.252 : ok=4 changed=2 unreachable=0 failed=0
192.168.122.253 : ok=4 changed=2 unreachable=0 failed=0
i82hisaj@debian:~/ansible/vyos# ansible-playbook main.yml -t add
PLAY [all] ********************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.122.253]
ok: [192.168.122.252]
TASK: [rules | retrieve Description for a firewall] ***************************
changed: [192.168.122.252]
changed: [192.168.122.253]
TASK: [rules | upload script for configuring description] *********************
changed: [192.168.122.252]
changed: [192.168.122.253]
TASK: [rules | run script for configuring description] ************************
changed: [192.168.122.252]
changed: [192.168.122.253]
TASK: [rules | debug var=desc_value.stdout_lines] *****************************
ok: [192.168.122.252] => {
"desc_value.stdout_lines": [
"Outside In"
],
"item": ""
}
ok: [192.168.122.253] => {
"desc_value.stdout_lines": [
"Outside In"
],
"item": ""
}
PLAY RECAP ********************************************************************
192.168.122.252 : ok=5 changed=3 unreachable=0 failed=0
192.168.122.253 : ok=5 changed=3 unreachable=0 failed=0
i82hisaj@debian:~/ansible/vyos# ansible-playbook main.yml -t delete
PLAY [all] ********************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.122.252]
ok: [192.168.122.253]
TASK: [initial-config | debug var=desc_value.stdout_lines] ********************
ok: [192.168.122.252] => {
"desc_value.stdout_lines": "{{ desc_value.stdout_lines }}",
"item": ""
}
ok: [192.168.122.253] => {
"desc_value.stdout_lines": "{{ desc_value.stdout_lines }}",
"item": ""
}
TASK: [rules | upload script for deleting rule] *******************************
changed: [192.168.122.252]
changed: [192.168.122.253]
TASK: [rules | run script for configuring description] ************************
changed: [192.168.122.253]
changed: [192.168.122.252]
TASK: [rules | debug var=desc_value.stdout_lines] *****************************
ok: [192.168.122.253] => {
"desc_value.stdout_lines": "{{ desc_value.stdout_lines }}",
"item": ""
}
ok: [192.168.122.252] => {
"desc_value.stdout_lines": "{{ desc_value.stdout_lines }}",
"item": ""
}
PLAY RECAP ********************************************************************
192.168.122.252 : ok=5 changed=2 unreachable=0 failed=0
192.168.122.253 : ok=5 changed=2 unreachable=0 failed=0
Algunas ideas hasta el momento:
En resumen, si bien Ansible este caso requiere de bastante trabajo para poder realizar de manera efectiva la automatización del despliegue y gestión de cortafuegos (vyatta, en este caso), las ventajas que proporciona y el trabajo final que ahorra hacen que valga la pena. Como diría nuestro amigo Barney, en este caso nos encontramos claramente por encima de la diagonal Vicky Mendoza: