lunes, 8 de julio de 2019
Limites de Memoria y CPU en Docker
Límites de memoria y CPU:
Un container tiene acceso ilimitado a los recursos del sistema, asi que si uno ocupa toda la memoria los demás contenedores serán afectados.
Puedo aplicar un límite de memoria ó cpu a un contenedor específico.
Para esto crearemos 1 contenedor de debian, si no existe localmente lo descargará de docker-hub:
Con el comando docker ps vemos que fue creada y está ejecutando:
Con el comando docker inspect y el id de contenedor verificamos el valor MemoryReservation:
Vemos que el valor 0 marcado indica que ese contenedor no tiene valor limitado de memoria, es decir que utilizará todo lo que tenga disponible el host, posiblemente afectando a otros contenedores que estén dentro del mismo host.
Podemos limitar el uso de la memoria ejecutando el siguiente comando en caliente:
Le pasamos la cantidad que queremos como límite y el ID del contenedor al cuál aplicarlo:
Si le da ese error posiblemente su kernel no lo soporte ó el cgroup no está montado, modificiamos el siguiente archivo agregando los siguientes valores:
Actualizamos el grub y reiniciamos el server:
Volvemos a iniciar el contenedor que finalizaron por el reinicio, pero ahora en vez de ejecutar el comando docker update lo hacemos directamente como parametro --memory en el docker run:
Vemos como aparece cambiado el memory de 0 anterior por los 268435456:
Un container tiene acceso ilimitado a los recursos del sistema, asi que si uno ocupa toda la memoria los demás contenedores serán afectados.
Puedo aplicar un límite de memoria ó cpu a un contenedor específico.
Para esto crearemos 1 contenedor de debian, si no existe localmente lo descargará de docker-hub:
# docker run -ti debian:1.0 /bin/bash
Para salir del terminal y no finalizar su ejecución presionamos Ctrl+p+q.
Con el comando docker ps vemos que fue creada y está ejecutando:
Con el comando docker inspect y el id de contenedor verificamos el valor MemoryReservation:
# docker inspect 8592711fc458 | grep Memory
Vemos que el valor 0 marcado indica que ese contenedor no tiene valor limitado de memoria, es decir que utilizará todo lo que tenga disponible el host, posiblemente afectando a otros contenedores que estén dentro del mismo host.
Podemos limitar el uso de la memoria ejecutando el siguiente comando en caliente:
Le pasamos la cantidad que queremos como límite y el ID del contenedor al cuál aplicarlo:
# docker update -m 100MB bcd232430352
Si le da ese error posiblemente su kernel no lo soporte ó el cgroup no está montado, modificiamos el siguiente archivo agregando los siguientes valores:
# vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory swapaccount=1"
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
Actualizamos el grub y reiniciamos el server:
# update-grub
# reboot
Volvemos a iniciar el contenedor que finalizaron por el reinicio, pero ahora en vez de ejecutar el comando docker update lo hacemos directamente como parametro --memory en el docker run:
# docker run --memory 256M -it nginx:1.0 /bin/bash
Vemos como aparece cambiado el memory de 0 anterior por los 268435456:
# docker inspect 7dce57e73352 | grep Mem "Memory": 268435456, "CpusetMems": "", "KernelMemory": 0, "MemoryReservation": 0, "MemorySwap": 536870912, "MemorySwappiness": null,
miércoles, 29 de mayo de 2019
Docker en Debian 9 Stretch
Docker:
Docker es un proyecto de código abierto con el cuál podemos crear contenedores.
Un contenedor es un prisma rectangular de gran tamaño que suelen utilizar los barcos para transportar mercaderías y suele tener dentro distintos tipos de productos. Docker vendría a ser como el transportador de esos containers, es decir el barco.
Llevado a la informática se utiliza para que aplicaciones de software puedan ejecutarse en cualquier máquina, independizandose del sistema operativo.
Es una especie de empaquetado de sofware que se puede llevar de un lado a otro.
Docker permite meter todo lo que se necesite para que una aplicación funcione y se ejecute correctamente.
Por ejemplo debe contener algo como: java, tomcat, nginx, la aplicación en si misma, librerias, binarios y todo lo que necesite para funcionar.
Si llevo ese contenedor a otro servidor donde esté docker instalado debería funcionar correctamente.
Docker Hub:
Es un repositorio donde los usuarios de docker y los partners crean, testean, guardan y distribuyen imagenes de contenedores.
Es un lugar de donde me puedo bajar contenedores ya armados y listos para usar. Por ejemplo un debian oficial, un linux customizado, un ubuntu con paquetes ya instalados, un webserver ya listo para usarse, etc.
Docker Files:
Se pueden crear imágenes a partir de un archivo llamado Dockerfile.
Instalando docker:
apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian stretch stable"
apt-get update
apt-get install docker-ce
Verificamos que Docker se este ejecutando:
/etc/init.d/docker status
Vemos todas las imágenes de debian en dockerhub:
docker search debian
Si quiero descargar una imagen utilizo el docker pull:
docker pull debian
Para ver las imagenes que tengo ya descargadas:
docker images
Ver contenedores ejecutando:
No tenemos contenedores corriendo, por ahora solo lo descargamos.
docker ps
Ejecutar un contenedor:
Utilizaremos la imagen de debian oficial que bajamos anteriormente con el comando pull:
Utilizaremos losbparámetros -t de tty y el -i de interactivo y le decimos que ejecute un bash. Vemos como nos cambió el prompt:
docker run -t -i debian /bin/bash
Instalamos paquetes en el container:
Hacemos un update de los repositorios e instalamos nginx, wget y vim.
root@1363037a2fad:/# apt-get update && apt-get -y install wget vim nginx
Tener en cuenta que puedo salir del contenedor con exit ó Ctrl+d pero dejará de ejecutarse el contenedor.
Si quisiera volver a tener el mismo container corriendo tendría que volver a instalar todo lo que instalé antes ya que no guarde los cambios en una imagen.
Para guardar esos cambios en una imagen primero debo salir sin matar el contenedor, para eso ejecutamos Ctrl+p+q y veremos que vuelve el prompt.
Si ahora ejecutamos el comando docker ps veremos que sigue corriendo ese container:
docker ps
Crear una imagen:
Ahora voy a guardar la imagen modificada, pero con otro nombre.
Primero obtenemos el ID del contenedor en ejecución (f5b9be35915d) con el comando "docker ps".
Guardaremos los cambios en una nueva imagen llamada nginx-debian:1.0. Esto lo hacemos con "docker commit [id-del-contenedor] [nombre-nueva-imagen] por ejemplo:
docker commit f5b9be35915d nginx-debian:1.0
Verificamos la creacion de la imagen:
root@debian:~# docker images
Salimos de un contenedor sin que quede en ejecución:
Primero verificamos que no hay contenedor corriendo:
docker ps
Verificamos que imagenes podemos usar para crear un contenedor:
docker images
Iniciar un contenedor interactivo con la imagen que guardamos previamente llamada nginx-debian versión 1.0:
docker run -it nginx-debian:1.0
Salimos del contenedor con exit ó con Ctrl+d:
root@8c80b4f2c09e:/# exit
Verificamos que el contenedor no está corriendo:
docker ps
Si quiero borrar una imagen hacemos lo siguiente:
Vemos las imágenes disponibles:
docker images
Eliminamos la imagen nginx-debian v1.0:
docker rmi -f nginx-debian:1.0
Volvemos a ver que fue eliminada:
docker images

