JTorrents
Mis experiencias en TI

Gestión de servidores con Ansible

Instalación de ansible en Debian (7) Wheezy

Ansible es un sistema de gestión de fácil configuración que se puede utilizar para automatizar y organizar las tareas de configuración del sistema para una gran red de ordenadores. Mientras que algunos otros sistemas de gestión de configuración requieren diferentes paquetes que se instalarán en los sistemas servidor y cliente (Puppet, Chef), con Ansible, sólo es necesario instalar un componente de servidor y tener acceso SSH a las máquinas cliente.

Damos por supuesto que tenemos instalado Python > 2.6
Todos los comandos aquí descritos se ejecutan en la maquina local (localhost).

Instalamos las depencias de ansible.
Ejecutar como root (o sudo):

# apt-get install python-pip
# apt-get install python-paramiko python-jinja2 python-httplib2
# pip install PyYAML

Bajamos la última versión ansible desde github.
Ejecutar como usuario:

$ git clone git://github.com/ansible/ansible.git
$ cd ansible
$ cat VERSION
1.7
$ source hacking/env-setup

(NOTA) Los dos comandos anteriores podemos sustituirlos editando nuestro .bashrc y añadiendo las siguientes líneas:

$ vi .bashrc
# Ansible enviroment
if [ -f ~/ansible/hacking/env-setup ]; then
    . ~/ansible/hacking/env-setup
fi
:wq

Copiamos nuestra clave publica a la maquina remota:

$ ssh-copy-id -i .ssh/id_rsa.pub root@maquina_remota

Como ejemplo solo utilizare un host (debian7-7) en el grupo ([develop]) pero podemos añadir los hosts que queramos y los grupos que necesitemos, uno por línea, por ejemplo:

# Grupo webapp
[webapp]
# Hots del grupo webapp
hostame-1 ansible_ssh_host=192.168.0.1
hostame-2 ansible_ssh_host=192.168.0.2
hostame-3 ansible_ssh_host=192.168.0.3
# Grupo db_hosts
[db_hosts]
# Hots del grupo db_hosts
hostame-4 ansible_ssh_host=192.168.0.4
hostame-5 ansible_ssh_host=192.168.0.5


Ejecutar como root (o sudo):

# mkdir /etc/ansible && cd $_
# mkdir group_vars
# vi hosts
[develop]
debian7-7 ansible_ssh_host=192.168.0.2
:wq
# cd group_vars
# vi develop
---
ansible_ssh_user: root
:wq

(NOTA) Nótese al principio del archivo las tres líneas "---" es imprescindible ya que ansible utiliza el lenguaje YAML.

Ahora ya podemos probar ansible con el comando:

$ ansible develop -m ping

Si funciona la respuesta debería ser:

debian7-7 | success >> {
    "changed": false,
    "ping": "pong"
}

Podemos obtener la documentación de cada modulo (-m) mediante la orden (por ejemplo modulo "apt"):

$ ansible-doc apt

Otros ejemplos de uso de comandos ad-hoc:

Actualizar la cache de apt:

$ ansible develop -m apt -a update_cache=yes

Upgrade completo al grupo develop:

$ ansible develop -m apt -a upgrade=dist
debian7-7 | success >> {
    "changed": true,
    "msg": "Reading package lists...\nBuilding dependency tree...

Reinicio del grupo develop:

$ ansible develop -m command -a "/sbin/reboot -t now"
debian7-7 | success | rc=0 >>

Instalar el paquete "foo" en el grupo develop:

$ ansible develop -m apt -a "name=foo state=installed"
debian7-7 | success >> {
    "changed": true,
    "stderr": "",
    "stdout": "Reading package lists...\nBuilding dependency tree...\nReading state information...\nThe following NEW packages will be installed:

Desinstalar el paquete "foo" en el grupo develop:

$ ansible develop -m apt -a "name=foo state=absent"
debian7-7 | success >> {
    "changed": true,
    "stderr": "",
    "stdout": "Reading package lists...\nBuilding dependency tree...\nReading state information...\nThe following packages will be REMOVED:

Elimina del cache los paquetes .deb con versiones anteriores a los programas que tienes instalados en el grupo develop:

$ ansible develop -m command -a "/usr/bin/apt-get autoclean"
Salida del comando:
debian7-7 | success | rc=0 >>
Reading package lists...
Building dependency tree...
Reading state information...
Del libcurl3-gnutls 7.26.0-1+wheezy7 [326 kB]
Del mysql-common 5.5.33+dfsg-0+wheezy1 [80.3 kB]
Del tzdata 2013h-0wheezy1 [459 kB]

Uso de playbooks en ansible:
Ver primero:
http://docs.ansible.com/playbooks_intro.html
http://docs.ansible.com/YAMLSyntax.html
http://docs.ansible.com/playbooks_best_practices.html

Los comandos ad-hoc son una buena opción, pero cuando se necesita la máxima automatización de ciertas labores como despliegues de maquinas remotas o servicios, actualización de configuraciones, el uso de “playbooks” se hace imprescindible.

Un playbook es básicamente un archivo de texto en formato YAML, en el describiremos las acciones que necesitamos realizar en las maquinas que debemos administrar, veamos un ejemplo:

Importante: Eliminar las \ de las variables  \{\{ item \}\}

$ cd ansible
$ mkdir playbooks && cd $_
$ vi develop.yml
---
- hosts: develop
  remote_user: root
  tasks:
  - name: update cache packages & ensure packages is at the latest version
    apt: update_cache=yes upgrade=dist
  - name: ensure stress & pwgen packages is installed
    apt: name=\{\{ item \}\} state=installed
    with_items:
      - stress
      - pwgen
  - name: Create a file named $item in /tmp
    action: command touch /tmp/\{\{ item \}\}
    with_items:
      - foo
      - bar
  - name: Put web page default files
    action: copy src=\{\{ item \}\} dest=/tmp/ owner=www-data group=www-data mode=0644
    with_items:
      - files/default_web_page/index.html
      - files/default_web_page/logo.jpg
:wq

NOTA: La indentación de las líneas es muy importante.

Antes de ejecutarlo podemos revisar la sintaxis del playbook para comprobar que todo está correcto:

$ ansible-playbook -i /etc/ansible/hosts playbooks/develop.yml --syntax-check --list-tasks

Salida del comando si todo está bien:

playbook: playbooks/develop.yml

play #1 (develop):
update cache packages & ensure packages is at the latest version
ensure stress & pwgen is installed
Create a file named $item in /tmp
Put web page default files

Para ejecutar el playbook:

$ ansible-playbook -i /etc/ansible/hosts playbooks/develop.yml

Salida del comando (en el caso de estar el paquete instalado y ser la última versión):

PLAY [develop] ****************************************************************

GATHERING FACTS ***************************************************************
ok: [debian7-7]

TASK: [ensure stress is at the latest version] ******************************************************
ok: [debian7-7]

PLAY RECAP ********************************************************************
debian7-7                  : ok=2    changed=0    unreachable=0    failed=0

 

Escrito por Joan Torrents el Tuesday May 27, 2014
Enlace permanente -

« Nomenclatura sobre nombres de servidores (hostname) - Script con sar para monitorizar la carga del servidor »