jueves, 19 de marzo de 2015

Maintain known_hosts file with a puppet class

Each time an ssh client gets connected to another ssh remote host, a known_hosts file is generated or updated based on the remote host public key.

The purpose of this file is well explaines on the following link: http://en.wikibooks.org/wiki/OpenSSH/Client_Configuration_Files#.7E.2F.ssh.2Fknown_hosts

Let's say that we have a network with 100 servers and each time we add another server to this network all the machines need to update the known_hosts file with the new public key. 

First step: ask the new machine for it's public key with ssh-keyscan:

# ssh-keyscan localhost/remotehost
# localhost SSH-2.0-OpenSSH_5.3
localhost ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAygRKDjzHw1a1L79f5rNaGlqPUDndZv9KhtZPG2MYrUrU/9NiBOiVDWwllUwWXQkLY3fhdTVncjGfzn4oc09876J3uXZJaNWr0PZpD8S7Y6+50iZWYVA0fTM0j32WdD3MMfJjCtrXo+/gDx9+XiQPXlWqkuy5L5PRIvjIzVeZwL6BDDalmQXx3Jw5QcfQn9Bc7m+Bw7ZO80mxnFnKH5zZa8jdjd6XPSLXN0Q+5UlvZ5o5hxaFA+4ywtvKbF6avlQj5rm9+6kGUkVLIZRVw+lkkGqSixsTMGC3mZURH2s38UB1OjHXQSW8DP/mImcAAQWB3V5JDHbswee99C8CU6ekcw==

And manually append the output to your ssh_known_hosts/known_hosts file in the proper format (man ssh-keyscan):

     Output format for rsa1 keys:

     host-or-namelist bits exponent modulus

     Output format for rsa and dsa keys:

     host-or-namelist keytype base64-encoded-key

     Where keytype is either “ssh-rsa” or “ssh-dss”.


Distribute this file with a puppet class on your nodes and you won't be prompted again to add this new key into your known_hosts/ssh_known_hosts file at the first login attempt. 

For sure this is far from perfect, but solves the problem in a short time. 

martes, 10 de marzo de 2015

Puppet: estructura de un módulo y como invocar a sus clases

Dicen que es de sabios cambiar de opinión, pero también es de idiotas permanecer aferrados. Como sea, ahora que he estado aprendiendo algo de puppet, he tenido que generarme algunos módulos para hacer algunas tareas básicas de configuración en mis nodos. Para lo que es bueno recordar las siguientes referencias; basado en mi siguiente estructura de directorios:

# tree
.
└── base
    ├── files
    │   ├── hosts
    │   ├── motd
    │   └── vimrc
    ├── manifests
    │   ├── hosts.pp
    │   ├── init.pp
    │   ├── motd.pp
    │   └── vimrc.pp
    └── tests
        └── init.pp

4 directories, 8 files

Tendría que llamar a las clases de la siguiente manera:

# cat ../manifests/site.pp
node 'foo-host' {
        include base::hosts
}

node 'default' {
        include base::motd
        include base::vimrc
        include base::hosts
}

jueves, 5 de marzo de 2015

Remember how to nat your network

Is a good idea to remember how to nat a network, so the lessons learned are always good lessons. This is for most linux distributions and not permanent changes (let's say a reboot will destroy this change).

# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Also make sure we have a default gateway on the internal network:

# route add default gw aaa.bbb.ccc.ddd

And that's it.

More details on: http://www.revsys.com/writings/quicktips/nat.html

jueves, 26 de febrero de 2015

PostOps: A Non-Surgical Tale of Software, Fragility, and Reliability

De laggard, pero no es tarde para recuperar el tiempo perdido:

PostOps: A Non-Surgical Tale of Software, Fragility, and Reliability

Si tienen algún tiempo pueden echarle ojo, es muy ameno.

miércoles, 18 de febrero de 2015

Primeras pruebas con chef

Dado que voy a necesitar de una manera sencilla de configurar algunos ambientes e instalar sus respectivos paquetes, anduve rascandole un poco para encontrar la manera menos dolorosa de hacerlo. Hubiera podido hacer algunos scripts con bash o perl, pero si quiero aprender algo que me sirve técnicamente en un futuro y además de eso no me absorba tanto tiempo encontré que chef podría solucionarme este particular problema.

Con chef se definen recetas de modo que al aplicar una receta, se logra instalar alguna aplicación en el orden en el que lo definimos, digamos:


  1. Instala un servidor web
  2. Habilita el servidor web al momento de arrancar el equipo
  3. Configura el archivo /var/www/index.html con el contenido de /var/usr/my_index.html
  4. Configura httpd.conf con el contenido de /var/usr/my_httpd.conf
  5. etc.
De modo que no se pierde tiempo en hacer un script y no se diga en cada una de las excepciones entre cada servidor, en caso de tratarse de un servidor web, uno de DB, otro de archivos, cada uno son su perfil específico.

El gran pero que he encontrado con chef en mi caso particular es el siguiente: chef utiliza un programa llamado ohai que obtiene muchas de las características del sistema, cpu, usuarios, grupos, uptime, parámetros del kernel y otros. Dado que mi equipo de pruebas está ligado a un servidor LDAP, por alguna razón ohai se está trayendo todos los grupos de LDAP, generando así un output como de 7 a 8MBs. Al momento de hacer un bootstrap, el cual a su vez llama a ohai, el servidor me niega el output dado que es demasiado grande:

"ERROR: 413 "Request Entity Too Large"

Estuve rascandole en irc.freenode.net en #chef, en la documentación, así como en el ticket https://tickets.opscode.com/browse/CHEF-4912, y la solución ha sido que vaya y edite un archivo específico para deshabilitar un plugin, el cual no deshabilita la consulta de grupos y usuarios. De modo que sin solución y sin afán de estar perdiendo mas tiempo en el tema, mejor brincaré a puppet, que por cierto he leído supera por mucho a chef. 

viernes, 13 de febrero de 2015

Del chef fundamentals

tox@foo:~/chef_repo$ chef-apply hello.rb
Recipe: (chef-apply cookbook)::(chef-apply recipe)
  * file[motd] action create
    - create new file motd
    - update content in file motd from none to b94d27
    --- motd    2015-02-13 15:27:22.082862620 -0800
    +++ ./.motd20150213-8088-rymt9q     2015-02-13 15:27:22.082862620 -0800
    @@ -1 +1,2 @@
    +hello world
tox@foo:~/chef_repo$

Un cambio al hello.rb

tox@foo:~/chef_repo$ chef-apply hello.rb
Recipe: (chef-apply cookbook)::(chef-apply recipe)
  * file[motd] action create
    - update content in file motd from b94d27 to c38c60
    --- motd    2015-02-13 15:27:22.082862620 -0800
    +++ ./.motd20150213-8404-i9zkrw     2015-02-13 15:30:30.605742425 -0800
    @@ -1,2 +1,2 @@
    -hello world
    +hello chef
tox@foo:~/chef_repo$