Quantcast
Channel: Blog Virtualizacion
Viewing all 681 articles
Browse latest View live

Powershell: Cargar listado de usuarios a Grupo de Directorio Activo

$
0
0

Powershell: Cargar listado de usuarios a Grupo de Directorio Activo

Entrada rápida, os explico cómo cargar una lista de usuarios en Directorio Activo a grupos de Directorio Activo.

Lo haremos con un fichero exportado de Excel en formato CSV y un script de Powershell.

https://gist.github.com/raulunzue/c14be14771edac264af9644aba3f28ec

##########################################
## RAUL UNZUE - ELBLOGDENEGU
## CARGAR USUARIOS A GRUPOS DE DIRECTORIO ACTIVO
##########################################

Import-Csv "C:\Users\elblogdenegu\Desktop\usuariosad.csv" -Delimiter ';' |

ForEach-Object { 
Add-ADGroupMember `
-Identity $_.GrupoAD `
-Members $_.Usuario
}

El formato del CSV será así:

powershell-cargar-listado-de-usuarios-a-grupo-de-directorio-activo

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Powershell: Cargar listado de usuarios a Grupo de Directorio Activo se publicó primero en Blog Virtualizacion.


GPO: Hacer Chrome Default Browser

$
0
0

GPO: Hacer Chrome Default Browser

Os explicamos cómo conseguir que vuestro navegador Chrome se convierta en navegador predeterminado.

Existen varios métodos para conseguir hacer esto en una organización, pero la forma más rápida es hacerlo por GPO.

Lo conseguiremos creando un fichero XML, al cual llamaremos defaultassociations.xml y que colocaremos en un lugar donde todo el mundo tenga acceso de lectura. Lo más normal, es dejarlo en SYSVOL de directorio activo.

Generar el fichero con el siguiente contenido, cuidando los espacios, algo a lo que es sensible:

<?xml version="1.0" encoding="UTF-8"?>
<DefaultAssociations>
  <Association Identifier=".htm" ProgId="ChromeHTML" ApplicationName="Google Chrome" />
  <Association Identifier=".html" ProgId="ChromeHTML" ApplicationName="Google Chrome" />
  <Association Identifier=".mht" ProgId="ChromeHTML" ApplicationName="Google Chrome" />
  <Association Identifier=".mhtml" ProgId="ChromeHTML" ApplicationName="Google Chrome" />
  <Association Identifier=".partial" ProgId="ChromeHTML" ApplicationName="Google Chrome" />
  <Association Identifier=".svg" ProgId="ChromeHTML" ApplicationName="Google Chrome" />
  <Association Identifier=".url" ProgId="ChromeHTML" ApplicationName="Google Chrome" />
  <Association Identifier=".website" ProgId="ChromeHTML" ApplicationName="Google Chrome" />
  <Association Identifier=".xht" ProgId="ChromeHTML" ApplicationName="Google Chrome" />
  <Association Identifier=".xhtml" ProgId="ChromeHTML" ApplicationName="Google Chrome" />
  <Association Identifier="FTP" ProgId="ChromeHTML" ApplicationName="Google Chrome" />
  <Association Identifier="http" ProgId="ChromeHTML" ApplicationName="Google Chrome" />
  <Association Identifier="https" ProgId="ChromeHTML" ApplicationName="Google Chrome" />
  <Association Identifier="MK" ProgId="ChromeHTML" ApplicationName="Google Chrome" />
  <Association Identifier="RES" ProgId="ChromeHTML" ApplicationName="Google Chrome" />
</DefaultAssociations>

La GPO la generaremos de Computer:

Computer Configuration -> Policies -> Administrative Templates -> Windows Components -> File Explorer -> Set a default associations configuration file:

  • Enabled
  • Default Associations Configuration File (colocamos la ruta al SYSVOL o el share donde lo hayamos colocado)

Probamos en una máquina de la organización, la prueba rápida es ver si los ficheros HTML / HTM cambian el logo asociado por el de Chrome:

gpo-hacer-chrome-default-browser-1

Luego podríamos validar que nada de lo que hagamos modificando las extensiones en local, corrompe la GPO y la asociación:

gpo-hacer-chrome-default-browser-2

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada GPO: Hacer Chrome Default Browser se publicó primero en Blog Virtualizacion.

Linux: Guardar estado de procesos con CRIU

$
0
0

Linux: Guardar estado de procesos con CRIU

Si administráis servidores Linux, infraestructuras de Contenedores, ya sean Docker, Podman o LXC, creo que esta entrada os interesará. Hoy vamos a hablar de la herramienta CRIU.

CRIU o Checkpoint and Restore In Userspace, surge de un proyecto opensource de Virtuozzo (OpenVZ), que aunque no es de las comunidades más populares a nivel de virtualización, ha conseguido que la herramienta CRIU se ponga en la diana de otros proyectos más importantes, como Docker.

Se utiliza integrado en OpenVZ, que es una solución de virtualización como hemos comentado, sobre contenedores LXC/LXD, Docker, Podman…y ya está empaquetado en la mayoría de distribuciones importantes de Linux.

CRIU nos permite guardar el estado de uno o un grupo de procesos y luego reanudar el trabajo donde lo dejamos. Pero esto no es lo mejor, ya que incluso podemos reanudar ese estado, después de reiniciar el sistema o en otro servidor sin romper las conexiones de red ya establecidas. ¿Impresionante no?

FUNCIONES CRIU

CRIU se puede utilizar tanto en 32 bits, 64 bits o incluso en sistemas ARM. Dispone de muchas funciones para manejar procesos, entre las que destacan:

  • Como ya hemos hablado su función más destacable es la de manejar procesos y funciones comunes como:
    • Jerarquía
    • PID
    • Autenticadores de usuarios y grupos (UID, GID, SID, etc.)
    • Capacidades del sistema
    • Subprocesos
    • Estados de ejecución y detenido
  • Memoria de la aplicación:
    • Archivos asignados en memoria y memoria compartida
  • Podemos abrir archivos
  • Pipes y FIFOs:
    • Pipe: provee una interfaz entre dos procesos
    • FIFOs: es un fichero especial. Una tubería con nombre
  • Unix domain sockets:
    • Es un punto final de comunicaciones de datos para intercambiar datos entre procesos que se ejecutan en el mismo sistema operativo host
  • Network sockets:
    • Incluidos TCP sockets en el estado ESTABLISHED
  • System V IPC:
    • Mecanismos de comunicación entre procesos
  • Timers:
    • Nos permite agendar tareas de forma periódica de una forma similar a Cron
  • Signals:
    • Una señal es una forma limitada de comunicación entre procesos empleada en Unix y otros sistemas operativos compatibles con POSIX
  • Terminales
  • Llamadas del Kernel al sistema específico:
    • Inotify, Signalfd, Eventfdyepoll

Os dejo las URLs del proyecto CRIU…

URLS PROYECTO CRIU:

linux-guardar-estado-de-procesos-con-criu-1

INSTALAR CRIU EN CENTOS

CRIU está en la mayoría distribuciones como parte de los paquetes disponibles. Para instalarlo en Centos simplemente lo haremos de la siguiente forma:

[root@NGINX01 ~]# yum -y install criu

CRIU EN ACCIÓN: MANEJANDO PROCESO

Para ver el poder de CRIU vamos a hacerlo con un ejemplo muy simple. Lo vamos a probar sobre un proceso que consiste en un bucle que va sumando números. Crearemos un fichero con el siguiente contenido:

root@localhost:~# cat simple_loop.c                                             
#include <stdio.h>                                                              
#include <unistd.h>                                                             
                                                                                
int main()                                                                      
{                                                                               
    long long i = 0;                                                            
    while(1) {                                                                  
        printf("%lld\n", ++i);                                                  
        sleep(1);                                                               
    }                                                                           
    return 0;                                                                   
}

Lo compilamos:

root@localhost:~# gcc simple_loop.c

Nos genera un fichero ejecutable, que lanzaremos de la siguiente forma, y comenzará la cuenta del bucle:

root@localhost:~# ./a.out                                                       
1                                                                               
2                                                                               
3                                                                               
4                                                                               
5                                                                               
6

Sacamos el identificador del proceso:

root@localhost:~# pidof a.out                                                   
10015

Creamos un directorio para el punto de control o checkpoint:

root@localhost:~# mkdir checkpoint

Ejecutamos CRIU sobre el proceso:

root@localhost:~# criu dump -t 10015 -D checkpoint/ -j -v4

Se congelará el estado del proceso:

(00.019031) Closing image 14                                                    
(00.019053) Closing image 18                                                    
(00.019078) Closing image 8                                                     
(00.019096) Running post-dump scripts                                           
(00.019101) Unfreezing tasks into 2                                             
(00.019107)     Unseizing 10015 into 2                                           
(00.019242) Writing stats                                                       
(00.019276) Closing image 6                                                     
(00.019295) Dumping finished successfully

Para volver a descongelarlo, simplemente volvemos a ejecutar el siguiente comando:

root@localhost:~# criu restore -D checkpoint/ -j
7
8
9
10

Imaginaros la aplicación de esto sobre contenedores u otras tecnologías…súper interesante! Intentaré hacer entradas sobre ello…

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Linux: Guardar estado de procesos con CRIU se publicó primero en Blog Virtualizacion.

