Creación de módulos para puppet

Una vez puesto en marcha un servidor de Puppet es importante tener bien organizado la estructura de directorios para que no se convierta en un caos. Hay tres directorios importantes, el manifests, el modules y el files. Mi estructura actual es la siguiente:

[root@puppet puppet]# tree /etc/puppet/
/etc/puppet/
├── auth.conf
├── files
│   ├── limits.conf
│   ├── motd
│   ├── nicstat-linux
│   ├── nicstat-solarisx86
│   ├── ntp.conf
│   └── sysctl.conf
├── fileserver.conf
├── manifests
│   ├── nodes.pp
│   ├── site.pp
├── modules
│   ├── ftp
│   │   └── manifests
│   │   └── init.pp
│   ├── nicstat
│   │   └── manifests
│   │   └── init.pp
│   ├── ntp
│   │   └── manifests
│   │   └── init.pp
│   ├── sysconf
│   │   └── manifests
│   │   └── init.pp
│   └── users
│   └── manifests
│   └── init.pp
└── puppet.conf
En el manifests se ubican los principales scripts. Yo lo organizo en un site.pp que incluye el fichero nodes.pp que es donde defino las configuraciones específicas para cada nodo. En el directorio modules habrá un subdirectorio por cada módulo y dentro de este otro subdirectorio manifests y un fichero init.pp donde esta la propia definición del módulo. El último directorio importante es el files que utilizo para almacenar los ficheros de configuración estandarizados o binarios que quiero desplegar en los nodos.
Voy a analizar algunos de los ficheros comentados:
site.pp:
La idea de este fichero es que esté lo mas limpio posible para que de un vistazo sea intuitivo ver que scripts se están aplicando. En mi caso únicamente importo el nodes.pp.
[root@puppet manifests]# more site.pp
import ‘nodes.pp’
En el nodes.pp defino los nodos, filtrando por el nombre (se podría filtrar por algún otro parámetro). En cada definición de nodo incluyo los módulos que les quiero aplicar.
[root@puppet manifests]# more nodes.pp
node puppet {
    include ntp
    include nicstat
    include users
}
node /linux[1-3].enterprise.com/ {
    include ntp
    include nicstat
    include sysconf
    include users
    notice(“I am running on node ${fqdn}”)
}
node ‘solaris[1-2].enterprise.com‘ {
    include ftp
    include nicstat
    include users
    notice(“I am running on node ${fqdn}”)
}
Modulos
Para crear un módulo hay que crear una subcarpeta con el nombre del módulo. Dentro de este nuevo subdirectorio puede haber una estructura similar a la general en /etc/puppet. Como requisito fundamental es la existencia del fichero init.pp. En dicho fichero deberá existir una definición de clase (class) que será la que se importa en el nodes.pp.
He creado varios módulos para configurar determinadas funcionalidades, por ejemplo:
FTP
me aseguro que este parado por temas de seguridad.
[root@puppet manifests]# more /etc/puppet/modules/ftp/manifests/init.pp
class ftp {
    service { ‘ftp’:
        ensure => stopped,
    }
}
NTP
Existe en Puppet Forge algún módulo mas completo para el ntp, sin embargo para lo que yo busco este me es suficiente. Me aseguro de que el paquete esté instalado, el servicio arrancado y que el fichero de configuración es el mismo en todos los servidores.
[root@puppet manifests]# more /etc/puppet/modules/ntp/manifests/init.pp
class ntp {
    package { ‘ntp’:
        ensure => installed,
    }
    service { ‘ntpd’:
        ensure => running,
        require => Package[‘ntp’],
    }
    file { ‘/etc/ntp.conf’:
        notify => Service[“ntpd”],
        source => “puppet:///files/ntp.conf”,
        require => Package[‘ntp’],
    }
}
NICSTAT
Se trata de un binario para obtener estadísticas avanzadas de red. Me interesa desplegarlo en todos los nodos y ademas hay que tener en cuenta que el binario es diferente para Solaris y Linux:
[root@puppet manifests]# more /etc/puppet/modules/nicstat/manifests/init.pp
class nicstat{
    if $::osfamily == ‘Solaris’ {
        file { ‘/opt/utils/’:
            ensure => directory,
        }
        file { ‘/opt/utils/nicstat’:
            source => “puppet:///files/nicstat-solarisx86”,
        }
    } elsif $::osfamily == ‘RedHat’ {
        file { ‘/opt/utils/’:
            ensure => directory,
        }
        file { ‘/opt/utils/nicstat’:
        source => “puppet:///files/nicstat-linux”,
        }
    }
}
USERS
Con este módulo pretendo estandarizar la creación de usuarios. Podríamos crear todos los usuarios de los administradores por ejemplo o asegurarnos de que no exista determinado usuario.
[root@puppet puppet]# more /etc/puppet/modules/users/manifests/init.pp
class users{
    user { ‘jsotoca’:
        ensure => present,
        comment => ‘Julian Garcia-Sotoca’,
        home => $operatingsystem ?{
            Solaris => ‘/export/home/jsotoca’,
            default => ‘/home/jsotoca’,
        },
        managehome => true,
    }

    user { ‘baduser’:
        ensure => absent,
    }
Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s