viernes, 31 de mayo de 2019

Contenedor Repositorio en proxmox

En un post anterior puse en marcha un servidor proxmox en un servidor de aula.
En este otro ví como restaurar máquinas virtuales desde los backups de dichos contenedores.

En esté voy a intentar recordar como realicé el primero de ellos, el de repositorio, basándome el el siguiente post de Esteban:

https://enavas.blogspot.com/2018/02/virtualizacion-del-mirror-y-repositorio.html


La idea es crear una máquina que nos sirva de servidor web dónde tengamos alojado un mirror del repositorio de ubuntu bionic. Este repositorio que crearemos será un espejo del de nuestros compañeros de la sección AdministracionSI, y es desde donde se actualizan nuestros equipos de linex.

Además crearemos otro repositorio local propio del centro donde podremos añadir los paquetes que queramos y para que estén accesibles desde todo el centro. Así por ejemplo, para instalar VirtualBox no será necesario ni colocar el repositorio de VirtualBox, ni descargar el paquete e instalarlo a mano. Símplemente lo descargamos en ésta máquina, lo añadimos a nuestro repositorio local y ya podremos instalarlo desde cualquier máquina del centro con una tarea puppet, pkgsync, o directamente con un apt install.

Comienzo a intentar recordar. Todo este proceso que detallo a continuación da lugar al backup del contenedor repositorio que vimos en el post anterior.

- Lo primero es crear una máquina nueva a partir de la plantilla de debian 9 que anteriormente hemos descargado, pulsando el botón "Create CT" en la parte superior derecha del entorno de administración web. En la siguiente web puedes ver el proceso aunque es muy intuitivo.

http://somebooks.es/crear-contenedores-linux-partir-plantillas-proxmox-ve/

A la máquina le he dado 1 Giga de Ram y 512 de swap. Como va a albergar el mirror completo le he dado 400 GB de disco para que haya espacio suficiente. Una vez creada se puede aumentar el tamaño de disco cuando haga falta. La ram , swap y procesador se puede modificar sin problema.

- Después de creada la maquina lo primero es darlo de alta el la base de datos ldap para que coja siempre la misma ip. Yo le doy ip dentro de la rama de controlies Hardware-hosts.
Como se puede ver aquí, al seleccionar la máquina, en la sección de "network" podemos ver la mac que le ha asignado pve.
 - Actualizamos el sistema con una apt update, apt-upgrade

CREAR MIRROR LOCAL

- Lo siguiente sería ya crear el mirror. En la siguiente página de Esteban Navas puedes ver cómo hacerlo:


Básicamente es instalar un servidor apache, el paquete apt-mirror y colocar un cron para que se actualice y limpie por las noches el repositorio. Además hay que configurar qué repositorio queremos tener un espejo. Como vemos se configura en  /etc/apt/mirror.list.
En nuestro caso vemos que son los repositorios bionic, bionic-updates, bionic-backports, bionic-security de ubuntu y los de bionic y linex de la sección, (tanto en 32 como en 64 bits). 
También hacemos del repositorio de google-chrome de 64 bits.

root@repositorio:~# cat /etc/apt/mirror.list
############# config ##################
#
# set base_path    /var/spool/apt-mirror
#
# set mirror_path  $base_path/mirror
# set skel_path    $base_path/skel
# set var_path     $base_path/var
# set cleanscript $var_path/clean.sh
# set defaultarch  <running host architecture>
# set postmirror_script $var_path/postmirror.sh
# set run_postmirror 0
set nthreads     20
set _tilde 0
set limit_rate 2000k 

#
############# end config ##############
#

#########    Repositorios Desarrollo para ubuntu bionic 18.04 Arquitectura i386  ########################
#########################################################################################################
deb-i386 http://desarrollo.educarex.es/es.archive.ubuntu.com/ubuntu/ bionic main restricted universe multiverse
deb-i386 http://desarrollo.educarex.es/es.archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-i386 http://desarrollo.educarex.es/es.archive.ubuntu.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-i386 http://desarrollo.educarex.es/security.ubuntu.com/ubuntu/ bionic-security main restricted universe multiverse
deb-i386 http://desarrollo.educarex.es/solointranet/ubuntu/bionic/ bionic linex
deb-i386 http://linex.educarex.es/ubuntu/bionic/ bionic linex


