Instalación de Puppet en Solaris 10

Para instalar el agente de puppet en Solaris 10 lo mas facil es recurrir a OpenCSW. De esta forma podemos descargar el paquete y sus correspondientes dependencias (a partir de Solaris 11.2 ya viene incluido en los repositorios oficiales). 

Lo mas útil es crear un paquete que contenga el propio paquete de puppet y sus dependencias, de forma que podamos redistribuir dicho paquete en todos los servidores donde lo queramos instalar y no será necesario que todos los servidores tengan conexión a Internet. Para ello ejecutaremos:

root@solaris01 # /opt/csw/bin/pkgutil –stream –target=i386:5.10 –output /tmp/puppet.pkg –yes –download puppet
=> Fetching new catalog and descriptions (http://mirror.opencsw.org/opencsw/testing/i386/5.10) if available …
==> 3707 packages loaded from /var/opt/csw/pkgutil/catalog.mirror.opencsw.org_opencsw_testing_i386_5.10
Solving needed dependencies …
Solving dependency order …
Package list:
       CSWalternatives-1.2,REV=2013.10.15 (opencsw/testing)
       CSWaugeas-0.10.0,REV=2012.01.04 (opencsw/testing)
       CSWcas-initsmf-1.49,REV=2013.03.13 (opencsw/testing)
       CSWcas-usergroup-1.44,REV=2011.05.02 (opencsw/testing)
       CSWcommon-1.5,REV=2010.12.11 (opencsw/testing)
       CSWfacter-1.7.1,REV=2013.05.22 (opencsw/testing)
       CSWlibgcc-s1-4.8.2,REV=2013.11.08 (opencsw/testing)
       CSWlibgdbm4-1.9,REV=2011.10.24 (opencsw/testing)
       CSWlibgnugetopt0-1.3,REV=2011.07.06 (opencsw/testing)
       CSWlibiconv2-1.14,REV=2011.08.07 (opencsw/testing)
       CSWliblzma5-5.0.5,REV=2013.07.05 (opencsw/testing)
       CSWlibncurses5-5.9,REV=2011.11.21 (opencsw/testing)
       CSWlibreadline6-6.2,REV=2011.07.02 (opencsw/testing)
       CSWlibruby18-1-1.8.7p357,REV=2014.03.06 (opencsw/testing)
       CSWlibssl1-0-0-1.0.1g,REV=2014.04.08 (opencsw/testing)
       CSWlibxml2-2-2.9.1,REV=2013.08.16 (opencsw/testing)
       CSWlibz1-1.2.8,REV=2013.09.23 (opencsw/testing)
       CSWpuppet-2.7.23,REV=2013.08.15 (opencsw/testing)
       CSWruby18-1.8.7p357,REV=2014.03.06 (opencsw/testing)
       CSWrubyaugeas-0.4.1,REV=2012.03.25 (opencsw/testing)
       CSWterminfo-5.9,REV=2011.11.21 (opencsw/testing)
Total size: 9.3 MB
A local copy of CSWcommon-1.5,REV=2010.12.11 exists and is of matching size.
=> Fetching CSWlibz1-1.2.8,REV=2013.09.23 (2/21) …
A local copy of CSWlibiconv2-1.14,REV=2011.08.07 exists and is of matching size.
=> Fetching CSWliblzma5-5.0.5,REV=2013.07.05 (4/21) …
=> Fetching CSWlibxml2-2-2.9.1,REV=2013.08.16 (5/21) …
=> Fetching CSWlibgcc-s1-4.8.2,REV=2013.11.08 (6/21) …
A local copy of CSWlibgnugetopt0-1.3,REV=2011.07.06 exists and is of matching size.
A local copy of CSWterminfo-5.9,REV=2011.11.21 exists and is of matching size.
=> Fetching CSWlibruby18-1-1.8.7p357,REV=2014.03.06 (9/21) …
=> Fetching CSWlibssl1-0-0-1.0.1g,REV=2014.04.08 (10/21) …
=> Fetching CSWlibgdbm4-1.9,REV=2011.10.24 (11/21) …
=> Fetching CSWalternatives-1.2,REV=2013.10.15 (12/21) …
A local copy of CSWcas-usergroup-1.44,REV=2011.05.02 exists and is of matching size.
A local copy of CSWcas-initsmf-1.49,REV=2013.03.13 exists and is of matching size.
A local copy of CSWlibncurses5-5.9,REV=2011.11.21 exists and is of matching size.
A local copy of CSWlibreadline6-6.2,REV=2011.07.02 exists and is of matching size.
A local copy of CSWaugeas-0.10.0,REV=2012.01.04 exists and is of matching size.
=> Fetching CSWruby18-1.8.7p357,REV=2014.03.06 (18/21) …
A local copy of CSWrubyaugeas-0.4.1,REV=2012.03.25 exists and is of matching size.
=> Fetching CSWfacter-1.7.1,REV=2013.05.22 (20/21) …
=> Fetching CSWpuppet-2.7.23,REV=2013.08.15 (21/21) …
Transforming CSWcommon …
Transforming CSWlibz1 …
Transforming CSWlibiconv2 …
Transforming CSWliblzma5 …
Transforming CSWlibxml2-2 …
Transforming CSWlibgcc-s1 …
Transforming CSWlibgnugetopt0 …
Transforming CSWterminfo …
Transforming CSWlibruby18-1 …
Transforming CSWlibssl1-0-0 …
Transforming CSWlibgdbm4 …
Transforming CSWalternatives …
Transforming CSWcas-usergroup …
Transforming CSWcas-initsmf …
Transforming CSWlibncurses5 …
Transforming CSWlibreadline6 …
Transforming CSWaugeas …
Transforming CSWruby18 …
Transforming CSWrubyaugeas …
Transforming CSWfacter …
Transforming CSWpuppet …
Transforming packages into stream (/tmp/puppet.pkg) …

Install commands in dependency safe order:

pkgadd -G -d /tmp/puppet.pkg CSWcommon
pkgadd -G -d /tmp/puppet.pkg CSWlibz1
pkgadd -G -d /tmp/puppet.pkg CSWlibiconv2
pkgadd -G -d /tmp/puppet.pkg CSWliblzma5
pkgadd -G -d /tmp/puppet.pkg CSWlibxml2-2
pkgadd -G -d /tmp/puppet.pkg CSWlibgcc-s1
pkgadd -G -d /tmp/puppet.pkg CSWlibgnugetopt0
pkgadd -G -d /tmp/puppet.pkg CSWterminfo
pkgadd -G -d /tmp/puppet.pkg CSWlibruby18-1
pkgadd -G -d /tmp/puppet.pkg CSWlibssl1-0-0
pkgadd -G -d /tmp/puppet.pkg CSWlibgdbm4
pkgadd -G -d /tmp/puppet.pkg CSWalternatives
pkgadd -G -d /tmp/puppet.pkg CSWcas-usergroup
pkgadd -G -d /tmp/puppet.pkg CSWcas-initsmf
pkgadd -G -d /tmp/puppet.pkg CSWlibncurses5
pkgadd -G -d /tmp/puppet.pkg CSWlibreadline6
pkgadd -G -d /tmp/puppet.pkg CSWaugeas
pkgadd -G -d /tmp/puppet.pkg CSWruby18
pkgadd -G -d /tmp/puppet.pkg CSWrubyaugeas
pkgadd -G -d /tmp/puppet.pkg CSWfacter
pkgadd -G -d /tmp/puppet.pkg CSWpuppet
Como vemos, al final del proceso nos muestra el paso a paso de como instalarlo correctamente. Dichos comandos se pueden poner en un script de forma que la instalación consista en copiar el software y ejecutar el instalador:
root@solaris01 # ls -l | grep puppet
-rwxr-xr-x   1 root     root         883 Apr 29 16:58 install_puppet.sh
-rw-r–r–   1 root     root     32153600 Apr 29 16:56 puppet.pkg
root@solaris01 # ./install_puppet.sh

Una vez instalado podemos verificar el archivo de configuración y verificamos que en el hosts aparezca el servidor de puppet:
root@solaris01 # grep puppet /etc/hosts
X.X.X.X puppet

root@solaris01 # vi /opt/csw/etc/puppet/puppet.conf
# puppet.conf
#
# points puppet at OpenCSW default paths

[main]
   confdir = /etc/opt/csw/puppet
   config = $confdir/puppet.conf
   vardir = /var/opt/csw/puppet
   ssldir = $vardir/ssl

[agent]
   # The file in which puppetd stores a list of the classes
   # associated with the retrieved configuratiion.  Can be loaded in
   # the separate “puppet“ executable using the “–loadclasses“
   # option.
   # The default value is ‘$confdir/classes.txt’.
   classfile = $vardir/classes.txt

   # Where puppetd caches the local configuration.  An
   # extension indicating the cache format is added automatically.
   # The default value is ‘$confdir/localconfig’.
   localconfig = $vardir/localconfig
   report = true
~

En este momento ya podemos realizar un test y firmar el certificado en la parte del servidor. A continuación habilitaríamos el servicio:
root@solaris01 #  /opt/csw/bin/puppet agent –test
root@solaris01 #  svcadm enable cswpuppetd

Para parar el agente hay que deshabilitar el servicio:
 
root@solaris01 #  svcadm disable cswpuppetd
He creado algunos manifiestos específicos para solaris o que realizan una determinada acción en función del sistema operativo:

Despliegue de un fichero

root@solaris01 #cat 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”,
        }   
    }
}