Linux: Instalar SQL Server 2019

$
0
0

Linux: Instalar SQL Server 2019

Hoy os vamos a explicar como instalar SQL Server 2019 en un sistema linux Centos 8 / RedHat 8.

Desde hace un tiempo, uno de los productos estrella de Microsoft, como es su gestor de base de datos SQL Server se integra con sistemas Linux. Esto está dentro del cambio de estrategia de Microsoft, que pasó de intentar matar Linux, a ser uno de los mayores aportadores de la comunidad Open. Algo que celebramos los que no nos gusta decantarnos por un solo sistema operativo.

Así que vamos a ello, os vamos a explicar como configurarlo sobre un Centos 8, en mi caso, que corre en un LXC de Proxmox.

Requerimientos SQL Server 2019 en Centos 8

  • Mínimo 3 GB de RAM
  • 10 GB de disco para los ficheros de SQL
  • CPU mínima de 1,4GHz

Repositorios SQL Server 2019 en Centos 8

Como imaginaréis, no está disponible en los repositorios originales, así que tendremos que añadirlos al sistema operativo Centos 8:

curl https://packages.microsoft.com/config/rhel/8/mssql-server-2019.repo -o /etc/yum.repos.d/mssql-server-2019.repo
curl https://packages.microsoft.com/config/rhel/8/prod.repo -o /etc/yum.repos.d/msprod.repo

linux-instalar-sql-server-2019-1

Instalación SQL Server 2019 en Centos 8

Para instalarlo, usaremos el comando:

dnf -y install mssql-server

linux-instalar-sql-server-2019-2

Para poder manejar SQL, instalaremos también las Tools correspondientes en el sistema:

yum -y install mssql-tools unixODBC-devel

Tendremos que aceptar la licencia dos veces. Escribimos YES un par de veces + INTRO:

linux-instalar-sql-server-2019-3

Configuración SQL Server en Centos 8

Ahora arrancamos la primera configuración:

/opt/mssql/bin/mssql-conf setup

Nos va a pedir que versión queremos instalar. En mi caso, la de Developer que es FREE:

linux-instalar-sql-server-2019-4

Pulsamos 2 y YES:

linux-instalar-sql-server-2019-5

Ahora nos pedirá las credenciales de nuestro administrador para SQL. Las introducimos para que comience el proceso de configuración inicial:

linux-instalar-sql-server-2019-6

Nos devolverá, si todo ha salido bien, un resultado así:

Do you accept the license terms? [Yes/No]:Yes

Enter the SQL Server system administrator password: 
Confirm the SQL Server system administrator password: 
Configuring SQL Server...

ForceFlush is enabled for this instance. 
ForceFlush feature is enabled for log durability.
DBSTARTUP (master, 1): FileMgrPreRecoveryTime took 111 ms
DBSTARTUP (master, 1): PhysicalRecoveryTime took 133 ms
DBSTARTUP (master, 1): PhysicalCompletionTime took 215 ms
DBSTARTUP (master, 1): UpgradeTime took 11446 ms
DBSTARTUP (master, 1): StartupInDatabaseTime took 11656 ms
DBSTARTUP (master, 1): RemapSysfiles1Time took 108 ms
DBSTARTUP (msdb, 4): FCBHeaderReadTime took 110 ms
DBSTARTUP (msdb, 4): FileMgrPreRecoveryTime took 276 ms
DBSTARTUP (msdb, 4): PhysicalCompletionTime took 113 ms
DBSTARTUP (msdb, 4): RecoveryCompletionTime took 215 ms
DBSTARTUP (msdb, 4): UpgradeTime took 10845 ms
DBSTARTUP (msdb, 4): StartupInDatabaseTime took 11018 ms
DBSTARTUP (msdb, 4): RemapSysfiles1Time took 155 ms
Created symlink /etc/systemd/system/multi-user.target.wants/mssql-server.service → /usr/lib/systemd/system/mssql-server.service.
Setup has completed successfully. SQL Server is now starting.

Ahora simplemente realizamos pruebas básicas para ver que todo está en su sitio:

  • Comprobamos que el servicio está bien configurado:
