Vagrant: Ignoring gem because its extensions are not built.

Comenzando cursos actualicé a la última version de vagrant y comencé a tener un error en las gemas de ruby instaladas:

$ vagrant version
Ignoring nokogiri-1.10.5 because its extensions are not built.  Try: gem pristine nokogiri --version 1.10.5
Ignoring ovirt-engine-sdk-4.3.0 because its extensions are not built.  Try: gem pristine ovirt-engine-sdk --version 4.3.0
Installed Version: 2.2.7
Latest Version: 2.2.7

You're running an up-to-date version of Vagrant!

Si bien todo el funcionamiento de vagrant que probé no tenía problemas, el error aparecía previo a la ejecución de cada comando vagrant.

Las sugerencias sugeridas de correccion de ejecutar gem no funcionaron tuve unos errores de permisos.

Revisando documentación vi que el error podría estar en el código de los plugins de vagrant (que agregan funcionalidad) y ejecuté el comando para borrarlos y reinstalarlos:

$ vagrant plugin expunge --reinstall

This command permanently deletes all currently installed user plugins. It
should only be used when a repair command is unable to properly fix the
system.

Continue? [N]: y

All user installed plugins have been removed from this Vagrant environment!

Vagrant will now attempt to reinstall user plugins that were removed.
Installing the 'vagrant-aws' plugin. This can take a few minutes...
Fetching: iniparse-1.5.0.gem (100%)
Fetching: xmlrpc-0.3.0.gem (100%)
Fetching: formatador-0.2.5.gem (100%)
[...]
Fetching: faraday_middleware-0.14.0.gem (100%)
Fetching: vultr-0.4.3.gem (100%)
Fetching: vagrant-vultr-0.1.2.gem (100%)
Installed the plugin 'vagrant-aws (0.7.2)'!
Installing the 'vagrant-cachier' plugin. This can take a few minutes...
Installed the plugin 'vagrant-cachier (1.2.1)'!
Installing the 'vagrant-scp' plugin. This can take a few minutes...
Installed the plugin 'vagrant-scp (0.5.7)'!
Installing the 'vagrant-vultr' plugin. This can take a few minutes...
Installed the plugin 'vagrant-vultr (0.1.2)'!

La reinstalación como se puede ver, descargó nuevamente las gemas y las compiló junto con el plugin actualizado. Esto solucionó el problema definitivamente:

$ vagrant version
Installed Version: 2.2.7
Latest Version: 2.2.7

You're running an up-to-date version of Vagrant!

Espero esta información sea de utilidad pues me llevó un rato interesante llegar a la solución.

Instalar Docker con Ansible

Instalar en Ubuntu 16.04 con Ansible docker engine y docker-compose.

- hosts: all
  become: true

  tasks:
    - name: ensure repository key is installed
      apt_key:
        id: "58118E89F3A912897C070ADBF76221572C52609D"
        keyserver: "hkp://p80.pool.sks-keyservers.net:80"
        state: present

    - name: ensure docker registry is available
      # Ubuntu 16.04 LTS
      apt_repository: repo='deb https://apt.dockerproject.org/repo ubuntu-xenial main' state=present

    - name: ensure docker and dependencies are installed
      apt: name={{ item }} update_cache=yes
      with_items:
        - docker-engine
        - docker-compose

    # To enable insecure registries with Docker
    #- name: ensure docker can use insecure registries in 10.1.0.0/16
    #  lineinfile: "dest=/etc/default/docker regexp=^DOCKER_OPTS line=DOCKER_OPTS='--insecure-registry 10.1.0.0/16'"

    # Optional if you are provisioning vagrant
    #- name: add vagrant to docker group
    #  user: name=vagrant groups=docker append=yes

    - service: name=docker state=restarted

Configuración de provision con Vagrant:

  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "playbook.yml"
    ansible.compatibility_mode = "2.0"
  end

LXC en Debian con Ansible

Desde antes del 2013 vengo insitiendo con las ventajas de los containers en Linux, ya que permiten un rápido despliegue de muchos sistemas Linux corriendo en forma independiente.

En 2014 había hecho experiencias para tener con una máquina virtual de DigitalOcean muchos contenedores Linux instalados y prestando servicios y en 2016 tuve la oportunidad de compartir en forma práctica con la comunidad de Paysandú un ejemplo de uso de contenedores.

Hace unos meses atrás armé un perfil de vagrant (Vagrantfile) que permite levantar una máquina virtual con Debian e instalar (aprovisionar) un servidor de contenedores LXC, y un primer contenedor de pruebas.

Este artículo tiene por objetivo, compartir esa configuración, para que la pueda usar quién desee.

Repositorio: debian-lxc-ansible

El aprovisionamiento se realiza mediante Ansible, por lo que es fácil de parametrizar y adaptar.

Una vez levantado el primer contenedor (que ya queda en el aprovisionamiento inicial, luego de correr vagrant up) es muy fácil levantar más contenedores con los comandos normales.

También, en el directorio /vagrant/utils se entregan scripts (requieren revisión y adaptación a la instalación particular) que sirven cómo muestra de cómo levantar containers para producción:

a) Levantar un container con sitio web funcional

/vagrant/utils/create-container.sh name