#########    Repositorios Desarrollo para ubuntu bionic 18.04  Arquitectura amd64  ########################
###########################################################################################################

deb-amd64 http://desarrollo.educarex.es/es.archive.ubuntu.com/ubuntu/ bionic main restricted universe multiverse
deb-amd64 http://desarrollo.educarex.es/es.archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-amd64 http://desarrollo.educarex.es/es.archive.ubuntu.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-amd64 http://desarrollo.educarex.es/security.ubuntu.com/ubuntu/ bionic-security main restricted universe multiverse
deb-amd64 http://desarrollo.educarex.es/solointranet/ubuntu/bionic/ bionic linex
deb-amd64 http://linex.educarex.es/ubuntu/bionic/ bionic linex

############ REPOSITORIO DE GOOGLE   #####################################################################

deb-amd64 http://dl.google.com/linux/chrome/deb/ stable main


################### limpiar repos ###########################################################
#
clean http://desarrollo.educarex.es/es.archive.ubuntu.com/ubuntu/
clean http://desarrollo.educarex.es/security.ubuntu.com/ubuntu/ 
clean http://desarrollo.educarex.es/solointranet/ubuntu/
clean http://linex.educarex.es/ubuntu/bionic/
clean http://dl.google.com/linux/chrome/deb/

- Para comenzar a crear el repositorio, basta con lanzar el proceso apt-mirror o bien esperar que llegue la hora del cron que hemos añadido.


CREAR REPOSITORIO LOCAL

- Para crear un repositorio local usamos el paquete reprepro. En el siguiente post de Esteban puedes verlo:


Básicamente instalar reprepro, ya que apache lo tenemos instalado, generar una clave para firmar el repositorio y copiar el id de la clave generada y crear el archivo de configuración:

root@repositorio:~# cat /var/www/html/ies/conf/distributions 
Origin: IES Fuente Roniel
Label: Ubuntu Bionic Beaver packages
Suite: bionic
Codename: bionic
Architectures: amd64 i386
Components: main
Description: Paquetes adicionales para el IES
DebIndices: Packages Release . .gz .bz2
SignWith: id_clave_generada
root@repositorio:~# 

Que como vemos nos crea un repositorio para ubuntu bionic tanto en i386 como amd64. Sólo habría que cambiar y poner la id de la clave generada y en todo caso los campos Origin y Description que son comentarios.

Creamos enlaces y demás, viene bien explicado en la web de Esteban, y ya solo queda descargar los paquetes que queremos incorporar al repositorio (y los descargo en/var/www/html/paquetes/ ) y luego los añadimos desde la carpeta de reprepro /var/www/html/ies/ con la orden: reprepro includedeb bionic paquete.deb.
 
COLOCAR REPOSITORIOS EN CLIENTES

Una vez creados los respositorios tendremos que cambiar el sources.list en los clientes.

Yo me ayudo de la tarea apt version 2.4.0 que se puede encontrar en puppetlabs y se puede descargar desde el siguiente enlace:

https://forge.puppet.com/v3/files/puppetlabs-apt-2.4.0.tar.gz


Utililizo los siguientes recursos puppet:


# borramos los archivos de fuentes antiguos ya que los vamos a crear con el modulo puppetlabs-apt
#        Modificado modulo apt para que deje /etc/apt/sources.list vacío siempre y fuentes se
#       gestionen por puppet

 # si queremos borrar archivos antiguos los ponemos aquí

        file {"/etc/apt/sources.list.d/repoXubuntu.list":
                ensure => absent;
        }