[root@SQLSERVER01 ~]# systemctl status mssql-server.service 
● mssql-server.service - Microsoft SQL Server Database Engine
   Loaded: loaded (/usr/lib/systemd/system/mssql-server.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2020-11-08 11:13:07 UTC; 1min 38s ago
     Docs: https://docs.microsoft.com/en-us/sql/linux
 Main PID: 892 (sqlservr)
    Tasks: 141
   Memory: 622.4M
   CGroup: /system.slice/mssql-server.service
           ├─892 /opt/mssql/bin/sqlservr
           └─908 /opt/mssql/bin/sqlservr

Nov 08 11:13:16 SQLSERVER01 sqlservr[892]: [155B blob data]
Nov 08 11:13:24 SQLSERVER01 sqlservr[892]: [96B blob data]
Nov 08 11:13:24 SQLSERVER01 sqlservr[892]: [66B blob data]
Nov 08 11:13:29 SQLSERVER01 sqlservr[892]: [75B blob data]
Nov 08 11:13:29 SQLSERVER01 sqlservr[892]: [96B blob data]
Nov 08 11:13:29 SQLSERVER01 sqlservr[892]: [100B blob data]
Nov 08 11:13:29 SQLSERVER01 sqlservr[892]: [71B blob data]
Nov 08 11:13:29 SQLSERVER01 sqlservr[892]: [124B blob data]
Nov 08 11:13:29 SQLSERVER01 sqlservr[892]: [73B blob data]
Nov 08 11:13:29 SQLSERVER01 sqlservr[892]: [186B blob data]
  • Habilitamos que servicio arranque al inicio si no lo está:
[root@SQLSERVER01 ~]# systemctl is-enabled mssql-server.service 
enabled

[root@SQLSERVER01 ~]# systemctl enable mssql-server.service
  • Incluímos /opt/mssql/bin/ a nuestro PATH:
[root@SQLSERVER01 ~]# echo 'export PATH=$PATH:/opt/mssql/bin:/opt/mssql-tools/bin' | tee /etc/profile.d/mssql.sh
export PATH=$PATH:/opt/mssql/bin:/opt/mssql-tools/bin
  • Para poder ejecutar binarios en nuestra shell actual:
source /etc/profile.d/mssql.sh
  • Si usáis firewall, que no es mi caso, abrimos las iptables:
firewall-cmd --add-port=1433/tcp --permanent
firewall-cmd --reload
  • Y comenzamos los testeos básicos de puro SQL:
      • Comprobamos la conexión con nuestro administrador:
    [root@SQLSERVER01 ~]# sqlcmd -S localhost -U SA
    Password: 
    1>
      • Hacemos un select a los usuarios del sistema:
[root@SQLSERVER01 ~]# sqlcmd -S localhost -U SA
Password: 
1> select name from sysusers;
2> GO
name                                                                                                                            
--------------------------------------------------------------------------------------------------------------------------------
##MS_AgentSigningCertificate##                                                                                                  
##MS_PolicyEventProcessingLogin##                                                                                               
db_accessadmin                                                                                                                  
db_backupoperator                                                                                                               
db_datareader                                                                                                                   
db_datawriter                                                                                                                   
db_ddladmin                                                                                                                     
db_denydatareader                                                                                                               
db_denydatawriter                                                                                                               
db_owner                                                                                                                        
db_securityadmin                                                                                                                
dbo                                                                                                                             
guest                                                                                                                           
INFORMATION_SCHEMA                                                                                                              
public                                                                                                                          
sys                                                                                                                             

(16 rows affected)
      • Generamos una base de datos de Prueba:
1> CREATE DATABASE elblogdenegu
2> SELECT Name from sys.Databases
3> GO
Name                                                                                                                            
--------------------------------------------------------------------------------------------------------------------------------
master                                                                                                                          
tempdb                                                                                                                          
model                                                                                                                           
msdb                                                                                                                            
elblogdenegu                                                                                                                    

(5 rows affected)
1> USE elblogdenegu
2> CREATE TABLE Inventory (id INT, name NVARCHAR(50), quantity INT)
3> INSERT INTO Inventory VALUES (1, 'raul', 150); INSERT INTO Inventory VALUES (2, 'unzue', 154);
5> GO
Changed database context to 'elblogdenegu'.

(1 rows affected)

(1 rows affected)
1> SELECT * FROM Inventory LIMIT 1;
      • Comprobamos:
1> select name,database_id from sys.databases; 
2> GO
name                                                                                                                             database_id
-------------------------------------------------------------------------------------------------------------------------------- -----------
master                                                                                                                                     1
tempdb                                                                                                                                     2
model                                                                                                                                      3
msdb                                                                                                                                       4
elblogdenegu                                                                                                                               5

(5 rows affected)
Espero os parezca interesante…

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Linux: Instalar SQL Server 2019 se publicó primero en Blog Virtualizacion.

Ansible: Instalar SQL Server 2019 en Linux

$
0
0

Ansible: Instalar SQL Server 2019 en Linux

En la entrada anterior, hemos visto cómo instalar y configurar SQL Server 2019 sobre un Centos 8 / RedHat 8.

En la siguiente entrada, vamos a intentar automatizar el proceso mediante Ansible. Así que vamos a llevar todos los pasos de la entrada anterior a un fichero automatizado.

Copiamos la clave de la máquina remota:

[root@TERRAFORM mssql2019-roles-RHEL8]# ssh-copy-id -i /root/.ssh/id_rsa 192.168.2.175
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.2.175 (192.168.2.175)' can't be established.
ECDSA key fingerprint is SHA256:VD8qsa1L++EIbxWi+bntigE+Zht23u6h2/MuklE4MA4.
ECDSA key fingerprint is MD5:f5:81:c1:e7:67:88:12:26:ce:94:c5:cf:aa:45:c3:1d.
Are you sure you want to continue connecting (yes/no)? yes
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.2.175's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '192.168.2.175'"
and check to make sure that only the key(s) you wanted were added.

Generamos el fichero de inventario:

[root@TERRAFORM mssql2019-roles-RHEL8]# cat ../inventory/sql 
[sql]
SQLSERVER02 ansible_ssh_host=192.168.2.175

Lo primero que haremos para instalar el software, es copiar el repo de Ansible para SQL Server en nuestro server:

git clone https://github.com/mikecali/mssql2019-roles-RHEL8

[root@TERRAFORM ansible]# git clone https://github.com/mikecali/mssql2019-roles-RHEL8
Cloning into 'mssql2019-roles-RHEL8'...
remote: Enumerating objects: 74, done.
remote: Counting objects: 100% (74/74), done.
remote: Compressing objects: 100% (52/52), done.
remote: Total 74 (delta 22), reused 48 (delta 7), pack-reused 0
Unpacking objects: 100% (74/74), done.

Nos movemos al directorio:

[root@TERRAFORM ansible]# cd mssql2019-roles-RHEL8
[root@TERRAFORM mssql2019-roles-RHEL8]# ls
README.md  ansible.cfg  roles  site-del.yaml  site.yaml  vars.yaml

Editamos los ficheros site.yaml y vars.yaml con nuestras configuraciones si no lo queremos en el propio servidor, que sino serán validados, con los cambios pertinentes:

[root@TERRAFORM mssql2019-roles-RHEL8]# cat site.yaml 
---
- hosts: localhost
  become: yes
  roles:
    - pre-reqs
    - ansible-role-mssql
  tasks:
    - name: Wait up to 60 seconds for server to become available after creation
      wait_for:
        port: 1433
        timeout: 60
    - name: Create new db
      include_role:
        name: ansible-role-mssql
        tasks_from: new_db
[root@TERRAFORM mssql2019-roles-RHEL8]# cat vars.yaml
# These are required for database installation
#
end_user_license_aggreement_consent_server: Y # Must be Y or N
end_user_license_aggreement_consent_cli: "YES" # Must be YES or NO in all caps within quotes
edition: evaluation

# For use when creating, importing, or deleting databases
db_name: pub
db_host: 127.0.0.1
db_port: 1433
db_user: sa
db_password: P@ssWORD!

Os dejo las mías:

---
- hosts: sql
  become: yes
  roles:
    - pre-reqs
    - ansible-role-mssql
  tasks:
    - name: Wait up to 60 seconds for server to become available after creation
      wait_for:
        port: 1433
        timeout: 60
    - name: Create elblogdenegu db
      include_role:
        name: ansible-role-mssql
        tasks_from: elblogdenegu_db

# These are required for database installation
#
end_user_license_aggreement_consent_server: Y # Must be Y or N
end_user_license_aggreement_consent_cli: "YES" # Must be YES or NO in all caps within quotes
edition: developer

# For use when creating, importing, or deleting databases
db_name: elblogdeneguDB
db_host: 127.0.0.1
db_port: 1433
db_user: sa
db_password: P@ssWORD!

Ejecutamos la instalación (en un LXC de Proxmox tengo que instalar SUDO antes de ejecutar, sino da errores). Se generará un gran “churro”:

ansible-playbook -i ../inventory/sql site.yaml -e @vars.yaml -vvv

[root@TERRAFORM mssql2019-roles-RHEL8]# ansible-playbook -i ../inventory/sql site.yaml -e @vars.yaml -vvv
ansible-playbook 2.9.10
  config file = /etc/ansible/mssql2019-roles-RHEL8/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /bin/ansible-playbook
  python version = 2.7.5 (default, Apr  2 2020, 13:16:51) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
Using /etc/ansible/mssql2019-roles-RHEL8/ansible.cfg as config file
host_list declined parsing /etc/ansible/inventory/sql as it did not pass its verify_file() method
script declined parsing /etc/ansible/inventory/sql as it did not pass its verify_file() method
auto declined parsing /etc/ansible/inventory/sql as it did not pass its verify_file() method
Parsed /etc/ansible/inventory/sql inventory source with ini plugin

PLAYBOOK: site.yaml *******************************************************************************************************************************************
1 plays in site.yaml

PLAY [sql] ****************************************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************************************
task path: /etc/ansible/mssql2019-roles-RHEL8/site.yaml:2
<192.168.2.175> ESTABLISH SSH CONNECTION FOR USER: None
...

PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
localhost                  : ok=18   changed=15    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

Espero os parezca interesante…

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Ansible: Instalar SQL Server 2019 en Linux se publicó primero en Blog Virtualizacion.

Powershell: Script cambiar descripción grupo Directorio Activo

$
0
0

Powershell: Script cambiar descripción grupo Directorio Activo

Hoy entrada rápida, os dejo un script para poder modificar la descripción de un grupo de Directorio Activo.

Imaginaros que habéis creado masivamente grupos de directorio activo con una descripción que es siempre fija, y que sólo se modifica cierto texto. Os habéis dado cuenta, que esos grupos se van a poder usar para otras aplicaciones, y la descripción no define bien su uso, pero ya tenéis cientos…en vez de hacerlo uno a uno, lo haremos vía script de Powershell.

En el ejemplo, lo vamos a hacer con grupos de impresoras. Voy a extraer el dato actual en dos grupos, ya que necesito el nombre del grupo y la descripción. Luego cada línea va a corresponderse entre ellas.

Sería así:

GITHUB: https://gist.github.com/raulunzue/6736c2c84ff15998d7db5929d91c9696

########################################
## RAUL UNZUE - ElBlogdeNegu
# Cambio nombre Grupo Directorio Activo
########################################

# Saber el número de línea de un elemento
function linea 
     {$input | Select-String '.' | Select-Object LineNumber, Line}

# Ruta a la OU donde se generan los grupos por cada impresora
$OU_impresoras = "OU=IMPRESORAS,DC=NEGU,DC=LOCAL"

# Variable que contiene los nombre de todos los grupos de la OU anterior, que a su vez contienen los nombres de las impresoras ya creadas
get-adobject -Filter 'ObjectClass -eq "group"' -SearchBase $OU_impresoras -Properties Name | select Name > C:\Users\elblogdenegu\Desktop\gpimp_name.txt

# LIMPIAMOS FICHERO
(Get-Content C:\Users\elblogdenegu\Desktop\gpimp_name.txt) | foreach {$_ -replace "Name",""} | foreach {$_ -replace "----",""} | Set-Content C:\Users\elblogdenegu\Desktop\gpimp_name.txt

# PASAMOS A VARIABLE
$nombre_grupos_impresoras = (Get-Content C:\Users\elblogdenegu\Desktop\gpimp_name.txt)

# Variable que contiene las descripciones de todos los grupos de la OU anterior, que a su vez contienen los nombres de las impresoras ya creadas
get-adobject -Filter 'ObjectClass -eq "group"' -SearchBase $OU_impresoras -Properties Description | select Description > C:\Users\elblogdenegu\Desktop\gpimp_des.txt

# LIMPIAMOS FICHERO
(Get-Content C:\Users\elblogdenegu\Desktop\gpimp_des.txt) | foreach {$_ -replace "TEXTO Impresora ",""} | foreach {$_ -replace "Description",""} | foreach {$_ -replace "-----------",""} | Set-Content C:\Users\elblogdenegu\Desktop\gpimp_des.txt

# TRATAMOS EL DATO
$descripcion_impresoras = (Get-Content C:\Users\elblogdenegu\Desktop\gpimp_des.txt)
foreach ($g in $nombre_grupos_impresoras) {
        $lineagrupo= (Get-Content "C:\Users\elblogdenegu\Desktop\gpimp_name.txt") | sls -Pattern $g | linea
        $impresora= (Get-Content C:\Users\elblogdenegu\Desktop\gpimp_des.txt -TotalCount $lineagrupo.LineNumber)[-1]
        Get-ADGroup -SearchBase $OU_impresoras -Filter {name -eq $g} -Properties Name,Description | set-adgroup -description "Impresora $impresora"   
}

Espero os parezca interesante…

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Powershell: Script cambiar descripción grupo Directorio Activo se publicó primero en Blog Virtualizacion.

Powershell: Copia datos incrementales a USB

$
0
0

Powershell: Copia datos incrementales a USB

Hoy os traigo un script de Powershell que nos va a permitir:

  • Realizar una copia de %userdata%
  • Se realiza sobre una unidad USB
  • Permite realizar copias de PST´s
  • Sólo realizará copia de los ficheros desde una determinada fecha
  • En mi caso genera una estructura concreta en el USB NombreUsuario\Perfil
  • Nos deja LOG del proceso
  • Se debe lanzar desde el propio USB, para no instalar nada en local
  • GITHUB: https://gist.github.com/raulunzue/47d85dc6e91473825cf0f4eef5607142
#######################################
## RAUL UNZUE - ELBLOGDENEGU
## 02/12/2020
## SCRIPT COPIADO INCREMENTAL PERFIL
#######################################
#CERRAR OUTLOOK
#Bucle que solicita cerrar Outlook hasta que no detecta ningun proceso outlook corriendo
#Para que deje copiar PSTs Outlook tiene que estar cerrado
    Do {
	    Write-Host ""
	    Write-Host "Por favor, es necesario cerrar Outlook antes de ejecutar el script."
	    pause
	    $outlookproc=Get-Process | Where-Object { $_.Name -eq "outlook" }
	    }Until ($outlookproc.count -eq 0)
## SABER RUTA
    $ruta=pwd
## SABER EL USUARIO
    $u=C:\windows\system32\whoami.exe
## ELIMINAR DOMINIO
    $posicion = $u.IndexOf("\")
    $posicion = $posicion+1
    $usuario = $u.substring($posicion, $u.Length - $posicion)
## CARGAMOS ORIGEN Y DESTINO
    $origen="c:\Users\$usuario"
    $destino="$ruta$usuario\Perfil"
Start-Transcript -Path "$ruta\copia-$usuario.log"
## GENERAMOS RUTA EN EL DISCO USB PARA EL USUARIO
    New-Item -Path $destino -ItemType Directory -Force
## SABER DIRECTORIOS Y FICHEROS LOCALES MODIFICADOS A PARTIR DE UNA FECHA
# DIRECTORIOS
    #Últimos directorios modificados
    $dir= Get-ChildItem -Path $origen -Recurse -Directory | Where-Object {$_.LastWriteTime -gt "12/02/2020" -OR $_.LastAccessTime -gt "12/02/2020"}
    #Contar los directorios
    $dircount = $dir.fullname.count
# FICHEROS
    #Últimos ficheros modificados
    $file = Get-ChildItem -Path $origen -Recurse -File | Where-Object {$_.LastWriteTime -gt "12/02/2020" -OR $_.LastAccessTime -gt "12/02/2020"}
    #Contar los ficheros
    $filecount = $file.fullname.count
## GENERAR DIRECTORIOS Y COPIAR DATOS
    for ($i = 0; $i -le $dircount; $i++){
            # Extraemos cada directorio del listado
            $dr=$dir.Item($i).FullName
            Write-Output "Directorio que se va a generar $dr"
            # Tratamos el dato
            $dr > "$destino\dr-$usuario-$i.txt"
            (Get-Content -Path "$destino\dr-$usuario-$i.txt") -replace ($usuario, "") -replace ("c:", "") -replace ("Users", "") | Set-Content -Path "$destino\dr-$usuario-$i.txt"
            (Get-Content -Path "$destino\dr-$usuario-$i.txt") -replace ('\\\\\\', "") | Set-Content -Path "$destino\dr-$usuario-$i.txt"
            (Get-Content -Path "$destino\dr-$usuario-$i.txt")  | ? {$_.trim() -ne "" } | Set-Content -Path "$destino\dr-$usuario-$i.txt"
            [string]$d=(Get-Content -Path "$destino\dr-$usuario-$i.txt")
            # Validación que existe
            $testd= Test-Path -Path $destino\$d
            # Si no existe generamos la copia
            if ($testd -eq $False){
                # Generamos los directorios
                Write-Output "Se genera el directorio en la ruta $destino\$d"
                New-Item -Path $destino\$d -ItemType Directory -Force
                for ($x = 0; $x -le $filecount; $x++){
                    # Extraemos la ruta del fichero a copiar
                    [string]$fi=$file.Item($x).FullName
                    [string]$f=$file.Item($x).Name
                    # Validamos que existe el fichero
                    Write-Output "Fichero que podemos copiar $fi"
                    $existe=("$fi" | sls -Pattern "$d\$f" -CaseSensitive -SimpleMatch)
                    # Si la ruta del fichero contiene la que contienen los directorios, se copia el fichero
                    if ($existe -ne $null){
                        Write-Output "Existe la ruta, se copia fichero $file.Item($x).Name en el directorio $destino\$d"
                        Copy-Item -Path "$fi" -Destination "$destino\$d" -Filter *.txt -Recurse -Force -PassThru 
                    }
                    # Sino, no se copia
                    else{
                        Write-Output "No hay más ficheros que copiar en el directorio $destino\$d"
                    }
                }
            }
            # Si existe no realizamos la copia
            else{
                Write-Output "No existen más directorios que generar"
            }
            #BORRAMOS FICHERO TXT DE PRECARGA
            Remove-Item -Path "$destino\dr-$usuario-$i.txt"
    }

Stop-Transcript
Espero os parezca interesante…

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Powershell: Copia datos incrementales a USB se publicó primero en Blog Virtualizacion.

Powershell: Extraer usuarios de varios grupos a CSV

$
0
0

Powershell: Extraer usuarios de varios grupos a CSV

Hoy os voy a mostrar un script de powershell que nos va a permitir traernos los usuarios de varios grupos de directorio activo a un fichero CSV:

GITHUB: https://gist.github.com/raulunzue/e7c0ae30db9b4f82997606dc5b354e0d

###################
### RAUL UNZUE - ELBLOGDENEGU
### SCRIPT POWERSHELL
## EXTRAER USUARIOS GRUPOS AD
###################

$groups = (Get-AdGroup -SearchBase "OU=IMPRESORAS,DC=NEGU,DC=LOCAL" -filter * | Where {$_.name -like "**"} | select name -expandproperty name) 
$Table = @() 
$Record = @{ 
    "Group Name" = "" 
    "Name" = "" 
    "Username" = "" 
} 
Foreach ($Group in $Groups) { 
    $Arrayofmembers = Get-ADGroupMember -identity $Group -recursive | select name,samaccountname 
    foreach ($Member in $Arrayofmembers) { 
        $Record."Group Name" = $Group 
        $Record."Name" = $Member.name 
        $Record."UserName" = $Member.samaccountname 
        $objRecord = New-Object PSObject -property $Record 
        $Table += $objrecord 
        } 
} $Table | export-csv "C:\Users\raul\Desktop\usuarios-grupos.csv" -NoTypeInformation

Espero os parezca interesante…

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Powershell: Extraer usuarios de varios grupos a CSV se publicó primero en Blog Virtualizacion.


Proxmox: Configurar Metric Server en InfluxDB

$
0
0

Proxmox: Configurar Metric Server en InfluxDB

Hoy vamos a utilizar una de las últimas novedades de Proxmox, que es poder llevar nuestras metric server a una base de datos externa, que en nuestro caso va a ser InfluxDB.

Lo voy a hacer sobre InfluxDB porque ya lo tengo montado para mi Grafana.

Como podéis ver podréis usar nativamente Graphite o InfluxDB desde el propio panel de gestión de Proxmox.

Se puede hacer vía comando en la siguiente ruta /etc/pve/status.cfg, pero estando integrado…

root@pve1:/etc/pve# cat status.cfg 
influxdb: METRICAS
        port 8089
        server 192.168.2.110

Para llegar al menú nos colocaremos en el Centro de datos -> Metric Server -> Agregar -> InfluxDB:

proxmox-configurar-metric-server-1

Introducimos los datos del server y el puerto en el que escucha, que por defecto suele ser el 8089 para InfluxDB:

proxmox-configurar-metric-server-2

Pulsamos Crear para que se genere la conexión:

proxmox-configurar-metric-server-3

En nuestro InfluxDB configuraremos lo siguiente:

[root@GRAFANA ~]# nano /etc/influxdb/influxdb.conf

Éste el ejemplo más básico:

[[udp]]
   enabled = true
   bind-address = "0.0.0.0:8089"
   database = "proxmox"
   batch-size = 1000
   batch-timeout = "1s"

proxmox-configurar-metric-server-5

Reiniciamos el servicio y comprobamos que todo sigue en orden:

[root@GRAFANA ~]# systemctl restart influxdb

Ahora iremos a Grafana para explotarlo:

proxmox-configurar-metric-server-4

Menú Configuration -> Data Sources:

proxmox-configurar-metric-server-6

Agregamos la base de datos:

proxmox-configurar-metric-server-7

El origen será Influxdb:

proxmox-configurar-metric-server-8

Completamos las settings tal y como tengamos InfluxDB configurado:

proxmox-configurar-metric-server-9

Ahora validamos al salvar que todos los datos son correctos:

proxmox-configurar-metric-server-10

Y comprobamos que se escriben datos:

proxmox-configurar-metric-server-11

Ahora sólo queda jugar con las métricas que más os interesen, e integrarlo en Grafana, Zabbix o vuestro sistema de monitorización preferido.

Espero os parezca interesante…

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Proxmox: Configurar Metric Server en InfluxDB se publicó primero en Blog Virtualizacion.

Kubernetes: Instalación Minishift

$
0
0

Kubernetes: Instalación Minishift

Muchas veces, cuando planteas entornos de Kubernetes, estás pensando en generar una infraestructura completa y compleja. Esto se debe a que Kubernetes está unido al concepto de clúster.

Como la mayoría de personas que empiezan en este mundillo, no tienes los recursos necesarios para montarlo, porque no tienes hardware suficiente.

Pero la realidad es que podemos montar nuestra infraestructura de forma local con varias tecnologías y hoy os vamos a enseñar una.

Instalación local de Kubernetes

De todas maneras, listamos las que conocemos ahora mismo. Así echando la vista en lo que existe actualmente podemos usar:

  • Minikube: Es la forma más sencilla y usada entre los desarrolladores, de instalar una infraestructura Kubernetes. Lo que necesita es un host que pueda soportar:
  • Kind: Con Kind lo que haremos es utilizar un container Docker para ejecutarlo.
  • Kubeadm:
  • Minishift: Es la opción que vamos a desarrollar hoy.
    • URL: https://www.okd.io/minishift/
    • 2 vCPUs
    • 4 GB de RAM
    • Y unos 20GB de disco
    • Nos permite ejecutar un clúster OKD (Openshift Container) en un solo nodo dentro de una máquina virtual. Se puede hacer bajo Windows, Linux o MacOS, que es este último caso el que vamos a utilizar.

Instalar Minishift en MacOS

Para este ejemplo voy a utilizar mi MacBook Pro, que me va a permitir lanzar un clúster de Kubernetes en local. Espero que os parezca interesante, porque allá vamos…

Instalamos el gestor de paquetes brew:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Lo primero que haremos es hacer una vez instalado es un update de brew:

brew update

Instalaremos la última versión de hyperkit:

brew install hyperkit

kubernetes-instalacion-minishift-1

Luego instalaremos el siguiente driver:

brew install docker-machine-driver-hyperkit

Si lo lanzas con un usuario que no sea root habrá que lanzar los siguientes comandos:

MacBook-Pro-de-Raul:~ raulunzue$ sudo curl -L  https://github.com/machine-drivers/docker-machine-driver-hyperkit/releases/download/v1.0.0/docker-machine-driver-hyperkit -o /usr/local/bin/docker-machine-driver-hyperkit
Password:
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   656  100   656    0     0   1525      0 --:--:-- --:--:-- --:--:--  1522
100 11.9M  100 11.9M    0     0  5112k      0  0:00:02  0:00:02 --:--:-- 10.7M
MacBook-Pro-de-Raul:~ raulunzue$ sudo chown root:wheel /usr/local/bin/docker-machine-driver-hyperkit
MacBook-Pro-de-Raul:~ raulunzue$ sudo chmod u+s,+x /usr/local/bin/docker-machine-driver-hyperkit

Instalamos minishift:

brew cask install minishift

kubernetes-instalacion-minishift-2

Arrancamos minishift:

minishift start

Puede que la seguridad de MacOS os juegue una mala pasada:

kubernetes-instalacion-minishift-3

Desde Ajustes -> Seguridad deberéis darle permisos:

kubernetes-instalacion-minishift-4

Y pulsamos Abrir:

kubernetes-instalacion-minishift-5

Y podréis usar Minishift:

kubernetes-instalacion-minishift-6

Si os da errores el driver revisar esto: https://github.com/moby/hyperkit

¿Ahora cómo lanzamos un container? Como lo haríamos normalmente:

kubectl create deployment hello-world --image=nginx

Si queremos parar:

minishift stop

Espero os parezca interesante…

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Kubernetes: Instalación Minishift se publicó primero en Blog Virtualizacion.

Programación para niños con Scratch

$
0
0

Programación para niños con Scratch

Estos días, los que somos padres, tendremos muchas horas por delante con los peques de la casa…

Una de las cosas que había pensado era trabajar con algún robot arduino y empezar a ver si le puede interesar algo un tema que me parece interesante para mí, como es la programación.

El problema es, que aunque existen múltiples opciones de robots arduino con los que iniciarse, que una vez hecho el gasto, si al final no le interesa acabará por ser otro juguete tirado por casa.

Así que antes de dar ese paso, me propuse encontrar plataformas online que me ayuden a despejar mis dudas.

Rebuscando el otro día por las cavernas de Twitter, sugirieron el siguiente proyecto:

programacion-para-ninos-con-scratch-1

Si echáis un vistazo a la web, veréis que está basada en ejercicios muy interesantes, con diferentes niveles, que se pueden adaptar a la capacidad de la mayoría de niños.
Como es muy visual, creo que puede ser muy atractivo para encender esa mecha que a mí me interesa encender.

El proyecto está impulsado por mujeres, que con una niña de 9 años en casa, y las veces que le he intentado explicar lo que hago en mi trabajo y que sólo ve hombres en la ecuación, para mí puede ser un punto a mi favor. Porque, aunque nos pese, el estigma del informático, hombre, de gafitas, regordete…es triste, pero nos persigue ya hasta en l@s niñ@s. Es motivante que vea que en este gremio también hay un espacio para ellas, y que impulsan proyectos geniales. Os animo también a leerles a nuestras “enanas” el libro “CUENTOS DE BUENAS NOCHES PARA NIÑAS REBELDES” o “PIPPI CALZASLARGAS”, donde pueden verse reflejadas y que sepan que cualquiera puede conseguir cualquier cosa, con mucho trabajo y esfuerzo.

Bueno…volviendo al tema, ¿en qué se basa la plataforma? Como siempre hay un lenguaje de programación que permite todo esto. En este caso se trata de SCRATCH:

¿Qué es SCRATCH?

Scratch es un lenguaje de programación de software libre, que fue creado por el Massachusetts Institute of Technology o MIT. La idea inicial era conseguir un lenguaje de programación accesible a todos los niveles, sin tener ningún concepto previo. La programación sobre Scratch nos permite generar contenido gráfico de una forma fácil y sencilla.

Esto hace que sea un lenguaje ideal para todos aquellos que queremos empezar en la programación, para escuelas y niños que quieren hacer sus primeros “pinitos” en este mundo.

Para programar con scratch, lo podemos hacer mediante un cliente que es multiplataforma (Linux, Windows o MacOS), o sobre una plataforma online desde cualquier dispositivo (PC, Móvil o Tablet), lo que se adapta prácticamente a todas las personas.

En Scratch se manejan objetos que se llaman “sprites” y acciones o comportamientos, que permiten interactuar fácilmente entre ellos. Y esto se hace mediante un panel, que nos permite arrastrar todos estos objetos y ver el resultado prácticamente al instante (girar al personaje de nuestra viñeta, hacerle hablar, correr…). Nos permite cambiar el fondo, utilizar nuestros propios dibujos…¿no creéis que un niñ@ que dibuja y puede darle vida a su historia, no puede alucinar con esto?

programacion-para-ninos-con-scratch-2

Os contaré como funciona mi experimento… 🙂

Espero os parezca interesante…

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Programación para niños con Scratch se publicó primero en Blog Virtualizacion.

Ansible: Validar ficheros YAML

$
0
0

Ansible: Validar ficheros YAML

Hoy vamos a hacer una entrada medianamente rápida…

La idea es explicaros cómo validar la sintaxis de ficheros YAML o YML que podemos utilizar en Kubernetes, Ansible y otras plataformas de automatización, mediante una herramienta.

Ya hemos hablado otras veces, en que consiste un fichero YAML. Aunque su programación es relativamente sencilla porque tiene una estructuración bastante simple, siempre nos podemos “colar” en alguna línea o bloque, y volvernos locos.

Para evitar esto, podemos usar una herramienta que se llama YAMLLINT. Os dejo al web del proyecto:

Lo mejor de todo, es que está disponible en casi todas las distribuciones linux. Os dejo el ejemplo de como instalarla en Centos:

yum -y install yamllint

Y el enlace para el resto de distribuciones:

https://yamllint.readthedocs.io/en/stable/quickstart.html

Aunque lo que me parece más interesante, es que lo puedes hacer vía online desde la siguiente URL:

http://www.yamllint.com/

Introducís vuestro código y pulsáis GO:

ansible-validar-ficheros-yaml-2

Introducimos el código de ejemplo, un nginx para Kubernetes:

ansible-validar-ficheros-yaml-3

Veréis que se valida:

Le introduzco errores a propósito para verificar el funcionamiento. Desplazo un espacio metadata, que es un descuido muy común:

ansible-validar-ficheros-yaml-5

Espero os parezca interesante…

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Ansible: Validar ficheros YAML se publicó primero en Blog Virtualizacion.

Python: Aprendiendo desde cero VI – Operadores

$
0
0

Python: Aprendiendo desde cero VI – Operadores

Después de un tiempo parado, entre la salud y otro proyecto, volvemos a la carga con el curso de Python, más vale tarde que nunca.

Hoy vamos a hablar de Operadores. Recordaremos que en Python, como en otros lenguajes de programación, todo es un objeto. Un operador, es un objeto que relaciona de una forma diferente los valores de una o varias variables.

Esas variables pueden ser de tres tipos, números, que se utilizaría operadores aritméticos (nos devuelven un valor numérico). Variables de datos, con las que utilizaríamos operadores relacionales (nos devuelve un True / False), y operadores lógicos que nos permitiría relacionar variables lógicas (también nos devuelven un True / False).

Así que vamos a poner varios ejemplos:

Operadores lógicos en Python

  • AND:
      • Donde nos indicaría que se cumple X y Z
      • Ejemplo:
        # Python Operadores Lógicos
        # El Blog de Negu 
        
        a = 10
        b = 4
        c = -10
        
        if a > 0 and b > 0: 
        	print("Los números son mayores que 0") 
        
        if a > 0 and b > 0 and c > 0: 
        	print("Los números son mayores que 0") 
        else: 
        	print("Al menos un número no es mayor que 0")
        python-aprendiendo-desde-cero-vi-operadores-1
  • OR:
    • Donde nos indicaría que se cumple X o Z
    • Ejemplo:
      # Python Operadores Lógicos
      # El Blog de Negu 
      
      a = 10
      b = 4
      c = -10
      
      if a > 0 or b > 0: 
      	print("Los números son mayores que 0") 
      
      if a > 0 or b > 0 or c > 0: 
      	print("Los números son mayores que 0") 
      else: 
      	print("Al menos un número no es mayor que 0")
  • NOT:
    • Donde nos indicaría que es verdadero si el operando es falso
    • Ejemplo:
      # Python Operadores Lógicos
      # El Blog de Negu 
      
      a = 10
        
      if not a: 
          print("El valor booleano de a es True") 
        
      if not (a%3 == 0 or a%5 == 0): 
          print("10 no es divisible por 3 o 5") 
      else: 
          print("10 es divisible por 3 o 5")

Operadores aritméticos en Python

Dentro de los operadores aritméticos, disponemos de los operadores de asignación, que se utilizan en Python para asignar valores a las variables.

python-aprendiendo-desde-cero-vi-operadores-2a

La función principal de los operadores aritméticos, es realizar operaciones matemáticas como sumas, restas, multiplicaciones, etc.

python-aprendiendo-desde-cero-vi-operadores-2b

Operadores relacionales en Python

Los operadores de comparación se utilizan para comparar valores. Devuelve TrueFalsesegún la condición.

python-aprendiendo-desde-cero-vi-operadores-3

TEMARIO APRENDE PYTHON DESDE CERO

Python: Aprendiendo desde cero I: Introducción
Python: Aprendiendo desde cero II: Comentarios, Variables y Datos
Python: Aprendiendo desde cero III: Controles de flujo
Python: Aprendiendo desde cero IV: Funciones
Python: Aprendiendo desde cero V – Módulos
Python: Aprendiendo desde cero VI – Operadores

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Python: Aprendiendo desde cero VI – Operadores se publicó primero en Blog Virtualizacion.

Python: Aprendiendo desde cero VII – Estructura proyecto

$
0
0

Python: Aprendiendo desde cero VII – Estructura proyecto

Como ya he comentado varias veces, yo no soy programador, pero he hecho mis pinitos durante estos años. Y una de las cosas que más me interesa cuando gestiono un proyecto, es intentar hacer un diseño lo más limpio posible, y que a la larga no me de problemas ni a mí ni a mi equipo.

Como nuestro objetivo final es aprender Python y generar un pequeño programa, vamos a empezar con conceptos de cómo estructurar las carpetas de nuestro futuro programa. Sé que nos quedan muchos más conceptos por descubrir, pero es interesante descubrir otros temas relacionados.

Así que me pongo manos a la obra, espero que os parezca interesante…

Para empezar vamos a hablar de cómo estructurar los repositorios de nuestro proyecto, e intentaremos, más adelante, hablar un poco de scripting y otros conceptos relacionados.

Decir que me he documentado antes de escribir este post (bueno como casi siempre, pocas cosas son de cosecha propia), con profesionales que saben mucho más de Python o desarrollo que yo (que tampoco es complicado ;P ). Dicho esto, la estructura a seguir, sería más o menos ésta, y ahora la vamos explicando poco a poco:

README.rst
LICENSE
setup.py
requirements.txt
sample/__init__.py
sample/core.py
sample/helpers.py
docs/conf.py
docs/index.rst
tests/test_basic.py
tests/test_advanced.py

Datos y ficheros que deberemos recopilar:

  • Nombre del proyecto
  • Descripción del proyecto
  • Ficheros y estructura:
    • README.rst:
      • Un fichero README permite a un usuario que no conozca el proyecto identificar cual es el objetivo del mismo, su descripción e incluso indica cómo hacer la instalación o ejecución de los ficheros.
      • Es importante, sobre todo si vas a compartir el proyecto en plataformas donde quieres que se contribuya, o tienes compañeros de desarrollo que van a utilizarlo.
      • Se sitúa normalmente en el raíz de la estructura, ya que si lo subes por ejemplo, a Github u otra plataforma, será utilizado para recopilar información.
      • Se puede escribir en casi cualquier formato de texto, pero en desarrollo normalmente se usa Markdown
      • Os dejo un ejemplo:

python-aprendiendo-desde-cero-vii-estructura-proyecto-1

    • LICENSE:
      • Si estáis generando un proyecto para vuestra empresa, uso personal o incluso para compartirlo, es importante definir el tipo de licencia que se va usar en el proyecto. Eso se hace en este fichero.
      • Para definir el tipo de licencia podéis usar la web: https://choosealicense.com/
      • Podéis no colocar ninguna licencia, pero creo que es importante definir el objetivo, aunque lo entregues a la comunidad, para que sea un proyecto serio.
      • Os dejo un ejemplo:
Copyright (c) 2021, El Blog de Negu

All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    • CARPETA SAMPLE:
      • Donde se definen los módulos del proyecto, de los que hablaremos en otro apartado.
      • Aunque lo comentamos en otra entrada, un módulo se podría definir cómo un fichero que se puede reutilizar de forma recurrente en un programa. Ya que hasta ahora, sólo hemos hecho ejemplos con variables y funciones que se ejecutan en el momento, pero cuando termina la ejecución se pierden. Un módulo es un fichero que contiene definiciones y declaraciones de Python, que podemos usar luego en un script.
    • REQUERIMENTS.TXT:
      • Si nuestro proyecto tiene dependencias, sería el fichero donde definirlas.
    • SETUP.PY:
      • Es el script de configuración. Nos permite la gestión de los paquetes y librerías
      • Su propósito es la correcta instalación del software. Sería como el lanzador del programa
    • CARPETA DOCS:
      • Carpeta que contiene toda la documentación del proyecto
    • CARPETA TEST:
      • Esta carpeta contiene nuestro entorno de test, para realizar las pruebas de nuevas compilaciones

TEMARIO APRENDE PYTHON DESDE CERO

Python: Aprendiendo desde cero I: Introducción
Python: Aprendiendo desde cero II: Comentarios, Variables y Datos
Python: Aprendiendo desde cero III: Controles de flujo
Python: Aprendiendo desde cero IV: Funciones
Python: Aprendiendo desde cero V – Módulos
Python: Aprendiendo desde cero VI – Operadores
Python: Aprendiendo desde cero VII – Estructura proyecto

Espero os parezca interesante…seguiremos con los conceptos básicos hasta poder hacer un pequeño programa que es el objetivo final.

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Python: Aprendiendo desde cero VII – Estructura proyecto se publicó primero en Blog Virtualizacion.

Python: Aprendiendo desde cero VIII – Scripting

$
0
0

Python: Aprendiendo desde cero VIII – Scripting

Seguimos con el curso gratuito sobre Python con otra entrada. Hoy vamos a hablar sobre Scripting.

¿Qué es un script?

Un script es básicamente un archivo que contiene código escrito en el idioma que identifica su extensión, en este caso Python, y que es ejecutable.

En nuestro caso, estamos hablando de ficheros con extensión “.py” ó “.pyw“.

El script más sencillo sería el típico “Hello Word!”, con un contenido tipo:

# SCRIPT DE EJEMPLO PYTHON, ELBLOGDENEGU
print ('Hello Word!')

Nos devolvería su ejecución un bonito Hello Word!:

python-aprendiendo-desde-cero-viii-scripting-1

Vamos a desglosar un poco el script:

  • # : Todo lo que viene detrás del símbolo almohadilla es un comentario, en este caso explica el script en sí y el autor, podéis colocar varias líneas, como ya os comenté en otras fases del curso.
  • print : Es una función predefinida en Python, que lo que hace es escribir por pantalla el texto que nosotros coloquemos entre las comillas.

Partiendo de este pequeño ejemplo, vamos a explicar un poco más en profundidad como ejecutar scripts en Python.

¿Cómo se ejecuta un script Python?

Cómo pasa con otros lenguajes, o cómo hago yo con BASH o POWERSHELL en los diferentes ejemplos subidos en este blog, para ejecutar un script Python necesitaréis un intérprete que comprenda el contenido del script.

Podéis dirigiros a la URL del proyecto para instalar el que más os convenga, según vuestro sistema operativo:

https://www.python.org/downloads/

python-aprendiendo-desde-cero-viii-scripting-2

Una vez instalado, podéis comprobar la versión que tenéis instalada con el siguiente comando:

MacBook-Pro-de-Raul:/ raulunzue$ python3 -V
Python 3.9.1

Cuando ya disponemos del intérprete de comandos, ahora vemos de qué formas realizar de nuestro script Python. Existen 4 formas de ejecutar un script Python:

  • Modo interactivo
  • Línea de comando
  • Editor de texto
  • IDE (PyCharm)

Modo Interactivo en Python

Cuando trabajamos en modo interactivo, lo que estamos haciendo es interactuar directamente con la shell, y cada línea que escribamos se va ejecutando, cargando…

Lo lanzamos simplemente escribiendo en la consola de nuestro sistema con comando python o python3:

python-aprendiendo-desde-cero-viii-scripting-3

Sería algo así:

MacBook-Pro-de-Raul:bin raulunzue$ python3
Python 3.9.1 (v3.9.1:1e5d33e9b9, Dec  7 2020, 12:10:52) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> print("Este es el curso gratuito de Python de El Blog de Negu")
Este es el curso gratuito de Python de El Blog de Negu
>>>

Podemos utilizar la carga de variables para conseguir un resultado parecido:

MacBook-Pro-de-Raul:bin raulunzue$ python3
Python 3.9.1 (v3.9.1:1e5d33e9b9, Dec  7 2020, 12:10:52) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> variable = "El Blog de Negu"
>>> print("Este blog siempre será " + variable)
Este blog siempre será El Blog de Negu

Podéis hacer uso del tabulador para completar comandos o utilizar help() para descubrir todo el potencial de la consola. Para salir de este modo, pulsamos CTRL+Z o escribimos exit() + Enter.

Línea de comandos en Python

Otra forma de lanzar scripts de Python, es guardar nuestro código en un fichero con extensión PY y lanzarlo con el comando python o python3 delante. Os dejo un ejemplo:

MacBook-Pro-de-Raul:Documents raulunzue$ python3 prueba.py 
Hola Mundo

Editor de texto en Python

Una forma más cómoda y ordenada que estos dos últimos métodos, sería utilizar un Editor de texto que permita ejecutar scripts de Python.

En mi caso, uso Visual Studio Code o VS Code en local, que me permite, gracias a sus extensiones, poder ejecutar sin depender tanto del sistema operativo, Powershell, Bash o Python entre otros.

python-aprendiendo-desde-cero-viii-scripting-4

Puedes lanzar ficheros PY, realizar pruebas, modificaciones, hacerlo de forma interactiva y todo de una forma muy ordenada. Es la opción que yo recomiendo si estás empezando y simplemente quieres hacer “tus pinitos”, porque te permite saltar de idiomas de programación sin mucho esfuerzo.

IDE (PyCharm) en Python

La última forma que vamos a explicar es PyCharm, que como diría mi hija, ya es para usuarios PRO.

Al final es una herramienta especializada, que va a resaltarte los errores del código. Es de pago, con lo que su potencia no es gratis:

https://www.jetbrains.com/es-es/pycharm/

python-aprendiendo-desde-cero-viii-scripting-5

Seguiremos completando con el resto de entradas nuestro conocimiento en Python. Os dejo el temario ya generado:

TEMARIO APRENDE PYTHON DESDE CERO

Python: Aprendiendo desde cero I: Introducción
Python: Aprendiendo desde cero II: Comentarios, Variables y Datos
Python: Aprendiendo desde cero III: Controles de flujo
Python: Aprendiendo desde cero IV: Funciones
Python: Aprendiendo desde cero V – Módulos
Python: Aprendiendo desde cero VI – Operadores
Python: Aprendiendo desde cero VII – Estructura proyecto
Python: Aprendiendo desde cero VIII – Scripting

Espero os parezca interesante…seguiremos con los conceptos básicos hasta poder hacer un pequeño programa que es el objetivo final.

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Python: Aprendiendo desde cero VIII – Scripting se publicó primero en Blog Virtualizacion.


Python: Aprendiendo desde cero IX – Fechas

$
0
0

Python: Aprendiendo desde cero IX – Fechas

Seguimos con las pequeñas píldoras del curso gratuito sobre Python.

En este caso vamos a ir explicando como podéis trabajar con fechas, que serán interesantes para crear vuestros programas, logs…

Lo que haremos es utilizar el módulo datetime de Python.

Para ello lo importamos y cargamos el valor en una variable que luego explotaremos,

import datetime
x = datetime.datetime.now()
print(x)

El resultado no da la fecha, la hora, minutos, segundos y milisegundos:

2021-01-05 21:28:36.012717

Ahora podemos ir filtrando según el resultado que nos interese, por ejemplo el año o el día:

import datetime
x = datetime.datetime.now()
print(x.year)
print(x.strftime("%A"))

Si en vez de extraer, necesitamos cargar un dato de fecha concreta, podemos hacerlo así:

import datetime
x = datetime.datetime(2021, 1, 5)
print(x)

Uno de los objetos que se manejan en el módulo de datetime es strftime()

Lo que nos permite es filtrar mediante parámetros ya definidos, os dejo la tabla:

python-aprendiendo-desde-cero-ix-fechas-1

Seguiremos completando con el resto de entradas nuestro conocimiento en Python. Os dejo el temario ya generado:

TEMARIO APRENDE PYTHON DESDE CERO

Python: Aprendiendo desde cero I: Introducción
Python: Aprendiendo desde cero II: Comentarios, Variables y Datos
Python: Aprendiendo desde cero III: Controles de flujo
Python: Aprendiendo desde cero IV: Funciones
Python: Aprendiendo desde cero V – Módulos
Python: Aprendiendo desde cero VI – Operadores
Python: Aprendiendo desde cero VII – Estructura proyecto
Python: Aprendiendo desde cero VIII – Scripting
Python: Aprendiendo desde cero IX – Fechas

Espero os parezca interesante…seguiremos con los conceptos básicos hasta poder hacer un pequeño programa que es el objetivo final.

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Python: Aprendiendo desde cero IX – Fechas se publicó primero en Blog Virtualizacion.

Powershell: Comparar dos Shares, Ficheros o Carpetas

$
0
0

Powershell: Comparar dos Shares, Ficheros o Carpetas

Hoy os voy a explicar cómo comparar dos Shares, carpetas o ficheros.

La idea es que cuando tienes que hacer una réplica de una carpeta, si el tamaño es muy grande, necesitaréis comparar el origen y el destino, tanto al principio como una vez replicadas.

Os voy a enseñar como hacerlo con un script de Powershell, con robocopy o vía una herramienta gráfica y gratuita.

Comparar carpetas con script de Powershell

Os dejo un script de Powershell para comparar dos shares, carpetas o ficheros. Cambiar el origen y el destino por el vuestro. La idea es dejar log con todos los ficheros, el tamaño de las dos carpetas y la comparativa de lo que ha cambiado:

# RAUL UNZUE - EL BLOG DE NEGU
# Hay un límite a tamaño de rutas de 260 caracteres
# Se puede modificar en la siguiente clave de registro:
# `HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)`
# Hay que cambiar el valor de 1 a 0

# REVISAMOS EL ORIGEN
$fso = Get-ChildItem -Recurse -path "M:"
$fso > c:\Users\elblogdenegu\Desktop\datos-origen.txt
# EXTRAEMOS EL TAMAÑO DE LOS FICHEROS ENCONTRADOS
$totalSizeo = ($fso | Measure-Object -Sum Length).Sum / 1GB > c:\Users\elblogdenegu\Desktop\tamano-origen.txt

# REVISAMOS EL DESTINO
$fsd = Get-ChildItem -Recurse -path "N:"
$fsd > c:\Users\elblogdenegu\Desktop\datos-destino.txt
# EXTRAEMOS EL TAMAÑO DE LOS FICHEROS ENCONTRADOS
$totalSized = ($fsd | Measure-Object -Sum Length).Sum / 1GB > c:\Users\elblogdenegu\Desktop\tamano-destino.txt

# COMPARAMOS Y EXTRAEMOS EL RESULTADO
Compare-Object -ReferenceObject $fso -DifferenceObject $fsd -Property Length,Name -IncludeEqual > c:\Users\elblogdenegu\Desktop\comparativa.txt

Comparar carpetas con Robocopy

También se puede hacer vía Robocopy, para evitar la limitación de Powershell:

$origen="\\NAS\carpeta"
$destino="\\NAS02\carpeta"

ROBOCOPY $origen $destino /e /l /ns /njs /njh /ndl /fp /log:c:\Users\elblogdenegu\Desktop\modificaciones.txt

Comparar carpetas con WinMerge

Si la parte vía comando no os resulta cómoda, podéis usar WinMerge, que es una APP gratuita que os hace una comparación visual de ficheros y recursos:

URL: https://winmerge.org/

powershell-comparar-dos-shares-ficheros-o-carpetas-1

Copiar cambios incrementales de dos carpetas

Para terminar os dejo como comprobar los cambios entre dos carpetas:

Copiar: robocopy $origen $destino /E /Z /ZB /TBD /MT:20 /R:3 /W:3 /LOG:.\cambios.log /V /NP /PURGE 
Revisar: robocopy $origen $destino /E /Z /ZB /TBD /MT:20 /R:3 /W:3 /LOG:.\cambios.log /V /NP /PURGE  /L

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Powershell: Comparar dos Shares, Ficheros o Carpetas se publicó primero en Blog Virtualizacion.

Docker: Instalar en Ubuntu 20.04 LTS

$
0
0

Docker: Instalar en Ubuntu 20.04 LTS

Hoy os voy a explicar como instalar Docker en una máquina Ubuntu.

Como vais a ver no es muy complicado lanzar la instalación. Empezamos:

sudo apt update

Instalamos dependencias:

sudo apt install apt-transport-https ca-certificates curl software-properties-common

Agregamos la apt-key:

root@ubuntu:~# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK

docker-instalar-en-ubuntu-20-04-lts-1

Agregamos el repositorio necesario:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"

Actualizamos:

root@ubuntu:~# sudo apt update

Obj:1 http://security.ubuntu.com/ubuntu focal-security InRelease

Obj:2 https://download.docker.com/linux/ubuntu focal InRelease               

Obj:3 http://us.archive.ubuntu.com/ubuntu focal InRelease                    

Obj:4 http://us.archive.ubuntu.com/ubuntu focal-updates InRelease

Obj:5 http://us.archive.ubuntu.com/ubuntu focal-backports InRelease

Leyendo lista de paquetes... Hecho

Creando árbol de dependencias      

Leyendo la información de estado... Hecho

Se puede actualizar 1 paquete. Ejecute «apt list --upgradable» para verlo.

Lanzamos el comando para limpiar la caché:

root@ubuntu:~# apt-cache policy docker-ce

docker-ce:

  Instalados: (ninguno)

  Candidato:  5:20.10.2~3-0~ubuntu-focal

  Tabla de versión:

     5:20.10.2~3-0~ubuntu-focal 500

        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages

     5:20.10.1~3-0~ubuntu-focal 500

        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages

     5:20.10.0~3-0~ubuntu-focal 500

        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages

     5:19.03.14~3-0~ubuntu-focal 500

        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages

     5:19.03.13~3-0~ubuntu-focal 500

        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages

     5:19.03.12~3-0~ubuntu-focal 500

        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages

     5:19.03.11~3-0~ubuntu-focal 500

        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages

     5:19.03.10~3-0~ubuntu-focal 500

        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages

     5:19.03.9~3-0~ubuntu-focal 500

        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages

Hacemos la instalación:

sudo apt install docker-ce

Comprobamos el estado del servicio:

sudo systemctl status docker

docker-instalar-en-ubuntu-20-04-lts-2

Lanzamos un contenedor básico para comprobar:

root@ubuntu:~# docker run hello-world

Unable to find image 'hello-world:latest' locally

latest: Pulling from library/hello-world

0e03bdcc26d7: Pull complete

Digest: sha256:1a523af650137b8accdaed439c17d684df61ee4d74feac151b5b337bd29e7eec

Status: Downloaded newer image for hello-world:latest

Hello from Docker!

This message shows that your installation appears to be working correctly.


To generate this message, Docker took the following steps:

The Docker client contacted the Docker daemon.
The Docker daemon pulled the "hello-world" image from the Docker Hub.

    (amd64)

The Docker daemon created a new container from that image which runs the

    executable that produces the output you are currently reading.

The Docker daemon streamed that output to the Docker client, which sent it

    to your terminal.


To try something more ambitious, you can run an Ubuntu container with:

 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:

 https://hub.docker.com/

For more examples and ideas, visit:

 https://docs.docker.com/get-started/

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Docker: Instalar en Ubuntu 20.04 LTS se publicó primero en Blog Virtualizacion.

Docker: Cambiar la ubicación de docker.sock

$
0
0

Docker: Cambiar la ubicación de docker.sock

En la anterior entrada os he explicado cómo instalar Docker sobre Ubuntu 20.04 LTS. Hoy vamos a hablar de docker.sock y como modificar su ubicación.

Si habéis trasteado algo con Docker habréis visto una referencia tipo /var/run/docker.sock

Ya sea en forma de error, o de configuración, aparece varias veces en el sistema linux donde montéis vuestra infraestructura Docker. ¿Y en qué consiste?

Bueno…se trata del socket que se utiliza para comunicarse con el demonio principal de Docker, siendo la forma predeterminada para poder interactuar con la API y poder lanzar comandos.

Para los que no lo sabéis, un socket o enchufe en cristiano, es un concepto por el que dos procesos intercambian cualquier flujo de datos de manera fiable y ordenada.

Cambiar ubicación docker.sock

Hay veces, que el valor por defecto no nos interesa mantenerlo. Y como está por diseño, muchas veces nos da un poco de respeto hacerlo, pero como veréis no es tan complicado.

Una vez instalado docker en el sistema, comprobamos su estado:

systemctl status docker

 

docker-cambiar-la-ubicacion-de-docker-sock-1

Para hacer la modificación paramos el demonio y comprobamos nuevamente su estado:

systemctl stop docker

systemctl status docker

docker-cambiar-la-ubicacion-de-docker-sock-2

Lo siguiente, será cambiar la ruta de /var/run/docker.sock a /home/elblogdenegu/docker.sock

Para ello deberemos modificar primero docker.conf. Podéis buscarlo con:

find / -name "docker.conf" -print

Según la instalación que tengáis este fichero puede no estar en la ruta que marcamos, por eso podéis encontrarlo en:

  • /etc/init/docker.conf

ó

  • /lib/systemd/system/docker.service

La línea a modificar sería:

DOCKER_SOCKET=/var/run/docker.sock

docker-cambiar-la-ubicacion-de-docker-sock-3

A su vez, también hay que modificar el fichero:

  • /lib/systemd/system/docker.socket

Y modificáis la línea:

ListenStream=/home/geekflare/docker.sock

Y volvemos a recargar el servicio:

systemctl reload docker

Iniciamos servicio y comprobamos:

systemctl start docker

systemctl status docker

Comprobar con un ls -l la ruta donde habéis ubicado el docker.sock para ver si se ha generado:

/home/elblogdenegu/docker.sock

 

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Docker: Cambiar la ubicación de docker.sock se publicó primero en Blog Virtualizacion.

Synology: Instalar Portainer para gestionar Docker

$
0
0

Synology: Instalar Portainer para gestionar Docker

Hoy os voy a explicar como instalar Portainer sobre Synology.

Para los que no lo sabéis, Portainer es un herramienta web que facilita la gestión de entornos de contenedores. En nuestro caso, aprovechando que mi Synology es capaz de ejecutar contenedores Docker y máquinas virtuales, vamos a realizar su instalación sobre un contenedor Docker.

Si habéis enredado con vuestra Synology, sabréis que existe una bonita interfaz gráfica, con plantillas que podéis utilizar. Entre ellas, como no puede ser de otra forma, existe una de Portainer-CE:

synology-instalar-portainer-para-gestionar-docker-1

La cosa es que, Portainer es una de esas herramientas que necesita al fichero docker.sock del sistema que os contaba en la entrada anterior. Os dejo el enlace:

Docker: Cambiar la ubicación de docker.sock

Aunque os podéis molestar en crear el contenedor, si no se hacen con permisos elevados, no os va a funcionar. Porque necesita interaccionar con el sistema para controlar contenedores dentro de Docker, en este caso. Por eso, para crear el contenedor de Portainer lo haremos mediante SSH, con nuestro usuario administrador. Habilitamos SSH en el NAS desde el Panel de Control –> Terminal y SNMP:

synology-instalar-portainer-para-gestionar-docker-2

Para ejecutar nuestro contenedor, necesitaremos un volumen persistente. Por eso, en mi caso creo una carpeta en /volume1/docker/portainer:

synology-instalar-portainer-para-gestionar-docker-3

Ahora nos conectamos a nuestro NAS Synology vía consola:

MacBook-Pro-de-Raul:~ elblogdenegu$ ssh elblogdenegu@192.168.2.1

elblogdenegu@192.168.2.1's password:

El comando necesario sería de esta manera, al ejecutarlo nos pedirá contraseña y se creará el contenedor:

elblogdenegu@SYNOLOGY:~$ sudo docker run -d -p 9000:9000 --name=portainer --restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /volume1/docker/portainer:/data portainer/portainer-ce:latest
Password: 
f88be498a59c7f1b3e583102c798ce5ae8308f69c98c114df3d7835c1780e537

Como podéis ver:

  • Uso el puerto 9000 tanto para la red del container como para el puerto expuesto
  • El nombre del contenedor será “portainer”
  • Al colocar el restart, le decimos que si pasa algo en el NAS el contenedor siempre se reinicie para que no se quede parado
  • El punto de montaje del volumen tanto en el NAS “/volume1/docker/portainer” como en el propio contenedor donde se va a mapear “data”
  • Y la versión “latest” del contenedor que exista en el repo oficial

Una vez que se ejecuta y no da errores, podéis conectaros a la IP de vuestro NAS vía navegador al puerto 9000 (http://192.168.2.1:9000/)

synology-instalar-portainer-para-gestionar-docker-4

Podemos definir cualquier usuario. Una vez dentro pulsamos Docker –> Connect:

synology-instalar-portainer-para-gestionar-docker-5

Y ya tenemos Portainer configurado para gestionar contenedores vía gráfica en Synology:

synology-instalar-portainer-para-gestionar-docker-6

Veréis que es muy intuitivo:

synology-instalar-portainer-para-gestionar-docker-7

Siempre podréis controlar los contenedores como siempre, desde la consola de Synology o vía consola:

synology-instalar-portainer-para-gestionar-docker-8

Espero os parezca interesante…subiremos más entradas relacionadas.

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Synology: Instalar Portainer para gestionar Docker se publicó primero en Blog Virtualizacion.

Viewing all 681 articles
Browse latest View live