Customizar el MOTD:

node ‘solaris’’ {
   include ftp
   include nicstat
   file { “/etc/motd”:
           content => “Welcome
\tServer IP address: ${ipaddress}.
\tHostname: ${fqdn}
\tOperating System: ${operatingsystem}\tRelease: ${operatingsystemrelease}
\tOS family: ${osfamily}
\tKernel: ${kernel} ${kernelversion}
\tPuppet ${puppetversion}
\tCPU: ${physicalprocessorcount}\t\t\tCores: ${processorcount}
\tMemory: ${memorysize}\tSwap: ${swapsize}
\tTimeZone: ${timezone}
\tphyisical/virtual: ${virtual}\tType: ${type}
\tManufacturer: ${manufacturer}\tModel: ${productname}
\tSerial Number: ${serialnumber}
\n”
       }
       notice(“I am running on node ${fqdn}”)
}

Instalación y configuración de Pure-ftp en Solaris 10

Pure-FTP es un servidor FTP muy potente y que permite facilmente configurar cosas que con el cliente que viene por defecto en Solaris es mas complicado, por ejemplo, enjaular usuarios.

En el repositorio de openCSW (http://www.opencsw.org) existe el paquete y las dependencias de pureFTPd, con lo que no es necesario compilar las fuentes. Para poder instalarlo en varios sistemas creo un paquete con el software y todas sus dependencias. Suponiendo que ya tenemos la aplicación pkgutil instalada en un sistema con acceso a internet, crearemos el paquete de la siguiente forma:

# PATH=$PATH:/opt/csw/bin/
# pkgutil –stream –target=i386:5.10 –output pure-ftp-dep.pkg –yes –download pureftpd
Solving needed dependencies …
Solving dependency order …
Package list:
        CSWcacertificates-20120511,REV=2012.05.11 (opencsw/testing)
        CSWcas-migrateconf-1.47,REV=2012.02.14 (opencsw/testing)
        CSWcas-preserveconf-1.42,REV=2010.11.26 (opencsw/testing)
        CSWcommon-1.5,REV=2010.12.11 (opencsw/testing)
        CSWlibssl0-9-8-0.9.8x,REV=2012.05.12 (opencsw/testing)
        CSWosslrt-0.9.8x,REV=2012.05.12 (opencsw/testing)
        CSWpureftpd-1.0.27,REV=2010.01.23 (opencsw/testing)
Total size: 4.3 MB
Esta utilidad ademas proporciona los comandos para instalar todo el software de forma correcta:
Install commands in dependency safe order:

pkgadd -d pure-ftp-dep.pkg CSWcommon
pkgadd -d pure-ftp-dep.pkg CSWcas-preserveconf
pkgadd -d pure-ftp-dep.pkg CSWcas-migrateconf
pkgadd -d pure-ftp-dep.pkg CSWcacertificates
pkgadd -d pure-ftp-dep.pkg CSWlibssl0-9-8
pkgadd -d pure-ftp-dep.pkg CSWosslrt
pkgadd -d pure-ftp-dep.pkg CSWpureftpd
Una vez instalado el software pasaremos a configurarlo. Lo primero que deberemos hacer es crear un grupo y un usuario que será el que utilice la aplicación con los usuarios virtuales.
# groupadd pftpgroup
# useradd -g pftpgroup -d /dev/null -s /bin/false pftpuser
Crearemos ademas los directorios necesarios para la aplicación. En mi caso creare un directorio /ftp donde irán todas las cuentas de usuario. También será necesario crear un directorio donde se ubicarán los ficheros de configuración del servidor.

# mkdir /ftp
# mkdir  -p /opt/csw/etc/pure-ftpd/
Una vez instalada ya podemos utilzar los comandos que proporciona pure-ftp. El principal comando para trabajar con usuarios es pure-pw. Con este comando podemos crear, modificar y borrar usuarios. Nos permitirá establecer cuotas, tamaños de ficheros, horarios de conexión, etc. Existe otra utilidad que nos permitirá convertir todos los usuarios de sistema al formato que utiliza pureftp. Para convertirlos lo haremos de la siguiente forma:
(Añadimos los directorios donde se encuentran los binarios al PATH para mayor comodidad)

PATH=$PATH:/opt/csw/bin:/opt/csw/sbin
# pure-pwconvert >> /opt/csw/etc/pure-ftpd/pureftpd.passwd
# pure-pw mkdb /opt/csw/etc/pure-ftpd/pureftpd.pdb
Entre los metodos de autenticación que permite pure-FTP utilizaremos el metodo puredb. Este método hace uso de dos ficheros, el pureftpd.passwd, que tiene un formato similar al /etc/passwd. El otro es el fichero binario que utliza pure-FTP para leer la configuración de usuarios, haciendolo que sea mas rápido que el acceso a un fichero de texto. Por tanto, cada vez que se modifica el fichero pureftpd.passwd porque se ha añadido/borrado/modificado algún usuario, es necesario confirmar los cambios en el fichero pureftpd.pdb con el comando pure-pw mkdb. Como veremos mas adelante, este último paso nos lo podemos ahorrar con el parámetro -m cuando hagamos algúna modificación de usuarios. Estos cambios siempre serán en caliente, con lo que no será necesario reiniciar el servidor de FTP.
A partir de este momento ya podemos arrancar el servidor, de la siguiente forma:

/opt/csw/sbin/pure-ftpd -j -A -lpuredb:/opt/csw/etc/pure-ftpd/pureftpd.pdb

Con la opción -j se creará el directorio home del usuario en caso de que no exista y con la opción -d le indicamos que todos los usuarios deben estar enjaulados en su home y no pueden salirse de ahí (chroot).
Veamos ahora como trabajar con usuarios con el comando pure-pw. Este comando tiene varias opciones, entre ellas useradd, usermod y userdel para añadir, modificar y borrar usuarios, respectivamente. Para crear un usuario lo haremos de la siguiente forma:

pure-pw useradd joe -u pftpuser -d /ftp/joe
Password: 
Enter it again: 
Como hemos comentado antes, los cambios se deberán aplicar en el fichero pureftpd.pdb.

pure-pw mkdb /opt/csw/etc/pure-ftpd/pureftpd.pdb
Podemos modificar también algunos parámetros como el límite del tamaño de fichero que el usuario puede subir o bajar al ftp:

pure-pw usermod joe -N 10

Si queremos aplicar directamente este cambio en el fichero pureftpd.pdb utilizaremos la opción -m:

pure-pw usermod joe -N 3 -m

Otra opción interesante es la de aplicar un horario de conexión permitido:

# pure-pw usermod joe -z 0900-1800 -> conexión de 09h a 18h
pure-pw usermod joe -z ” -> deshabilitar el control horario
pure-pw usermod joe -z 0000-0000 -> no permite las conexiones para ese usuario
Con la opción show del comando pure-pw podemos ver información del usuario: 

pure-pw show joe
Login              : joe
Password           : $2a$07$E3eQ4sJhytw.DOz3yEHIxuq34.Omp6MwIA0ZlUFagosFqqO/HOUvO
UID                : 102 (ftpuser)
GID                : 100 (ftpgroup)
Directory          : /ftp/joe/./
Full name          : 
Download bandwidth : 0 Kb (unlimited)
Upload   bandwidth : 0 Kb (unlimited)
Max files          : 0 (unlimited)
Max size           : 10 Mb (enabled)
Ratio              : 0:0 (unlimited:unlimited)
Allowed local  IPs : 
Denied  local  IPs : 
Allowed client IPs : 
Denied  client IPs : 
Time restrictions  : 0900-1800 (enabled)
Max sim sessions   : 0 (unlimited)
Para hacer mas cómoda el arranque y parada del servidor pure-FTP se puede crear un servicio de Solaris. Para ello crearemos el manifiesto y el metodo:

  • pure-ftp-manifest.xml
 
   
   
   
     
   
   
     
   
   
     
   
   
     
   
   
     
   
   
     
   
   
     
        Pure-ftp Service
     
     
        Pure-ftp service
     
   
 

  • pure-ftp-method
#!/sbin/sh
#
# Julian Garcia-Sotoca Pascual 16/07/2013
#

. /lib/svc/share/smf_include.sh

case “$1” in
start)
        /opt/csw/sbin/pure-ftpd \