# borramos el sources.list ya que los que vamos a crear los ponemos en /etc/apt/sources.list.d/
        file {"/etc/apt/sources.list":
                content => "# No anadir repositorios aquí, colocarlos en /etc/apt/sources.list.d/";
        }
        # fijamos variables para repositorios
        case $lsbdistcodename {
                "bionic": {
                        $mirror='mirror'
                        $mirrories='mirror2'
                }
        }
       # obtenemos claves de repositorio desconocidas
        exec { "getrepositorieskeys":
                command => '/usr/local/sbin/launchpad-getkeys',
                refreshonly => true
        }
        # añadimos los repositorios del centro con el recurso de puppetlabs apt
        apt::source { "es.archive.ubuntu.com-${lsbdistcodename}":
# Si queremos cambiar a la de desarrollo comentamos la primera location y descomentamos la 2ª
                location => "http://${mirror}.${domain}/es.archive.ubuntu.com/ubuntu/",
#                location => "http://desarrollo.educarex.es/es.archive.ubuntu.com/ubuntu/",
                repos    => 'main restricted universe multiverse',
                release  => "${lsbdistcodename}",
        }
        apt::source { "es.archive.ubuntu.com-${lsbdistcodename}-updates":
# Si queremos cambiar a la de desarrollo comentamos la primera location y descomentamos la 2ª# #                location => "http://${mirror}.${domain}/es.archive.ubuntu.com/ubuntu/",
#                location => "http://desarrollo.educarex.es/es.archive.ubuntu.com/ubuntu/",
                repos    => 'main restricted universe multiverse',
                release  => "${lsbdistcodename}-updates"
        }
        apt::source { "es.archive.ubuntu.com-${lsbdistcodename}-backports":
# Si queremos cambiar a la de desarrollo comentamos la primera location y descomentamos la 2ª
                location => "http://${mirror}.${domain}/es.archive.ubuntu.com/ubuntu/",
#               location => "http://desarrollo.educarex.es/es.archive.ubuntu.com/ubuntu/",
                repos    => 'main restricted universe multiverse',
                release  => "${lsbdistcodename}-backports"
        }

        apt::source { "security.ubuntu.com-${lsbdistcodename}":
# Si queremos cambiar a la de desarrollo comentamos la primera location y descomentamos la 2ª
                location => "http://${mirror}.${domain}/security.ubuntu.com/ubuntu",
#                location => "http://desarrollo.educarex.es/security.ubuntu.com/ubuntu/",
                repos    => 'main restricted universe multiverse',
                release  => "${lsbdistcodename}-security"
        }
   # añadimos repositorio desarrollo.educarex.es
        apt::source { "solointranet-${lsbdistcodename}":
# Si queremos cambiar a la de desarrollo comentamos la primera location y descomentamos la 2ª#                location => "http://${mirror}.${domain}/solointranet/ubuntu/${lsbdistcodename}",
#        location => "http://desarrollo.educarex.es/solointranet/ubuntu/${lsbdistcodename}",
                release  => "${lsbdistcodename}",
                repos    => 'linex',
        }
        # añadimos repositorio linex.educarex.es
        apt::source { "linex.educarex.es-${lsbdistcodename}":
# Si queremos cambiar a la de desarrollo comentamos la primera location y descomentamos la 2ª               location => "http://${mirror}.${domain}/linex.educarex.es/ubuntu/${lsbdistcodename}",
#                 location => "http://linex.educarex.es/ubuntu/${lsbdistcodename}",
                release  => "${lsbdistcodename}",
                repos    => 'linex',
        }
        # añadimos repositorio local del centro
        apt::source { "repositorio-local-${lsbdistcodename}":
                location => "http://${mirror}.${domain}/ies",
                release    => "${lsbdistcodename}",
                repos    => 'main',
        }
        #añadimos repositorio de google chrome para tener actualizado navegador
       apt::source { "dl.google.com":
               architecture => "amd64",
               release    => "stable",
               location => "http://${mirror}.${domain}/dl.google.com/linux/chrome/deb/",
               repos => 'main',
       }   
   # y anadimos la clave de repositorio de fuenteroniel

        exec { "AnadeClaveFuenteroniel":
                command => "wget -O- http://repositorio/ies/ies.asc  > iesrepositorio.asc;cat iesrepositorio.asc| apt-key add -",
                cwd => "/root",
                path => "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                timeout => 3600,
                unless => "apt-key list|grep id_clave_repositorio_reprepro",
        }
     
Con esta tarea dejamos el /etc/apt/sources.list vacio y cada repositorio lo colocamos en el directorio /etc/apt/sources.list.d/
 
Una peculiaridad es que los repositorios apuntan a  la variable mirror y mirror2, estos son alias, bien lo podemos cambiar en la tarea por 
                         $mirror='repositorio.fuenteroniel'

 o bien crear un alias en phpldapadmin para la máquina en el directorio hosts => nombredelcentro:

Le damos a copiar este objeto

y le cambiamos el dc, asociate_domain y cNAMErecord.



así vemos que por ejemplo el del repositorio local queda:

administrador@informatico-pro:~$ cat /etc/apt/sources.list.d/repositorio-local-bionic.list 
# This file is managed by Puppet. DO NOT EDIT.
# repositorio-local-bionic
deb http://mirror.fuenteroniel/ies bionic main
administrador@informatico-pro:~$ 

mirror.fuenteroniel lo resolvería dns por el nombre de la máquina: repositorio.fuenteroniel.
De esta manera podemos tener varios repositorios y para cambiarlo tan sólo tendríamos que cambiar elAsocciatedDomain en la base de datos de LDAP.


miércoles, 29 de mayo de 2019

Servidor Proxmox

Hace unos meses pude asistir a un curso impartido por Esteban Navas sobre Proxmox.
En él vimos la gran utilidad de esta herramienta en nuestros centros.
Así que para comenzar a ponerlo en marcha en el mío he comenzado instalando un servidor proxmox.

Dado que no necesitamos grandes recursos, para ello he utilizado con los que contaba en el centro:
- Un servidor de aula Telefónica: Es un equipo con 4 procesadores intel corre2 a 2,4 GHz, y 8 Gigas de Ram.
- Dado que necesitamos bastante espacio, ya que una de las funciones del servidor va a ser albergar un mirror de ubuntu bionic, y alguna máquina más, he cogido un disco duro de 2TB que no se estaban utilizando y se encontraban en uno de los equipos del aula de informática.


La instalación es muy sencilla lo puedes ver desde la wiki del proyecto o en algún tutorial de los muchos que podemos encontrar en la red.
Uno de los que he utilizado, y explica bien las labores previas (configuración de la bios y particionado del disco),  es el siguiente:

https://www.sysadminsdecuba.com/2017/11/tips-buenas-practicas-al-instalar-un-proxmox/

Lo primero es descargar el instalador desde la página de proxmox:

https://www.proxmox.com/en/downloads/item/proxmox-ve-5-4-iso-installer

Una vez quemado a un cd o usb (si elegimos esta última opción hacerlo como indican en la wiki del proyecto, a mi me dió guerra y lo hice desde cd), iniciamos la instalación:

Seleccionamos, pais, franja horaria e idioma.
Ponemos contraseña. Yo he colocado el nombre de nuestro SO, ya lo cambiaré luego.
A la hora de seleccionar disco duro donde hacer la instalación nos mostrará el disco que tenemos colocado. Debido al gran tamaño del disco he preferido personalizar los tamaños. Así pulsamos sobre el botón de options:





Allí nos indicará el tamaño total disponible del disco. Yo he modificado únicamente el tamaño que deseo dejar a la partición de root, que he puesto MAXROOT=100  y de swap  SWAPSIZE=8. De esta manera tendré 8Gb de swap y 100 Gb para root, quedando más de 1,5 TB para la partición pve-data que es la que utilizan las diferentes máquinas que creamos.
Más adelante podremos añadir otros discos para aumentar el espacio de almacenamiento.


Finalizada la instalación y reiniciado el equipo.

Para acceder al entorno de gestión abrimos navegador en otra máquina de la red y ponemos en la barra de dirección:

https://ip_servidor_proxmox:8006

No obstante nos lo indica en la pantalla del equipo una vez reiniciado.

Ya tenemos nuestro servidor. Pocas labores iniciales, entre ellas cambiamos los repositorios de proxmox por los de no-subscription

https://enavas.blogspot.com/2018/03/utilizar-el-repositorio-pve-no.html

Yo en mi caso también creo relación de confianza con los servidores del centro.

Otra cosa importante crear una entrada en la base de datos ldap para la mac del servidor proxmox, en mi caso lo realizo con la herramienta de controlies. De esta forma el servidor cogerá siempre la misma ip en el centro.



Error al hacer backup de contenedor de proxmox: ct-is-locked-backup


Al hacer una copia de seguridad de un contenedor de proxmox ha dado un error:
ERROR: Backup of VM 206 failed - CT is locked (backup)
De tal manera que no me hacía correctamente el backup.
El error nos indica que el contenedor está bloqueado. No se ha desbloqueado ni apagando el contenedor.
En la siguiente página he encontrado la solución:

https://serverfault.com/questions/846356/proxmox-error-backup-of-vm-210-failed-ct-is-locked-backup