b) Borrar el container creado con el script anterior

/vagrant/utils/destroy-container.sh name

c) Crear una página web para ver el status de los containers a través de web en el servidor lxc

/vagrant/utils/status.sh

Toda esta instalación, obviamente puede ser modificada y mejorada. Si desean compartir sus mejoras conmigo lo pueden hacer a través de Merge Request.

vagrant destroy no borra la máquina virtual

Hace tiempo que tengo una máquina virtual que no consigo borrar (destroy). El problema nació, según recuerdo, a partir instancia que intenté levantar con un provider en una nube externa que no estaba correctamente configurado y vagrant marcó la instalación como abortada.

En concreto la VM no existe más, la carpeta de Vagrantfile tampoco existe más y el comando vagrant global-status seguía mostrando allí la máquina:

$ vagrant global-status
id       name    provider   state   directory                           
------------------------------------------------------------------------
d0c7c28  default virtualbox aborted /Users/rodolfo/Vagrant/cloud    

The above shows information about all known Vagrant environments
on this machine. This data is cached and may not be completely
up-to-date. To interact with any of the machines, you can go to

Antes de borrar el directorio con toda la información de vagrant ˜/.vagrant.d encontré que existe el modificador --prune para la opción vagrant-status:

$ vagrant global-status --help
Usage: vagrant global-status

        --prune                      Prune invalid entries.
    -h, --help                       Print this help

Y la ejecución limpió los datos de la máquina virtual inexistente:

$ vagrant global-status
id       name   provider state  directory                           
--------------------------------------------------------------------
There are no active Vagrant environments on this computer! Or,
you haven't destroyed and recreated Vagrant environments that were
started with an older version of Vagrant.

problema solucionado!

screencast

OpenStack Mitaka, instalación Just For Fun

Siguiendo mi anterior artículo sobre mis primeras impresiones sobre OpenStack Mitaka, aquí está un breve screencast de unos minutos sobre como instalarlo en un ambiente virtualizado con Virtualbox y Vagrantfile:

El archivo Vagrantfile necesario para la instalación, es el siguiente:

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.vm.box = "puppetlabs/centos-7.2-64-nocm"

  config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.synced_folder ".", "/vagrant", disabled: true

  config.vm.provider "virtualbox" do |vb|
    vb.cpus = 2
    vb.memory = "4096"
  end

  config.vm.provision "shell", inline: <<-SHELL
     sed -i s/enabled=1/enabled=0/ /etc/yum.repos.d/epel.repo
     yum -y update
     systemctl stop NetworkManager 
     systemctl stop firewalld
     systemctl disable NetworkManager 
     systemctl disable firewalld
     systemctl enable network
     setenforce 0
     echo -e "LANG=en_US.utf-8\nLC_ALL=en_US.utf-8" > /etc/environment
     yum install -y https://www.rdoproject.org/repos/rdo-release.rpm
     yum update -y
     yum install -y openstack-packstack vim
     packstack --gen-answer-file=/root/answers.txt
     sed -i s/CONFIG_CINDER_INSTALL=y/CONFIG_CINDER_INSTALL=n/ /root/answers.txt
     sed -i s/CONFIG_SWIFT_INSTALL=y/CONFIG_SWIFT_INSTALL=n/ /root/answers.txt
     sed -i s/CONFIG_CEILOMETER_INSTALL=y/CONFIG_CEILOMETER_INSTALL=n/ /root/answers.txt
     sed -i s/CONFIG_AODH_INSTALL=y/CONFIG_AODH_INSTALL=n/ /root/answers.txt
     sed -i s/CONFIG_GNOCCHI_INSTALL=y/CONFIG_GNOCCHI_INSTALL=n/ /root/answers.txt
     sed -i s/CONFIG_NAGIOS_INSTALL=y/CONFIG_NAGIOS_INSTALL=n/ /root/answers.txt
  SHELL
end

Confío esto sea de utilidad para que puedas probar OpenStack.

Packer crea tus imágenes en cualquier lugar

hero_image-d2e0f00a

Desde que Martín Loy me sugirió probar Packer para crear mis propias imágenes (box) para Vagrant he descubierto una herramienta que me ha dado muchas satisfacciones.

A partir de una simple descripción en un archivo json, Packer crea una máquina virtual en múltiples plataformas, instala el sistema operativo y lo aprovisiona, para finalizar creando una imagen de dicha máquina virtual para futuros usos.

Así Packer puede crear una AMI para Amazon EC2,  un snapshot para DigitalOcean, Docker, o Google Compute Engine, una imagen para OpenStack o Qemu, un OVF para Virtualbox, un VMX para VMWare o un box para Vagrant.

A partir de la ejecución un único comando

$ packer build centos-7.1.1503-x86_64.json

se obtiene una imágen pronta para re-utilizar las veces que sea necesarias.

==> Builds finished. The artifacts of successful builds are:
--> virtualbox-iso: 'virtualbox' provider box: build/centos-7.1.1503-x86_64.box

Con la ventaja de poder «perfeccionar» la descripción json y volver a generar una imágen cada vez más adecuada para las necesidades personales.

Hay que reconocer que la gente de HashiCorp tiene muy claro los conceptos de automatización.