–altlog /var/log/pure-ftpd.log \
–verboselog \
–login puredb:/opt/csw/etc/pure-ftpd/pureftpd.pdb \
–noanonymous \
–maxclientsnumber 100 \
–chrooteveryone \
–ipv4only \
–pidfile /var/run/pure-ftpd.pid \
–daemonize 2>&1 >/dev/null
        ;;
stop)
        /usr/bin/pkill pure-ftpd 2>&1 >/dev/null
        exit 0
        ;;
*)
        echo “Usage: $0 { start | stop }”
        exit 1
        ;;
esac
exit 0
Como vemos, se arrancará el servicio añadiendo algunas opciones mas, para que cree un fichero de log, otro con el pid y que trabaje en modo demonio, por ejemplo. Para realizar la instalación mas automatizada he creado el siguiente script:

  • inst_pureFTP.sh
:

echo “Deshabilitar FTP de solaris”
svcadm disable svc:/network/ftp:default
svcs -a | grep network/ftp:default
echo “Pulse intro para continuar”
read
clear

echo “Instalando pure-FTP”
pkgadd -d pure-ftp-dep.pkg CSWcommon
pkgadd -d pure-ftp-dep.pkg CSWcas-preserveconf
pkgadd -d pure-ftp-dep.pkg CSWcas-migrateconf
pkgadd -d pure-ftp-dep.pkg CSWcacertificates
pkgadd -d pure-ftp-dep.pkg CSWlibssl0-9-8
pkgadd -d pure-ftp-dep.pkg CSWosslrt
pkgadd -d pure-ftp-dep.pkg CSWpureftpd
echo “Pulse intro para continuar”
read
clear