Para desbloquearlo utilizamos desde el terminal del servidor proxmox el comando qm unlock junto con el id de la máquina bloqueada.

qm unlock <VM ID>

Crear contenedor en Proxmox desde un backup.

Una vez creada y configurada nuestro servidor proxmox podemos crear máquinas virtuales y contenedores de forma sencilla y guiada.
Otra de las opciones que tenemos es crear éstos desde un backup hecho en otra máquina.
Lo primero sería pasar el backup a la carpeta de backups que utiliza pve, que es

- /var/lib/vz/dump

En el siguiente ejemplo vemos los backups de las tres máquinas que he creado:

root@pve:/var/lib/vz/dump# ls /var/lib/vz/dump/
vzdump-lxc-101-2019_05_29-10_47_42.tar.lzo
vzdump-lxc-102-2019_05_29-10_25_00.tar.lzo
vzdump-lxc-103-2019_05_29-11_28_21.tar.lzo
root@pve:/var/lib/vz/dump# 

- La primera sería un contenedor llamado repositorio donde he puesto un mirror local con los repositorios que usan nuestros equipos y que es un mirror de los compañeros de la sección de AdministracionSI. Además tenemos un repositorio propio creado con reprepro.
Los he creado siguiendo el blog de Esteban :

https://enavas.blogspot.com/2018/06/crear-un-mirror-local-con-apt-mirror.html

https://enavas.blogspot.com/2012/10/crear-nuestro-propio-repositorio-de.html

- El otro contenedor lo llamo clonado y tiene instalado un servidor de clonacion fog.
También puedes verlo en el blog de Esteban:

https://enavas.blogspot.com/2018/03/instalar-fog-server-en-un-contenedor.html

- El último lo llamo aplicaciones y el objetivo principal es alojar un servidor zabbix para poder monitorizar los equipos del centro.


Una vez que tenemos copiados los backups en la carpeta correspondiente de proxmox, accediendo por el entorno web en el almacenamiento local pve, como vemos en la imagen nos muestra los diferentes archivos colocados. Seleccionando uno y pulsando el botón de restore restauraremos el contenedor.



En la ventana de restauración podemos cambiar el número de contenedor. Lo que sí tendremos que hacer es desmarcar la opción de "unprivileged container".

Al restaurar desde un backup estamos restaurando una máquina con todas las propiedades idénticas. Si queremos, por seguridad podemos cambiar la mac de la máquina recién creada.
Para ello seleccionamos la maquina en el panel lateral y en la sección "network" pulsamos al botón editar.



Como vemos se abrirá una ventana donde podemos editar, entre otras cosas la mac de la tarjeta de red virtual.
Otra cosa muy importante en el caso de que se restaure el backup de otra red es configurar los datos de la red en el archivo /etc/resolv.conf, poniendo los datos  del servidor, nameserver de la propia.



jueves, 9 de mayo de 2019

condicional if en recurso puppet

Si queremos aplicar un recurso sólo si se cumple una condición podemos aplicar el condicional if     

   if $tipo == 'notebooktc' {
                file  {"/root/sethostnames.sh":
                        owner => root, group => root, mode => 755,
                        source => "puppet:///modules/mp-sethostnames/sethostnames.sh.notebookTC",
                        notify => Exec["poner-escuela2.0"],
                }
        }
        else {

                file  {"/root/sethostnames.sh":
                        owner => root, group => root, mode => 755,
                        source => "puppet:///modules/mp-sethostnames/sethostnames.sh.$uso",
                        notify => Exec["poner-escuela2.0"],
                }
        }

también si lo necesitamos podemos usar elsif (condicion){   }

viernes, 3 de mayo de 2019

tarea puppet para descargar y añadir clave de repositorio.

       
Esta es el recurso puppet  que utilizo para descargar la clave del repositorio local del centro.
El archivo de la firma está en el repositorio. Lo descarga y lo añade hasta que comprueba que está añadido.  

 exec { "AnadeClaveFuenteroniel":
                command => "wget -O- http://servidorweb/ies/ies.asc  > ies.asc;cat ies.asc| apt-key add -",
                cwd => "/root",
                path => "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                timeout => 3600,
                unless => "apt-key list|grep \"7B3B 6261 A1F0 4C57 9A8D  E93D 41F4 5BC4 6BBD 7365\"",
        }