Creando una imagen con Dockerfile:
Creamos la carpeta y archivo Cockerfile y lo editamos:
mkdir -p /var/Dockerfile/nginx
vi /var/Dockerfile/nginx/Dockerfile
Dentro ponemos lo siguiente, este archivo debería utilizar un contenedor debian, indica que Hernan es el que la mantiene, actualiza los repo, instala en nginx lo expone en el puerto 8888 e inicia el demonio del nginx:
FROM debian
MAINTAINER HERNAN
RUN apt-get update && apt-get install -y nginx && apt clean
EXPOSE 8888
RUN /etc/init.d/nginx start
Ejecutamos el build posicionandonos donde está el docker file:
cd /var/Dockerfile/nginx/
docker build .
Verificamos las imagenes:
root@debian:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
debian-apache latest af0593cb85eb 59 seconds ago 225MB
debian latest 8d31923452f8 3 weeks ago 101MB
Vemos que no hay nada corriendo, ejecutamos la imagen debian-apache y verificamos que ahora corre:
root@debian:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@debian:~#
root@debian:~# docker run -p 8181:80 debian-apache-bis /usr/sbin/apache2ctl -D FOREGROUND
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
Si ingresamos a la ip del docker, no la del contenedor, deberíamos ingresar al puerto 8181 y nos reenviaría al apache 80 del contenedor:
http://debian:8181/
Matamos el contenedor que habia quedado corriendo:
root@debian:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
68c121179ab3 debian-apache-bis "/usr/sbin/apache2ct…" 12 minutes ago Up 12 minutes 81/tcp, 0.0.0.0:8181->80/tcp vigorous_benz
root@debian:~# docker kill 68c121179ab3
Etiquetas:
Administrador,
Apache,
Aplicaciones,
Apps,
CLI,
codigo,
commands,
consola,
Containers,
Contenedores,
Demonios,
descargas,
DevOps,
Docker,
Infraestructura,
Linux,
Vim,
Virtualización,
Webservers
lunes, 4 de febrero de 2019
Modificar Active Directory desde Linux
El siguiente script es utilizado para modificar la descripción de un usuario de Active Directory de Windows desde un Linux con el comando ldapmodify.
Explicación del script:
El primer if testea si la cantidad de parámetros que recibe el script es igual a 3. Se debe enviar como parámetro el Apellido, Nombre y la Descripción que querémos que le ponga al usuario con el Apellido indicado.
El segundo if verifica si los usuarios a modificar corresponde con alguno de esos 3, es decir sólo a estos 3 usuarios podré modificar su descripción: Cacheuta, Perez y Martinez.
Luego borro el temporal de ldif en caso que exista, a continuación creo uno nuevo, donde le especifico la Unidad Organizativa donde están dichos usuarios a modificar, le especifico que voy a modificar y lo que voy a reemplazar es la descripción del usuario.
Ejecuto el ldapmodify específicandole el nombre ó la ip del domain controller, un usuario con permisos para modificar el Active Directory, la password del usuario para modificar el AD y el archivo LDIF generado previamente.
Al final vuelvo a borrar el archivo temporal.
Le damos permisos al script para que cualquiera pueda ejecutar:
Ejecutamos el script pasandoles los parámetros:
Agregamos al webmin para que pueda ejecutarlo el usuario deseado:
http://redes-seguridad.blogspot.com/2012/11/permisos-script-en-webmin.html
El script crea un archivo llamado entrymods con formato ldif para luego importarlo, finalmente lo borra.
Acá el script y luego lo explicaré linea por linea:
#!/bin/bash
if [ $# -ne 3 ]
then
echo "Cantidad de parametros incorrecta"
echo "Uso del Script: $0 [Apellido] [Nombre] [descripcion]"
echo "Ejemplo: $0 Martinez Diego Mi_Descrip"
exit
fi
if [ "$1" != "Cacheuta" -a "$1" != "Perez" -a "$1" != "Martinez" ]
then
echo "Usuario Incorrecto, no tiene permisos o esta mal escrito: (Cacheuta, Perez ó Martinez)"
exit
fi
rm -rf /tmp/entrymods
echo dn: CN=$1 $2,OU=Sistemas,OU=Users,OU=España,OU=Europa,DC=redes,DC=seguridad,DC=com >> /tmp/entrymods
echo changetype: modify >> /tmp/entrymods
echo replace: description >> /tmp/entrymods
echo description: $3 >> /tmp/entrymods
ldapmodify -h mi_domain_controller -D "mi_user@redes.seguridad.com" -w "Clave_de_mi_user" -f /tmp/entrymods
rm -rf /tmp/entrymods
Explicación del script:
El primer if testea si la cantidad de parámetros que recibe el script es igual a 3. Se debe enviar como parámetro el Apellido, Nombre y la Descripción que querémos que le ponga al usuario con el Apellido indicado.
El segundo if verifica si los usuarios a modificar corresponde con alguno de esos 3, es decir sólo a estos 3 usuarios podré modificar su descripción: Cacheuta, Perez y Martinez.
Luego borro el temporal de ldif en caso que exista, a continuación creo uno nuevo, donde le especifico la Unidad Organizativa donde están dichos usuarios a modificar, le especifico que voy a modificar y lo que voy a reemplazar es la descripción del usuario.
Ejecuto el ldapmodify específicandole el nombre ó la ip del domain controller, un usuario con permisos para modificar el Active Directory, la password del usuario para modificar el AD y el archivo LDIF generado previamente.
Al final vuelvo a borrar el archivo temporal.
Le damos permisos al script para que cualquiera pueda ejecutar:
# chmod a+x /ruta/del/script/modifica_descripcion.sh
Ejecutamos el script pasandoles los parámetros:
# /ruta/del/script/modifica_descripcion.sh Cacheuta Diego Administracion
Agregamos al webmin para que pueda ejecutarlo el usuario deseado:
http://redes-seguridad.blogspot.com/2012/11/permisos-script-en-webmin.html
Etiquetas:
Active Directory,
CLI,
Comandos,
commands,
consola,
Debian,
Infraestructura,
ldapadmin,
ldapmodify,
Linux,
openldap,
Scripts,
Servidores Dell,
Vim
viernes, 18 de enero de 2019
Instalar PowerShell en Linux
Vamos a instalar PowerShell Core en Linux, esto fué probado en un Debian 9
Primero descargamos el tar.gz:
root@debian:~# curl -L -o /tmp/powershell.tar.gz https://github.com/PowerShell/PowerShell/releases/download/v6.1.0/powershell-6.1.0-linux-x64.tar.gz
Creamos la carpeta donde lo almacenaremos:
root@debian:~# mkdir -p /opt/microsoft/powershell/6.1.0
Descomprimimos:
root@debian:~# tar zxf /tmp/powershell.tar.gz -C /opt/microsoft/powershell/6.1.0
Damos permisos de ejecución:
root@debian:~# chmod +x /opt/microsoft/powershell/6.1.0/pwsh
Creamos en enlace simbólico:
root@debian:~# ln -s /opt/microsoft/powershell/6.1.0/pwsh /usr/bin/pwsh
FUENTE: https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-6
miércoles, 2 de enero de 2019
Conectar con SSH sin clave pública/privada - SSHpass
Qué es SSHpass:
Cuando utilizamos SSH para conectarnos de un servidor a otro utilizamos un usuario y una contraseña.
Usualmente podemos generar un par de claves pública y privada para que no nos solicite la contraseña. En el caso que no deseemos utilizar estas claves podremos utilizar el SSHPASS que nos servirá para pasar la contraseña por parámetro.
Esta herramienta podemos utilizarla por ejemplo para poner dentro de scripts sin que tener que configurar las keys SSH.
También explicaré como utilizar GPG para encriptar la clave y que no quede en texto plano en un archivo.
Instalar el sshpass:
root@debian:~# apt-get install sshpass
Ingresar pasando el password sin tener keys ssh:
root@debian:~# sshpass -p 'Mi_password' ssh 192.168.0.200
Poner la clave dentro de un archivo:
root@debian:~# echo 'Mi_password' > pass.txt
root@debian:~# sshpass -f pass.txt ssh 192.168.0.200
Tener en cuenta para darle permisos de lectura solo al owner, para que nadie más pueda leer la clave.
root@debian:~# chmod 0400 pass.txt
Encriptar el archivo de contraseña con gpg:
root@debian:~# gpg -c pass.txt
Ingresamos una passphrase que nos solicita y la confirmamos. Esto nos genera un archivo .gpg
root@debian:~# ls -lat pass.txt.gpg
-rw-r--r-- 1 root root 94 ene 2 11:15 pass.txt.gpg
Eliminamos el que no está encriptado:
root@debian:~# rm -rf pass.txt
Usamos el sshpass con la clave encriptada:
root@debian:~# gpg -d -q pass.txt.gpg > pass.txt; sshpass -f pass.txt ssh 192.168.0.200; rm pass.txt
Etiquetas:
Administrador,
CLI,
Comandos,
consola,
Debian,
Infraestructura,
opensource,
parallel ssh,
Seguridad,
Servers,
Servicios,
SSH,
SSHd,
SSHpas,
Unix
viernes, 28 de diciembre de 2018
Parallel SSH - Ejecutar comandos remotos en multiples servidores
Todos sabemos que es SSH y que podemos hacer con él, pero hoy vamos a ver Parallel SSH.
Instalamos el parallel-ssh:
Vemos como usarlo:
Editamos el archivo donde pondremos ip's de los servidores donde ejecutaremos los comandos:
Ejecutamos el comando en ambos servidores:
-h listado de servidores donde ejecutaremos los comandos
-l usuario con el que se conectará por ssh. Tener en cuenta que debe tener configuradas las keys ssh para que no pida password.
-o directorio de salida donde mostrará la salida de cada comando
uptime el comando que ejecutará en cada servidor remoto
Que es Parallel SSH:
Es un comando ó herramienta que nos permite conectarnos a varios servidores simultáneamente mediante SSH y poder ejecutar comandos sin ingresar uno por uno para ejecutarlos.Instalamos el parallel-ssh:
root@debian:~# apt-get install pssh
Vemos como usarlo:
root@debian:~# parallel-ssh --help
Usage: parallel-ssh [OPTIONS] command [...]
Options:
--version show program's version number and exit
--help show this help message and exit
-h HOST_FILE, --hosts=HOST_FILE
hosts file (each line "[user@]host[:port]")
-H HOST_STRING, --host=HOST_STRING
additional host entries ("[user@]host[:port]")
-l USER, --user=USER username (OPTIONAL)
-p PAR, --par=PAR max number of parallel threads (OPTIONAL)
-o OUTDIR, --outdir=OUTDIR
output directory for stdout files (OPTIONAL)
-e ERRDIR, --errdir=ERRDIR
output directory for stderr files (OPTIONAL)
-t TIMEOUT, --timeout=TIMEOUT
timeout (secs) (0 = no timeout) per host (OPTIONAL)
-O OPTION, --option=OPTION
SSH option (OPTIONAL)
-v, --verbose turn on warning and diagnostic messages (OPTIONAL)
-A, --askpass Ask for a password (OPTIONAL)
-x ARGS, --extra-args=ARGS
Extra command-line arguments, with processing for
spaces, quotes, and backslashes
-X ARG, --extra-arg=ARG
Extra command-line argument
-i, --inline inline aggregated output and error for each server
--inline-stdout inline standard output for each server
-I, --send-input read from standard input and send as input to ssh
-P, --print print output as we get it
Example: pssh -h hosts.txt -l irb2 -o /tmp/foo uptime
Editamos el archivo donde pondremos ip's de los servidores donde ejecutaremos los comandos:
root@debian:~# vi hosts.txt
192.168.0.100
192.168.0.200
Ejecutamos el comando en ambos servidores:
root@debian:~# parallel-ssh -h hosts.txt -l root -o /tmp/salida uptime
[1] 09:52:12 [SUCCESS] 192.168.0.100
[2] 09:52:12 [SUCCESS] 192.168.0.200
-h listado de servidores donde ejecutaremos los comandos
-l usuario con el que se conectará por ssh. Tener en cuenta que debe tener configuradas las keys ssh para que no pida password.
-o directorio de salida donde mostrará la salida de cada comando
uptime el comando que ejecutará en cada servidor remoto
Vemos la salida de cada ip en la ruta que le pasamos con el -o:
Vemos el resultado de cada server:
root@debian:~# ls -lat /tmp/salida.txt/
total 1930
drwxrwxrwt 7 root root 1971200 Dec 28 09:55 ..
-rw-r--r-- 1 root root 74 Dec 28 09:52 192.168.0.100
-rw-r--r-- 1 root root 73 Dec 28 09:52 192.168.0.200
drwxr-xr-x 2 root root 1024 Dec 28 09:51 .
Vemos el resultado de cada server:
root@debian:~# cat /tmp/salida.txt/192.168.0.100
9:52am up 100 day(s), 16:24, 9 users, load average: 0.06, 0.07, 0.06
root@debian:~# cat /tmp/salida.txt/192.168.0.200En caso que no tengamos las keys ssh podremos ingresar el password:
9:52am up 85 day(s), 17:12, 0 users, load average: 0.11, 0.18, 0.19
root@debian:~# parallel-ssh -h hosts.txt -A -O PreferredAuthentications=password uptime
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password: acáVaLaClaveDeRoot
[1] 12:08:27 [SUCCESS] 192.168.0.100
[2] 12:08:27 [SUCCESS] 192.168.0.200
Etiquetas:
Administrador,
CLI,
Comandos,
commands,
consola,
Debian,
Linux,
opensource,
parallel ssh,
parallel-ssh,
Remoto,
Server,
Servers,
Servidores,
SSH,
SSHd,
SysAdmin,
Unix
Suscribirse a:
Entradas (Atom)























