echo “Creacion usuario ftp”
groupadd pftpgroup
useradd -g pftpgroup -d /dev/null -s /bin/false pftpuser
echo “Pulse intro para continuar”
read
clear

echo “Creando directorios”
mkdir /ftp
mkdir -p /opt/csw/etc/pure-ftpd/
echo “Pulse intro para continuar”
read
clear

PATH=$PATH:/opt/csw/bin:/opt/csw/sbin

echo “Importando usuarios”
echo “IMPORTANTE: los usuarios que se quieren migrar deben tener shell y home”
pure-pwconvert >> /opt/csw/etc/pure-ftpd/pureftpd.passwd
pure-pw mkdb /opt/csw/etc/pure-ftpd/pureftpd.pdb
echo “Usuarios importados:”
cut -d: -f1 /opt/csw/etc/pure-ftpd/pureftpd.passwd
echo “Pulse intro para continuar”
read
clear

echo “Instalando servicio”
cp pure-ftp-manifest.xml /var/svc/manifest/site
cp pure-ftp-method /lib/svc/method/pure-ftp
chmod u+x /lib/svc/method/pure-ftp
svccfg -v import /var/svc/manifest/site/pure-ftp-manifest.xml
svcs -a | grep pure-ftp
echo “Pulse intro para continuar”
read
clear