Está en la página 1de 64

Introducción a la materia.

La actividad cotidiana depende del correcto funcionamiento de los sistemas informáticos —y saber operar con
dichos sistemas—.
La dependencia del ámbito productivo con los complicados sistemas informáticos es tal, que un problema en una
terminal de trabajo deja prácticamente sin efecto la capacidad operativa de cualquier usuario.
Ante situaciones de esta naturaleza —considerando la complejidad de las actuales plataformas tecnológicas y la
multiplicidad de usuarios con diversos niveles de acceso y experticia—, se hace necesaria la presencia de un
profesional confiable que intervenga, rápida y eficazmente, con habilidades y destrezas mayores a las del operador
habitual.
La función de este profesional —conocido como administrador de infraestructura— es brindar respuestas a los
problemas habituales de hardware y software en cualquier ámbito informatizado, planteándose desde una
problemática y evaluando su mejor solución.
Este servicio debe estar en manos de profesionales que orienten, configuren, prevengan y resuelvan eventualidades,
manteniendo sus equipos en un estado óptimo.
Además, el administrador de infraestructura debe ser capaz de prestar servicios de administración y soporte de
sistemas de base y elementos de infraestructura para el procesamiento de aplicaciones informáticas, tales como
servidores, dispositivos de almacenamiento masivo, otros dispositivos de hardware, sistemas operativos, máquinas
virtuales y administradores de redes, servicios de comunicaciones a través de redes públicas y privadas, dispositivos
de switching, firewalls, motores de bases de datos, entre otros.
Podrá brindar servicios de administración de la infraestructura tecnológica en la cual opera el software de estas
aplicaciones interviniendo en forma puntual para resolver los problemas que experimente esa infraestructura o su
eficiencia operativa y realizar un diagnóstico de incidentes que se presenten en la operatoria habitual del sistema.
La intención es contribuir con soluciones concretas a la problemática del soporte de infraestructura IT que se
presentan en la casi totalidad de las instituciones públicas y/o privadas, acelerando los tiempos en materia de
formación de recursos humanos capacitados y demandados por todas aquellas organizaciones que cuentan con una
infraestructura IT.
¿Qué es infraestructura de IT?
La infraestructura de tecnología de la información, o infraestructura de IT, refiere a los componentes combinados
necesarios para el funcionamiento y la gestión de los servicios de IT de la empresa y los entornos de IT.
¿Quién hace infraestructura?
Estudiar una carrera profesional no consiste solamente en los años que le vas a dedicar a terminar tus estudios.
Después de obtener tu título te espera un largo camino de crecimiento profesional y, si bien tenemos una idea de las
opciones profesionales que existen, a veces tenemos nociones erradas o no hemos explorado correctamente todas
las posibilidades que hay disponibles y a lo largo de la carrera te compartiremos opciones en el campo laboral que
tienen todos aquellos que decidan ser profesionales de sistemas.
Estamos en una era en la que cualquier tipo de tarea es mediada por un computador.
El conocimiento de un profesional de sistemas es necesario en sectores tan diversos como, el entretenimiento o el
mundo empresarial.
¿Cuál es el perfil de un analista de infraestructura?
Las funciones que ejerce un analista de infraestructura, entre otras, son:
● Administrar servidores, software de base, comunicaciones y demás subsistemas, maximizando el aprovechamiento
de los recursos y anticipando posibles eventualidades.
● Administrar redes de comunicación de datos (cableadas o no), asegurando la accesibilidad de los servicios y
optimizando los recursos.
● Atender incidentes que afecten al soporte de infraestructura de IT, diagnosticar las causas que los originan y
resolverlos o coordinar su solución.
● Instalar o reemplazar componentes de soporte de infraestructura de IT o adaptarla a nuevas condiciones de
servicios externos minimizando riesgos para la seguridad y continuidad del servicio.
● Migrar o convertir sistemas, aplicaciones o datos tratando de minimizar riesgos para la seguridad y continuidad del
servicio.
● Entender temas de contingencias y riesgos que puedan afectar al soporte de infraestructura de IT.
● Generar propuestas innovadoras y/o emprendimientos productivos propios del ámbito de la gestión de soporte de
infraestructura de IT.
Esta persona se desempeña en centros de procesamiento de datos, ya sean de empresas u organizaciones de
cualquier tipo usuarias de tecnología de la información.
Su posición ocupacional suele denominarse administrador de red o administrador de sistemas, y trabaja solo o en
pequeños grupos para administrar los recursos de infraestructura de tecnología de la información y atender y
resolver incidentes, a fin de minimizar la posibilidad de interrupciones al servicio que brindan las aplicaciones
informáticas a las organizaciones.
Depende directa o indirectamente de un gerente de tecnología responsable por toda la operación y —en función de
la dimensión de la organización en la cual se desempeñe— puede trabajar solo, en pequeños grupos o en grupos
más grandes que permitan su especialización en determinadas tecnologías.
En la mayoría de los casos, no tiene personal a cargo, aunque puede coordinar las actividades de pequeños grupos
operativos.
En algunos casos en que la infraestructura es muy pequeña puede brindarle sus servicios profesionales
externamente atendiendo a los centros de procesamiento en forma presencial o a distancia.
¿Por qué es tan importante la infraestructura de IT?
La tecnología es el motor de todos los aspectos de las empresas actuales.
Desde el trabajo de un empleado individual hasta las operaciones de bienes y servicios.
Si se conecta correctamente, la tecnología se puede optimizar para mejorar la comunicación, crear eficiencia y
aumentar la productividad.
Si una infraestructura de IT es flexible, fiable y segura, puede ayudar a una empresa a cumplir sus objetivos y a
ofrecer una ventaja competitiva en el mercado.
De forma alternativa, si una infraestructura de IT no se implementa correctamente, las empresas pueden afrontar
problemas de conectividad, productividad y seguridad, como infracciones e interrupciones del sistema.
En general, contar con una infraestructura correctamente implementada puede ser un factor clave para la
rentabilidad de un negocio.
Con una infraestructura de IT, una empresa puede:
● Ofrecer una experiencia positiva proporcionando acceso ininterrumpido a su sitio web y la tienda en línea.
● Desarrollar y lanzar soluciones al mercado con rapidez.
● Recopilar datos en tiempo real para tomar decisiones rápidas.
● Mejorar la productividad de los empleados.
Arquitectura cliente-servidor.
La arquitectura cliente-servidor persigue el objetivo de procesar la información de un modo distribuido y así, pueden
estar dispersos en distintos lugares y acceder a recursos compartidos.
Además de la transparencia y la independencia del hardware y del software, una implementación cliente-servidor
debe tener las siguientes características:
● Utilizar protocolos asimétricos, donde el servidor se limita a escuchar en espera de que un cliente inicie una
solicitud.
● El acceso es transparente, multiplataforma y multiarquitectura.
● Se facilitará la escalabilidad, de manera que sea fácil añadir nuevos clientes a la infraestructura —escalabilidad
horizontal— o aumentar la potencia del servidor o servidores, aumentando su número o su capacidad de cálculo —
escalabilidad vertical—.
Arquitectura.
Servidor:
Un servidor es un ordenador, pero con prestaciones elevadas, que
ofrece recursos y servicios a los clientes que lo solicitan (back end).
Según el tipo de servidor, tendremos un tipo de arquitectura cliente-
servidor diferente y debido a que los programas y datos se
encuentran centralizados, se facilita la integridad y el mantenimiento.
Middleware:
Es la parte del software del sistema que se encarga del transporte de los mensajes entre el cliente y el servidor y
facilita la interconexión de sistemas heterogéneos sin utilizar tecnologías propietarias. Por lo cual, se ejecuta en
ambos lados de la estructura.
El middleware permite independizar a los clientes y a los servidores.
Además, ofrece más control sobre el negocio, debido a que permite obtener información desde diferentes orígenes
—uniendo tecnologías y arquitecturas distintas— y ofrecer de manera conjunta.
Otra característica es que los sistemas están débilmente acoplados ya que interactúan mediante el envío de
mensajes.
Cliente:
De manera genérica, nos referimos a una computadora, normalmente con prestaciones ajustadas, aunque en
entornos cliente-servidor, se utiliza el término front end, ya que es un proceso que solicita los servicios del servidor a
través de una petición del usuario.
Un proceso cliente se encarga de interactuar con el usuario, por lo que estará construido con alguna herramienta
que permita implementar interfaces gráficas (GUI).

Características fundamentales de un sistema operativo.

Soporte de red:
Es indispensable que tengan un soporte completo para poder brindar conectividad.
Amplia compatibilidad con el hardware:
Un punto fundamental para el aprovechamiento pleno de las características del servidor es que el S.O. sea capaz de
exprimir al máximo las características técnicas del hardware en donde se ejecuta, es por ello que se debe priorizar el
uso de S.O. actualizados y con un soporte importante de controladores. Por ejemplo, que nuestros controladores
permitan acceder a características avanzadas de gestión de discos rígidos, con el propósito de realizar arreglos
redundantes para tener mayor velocidad y tolerancia a fallos.
Seguridad:
Teniendo en cuenta el rol que cumple el servidor, es de vital importancia que el S.O. instalado sea seguro; eso
implica no solo que este actualizado con todos los parches/actualizaciones, sino que además debe tener aplicadas
políticas estrictas de acceso para prevenir accesos no autorizados o ataques.
Adicionalmente esa seguridad debe reforzarse con la instalación de Firewalls (por software o hardware) y antivirus.
En este ítem también debemos incluir el respaldo de la información, ya sea por medio de herramientas que el propio
S.O. nos ofrezca o instalando software externo, con el propósito de tener la menor pérdida de datos posible en caso
de fallos fatales.
Tolerancia a fallos(Dispositivos físicos de protección):
Debemos priorizar S.O. que en su arquitectura permita una tolerancia a fallos, ya sea mediante la generación de
granja de servidores, que interconectados, operen como una gran unidad de proceso, dando la posibilidad que ante
la caída de uno de los integrantes de la granja, otro puede tomar su rol y responsabilidad.
La utilización de sistemas operativos en servidores Web se componen de un 25% UNIX y un 75% Windows.
Automatización de la infraestructura.
Como vimos anteriormente, la Infraestructura IT es el conjunto de dispositivos y aplicaciones de software necesarios
para que cualquier empresa opere. Esta se compone de elementos como: software, hardware, redes, instalaciones y
todo lo que se requiera para desarrollar, controlar, monitorear y dar soporte a los servicios que ofrece el
departamento de IT.
Por otro lado, la automatización consiste en usar la tecnología para realizar tareas casi sin necesidad de las personas.
Se puede implementar en cualquier sector en el que se lleven a cabo tareas repetitivas.
La automatización de la IT —también denominada automatización de la infraestructura— consiste en el uso de
sistemas de software para crear instrucciones y procesos repetibles a fin de reemplazar o reducir la interacción
humana con los sistemas de IT.
¿Por qué automatizar?
Automatizar tareas permite ganar tiempo y maximizar la productividad de nuestra infraestructura IT.
En tiempos de cloud computing, este es el mensaje que se repite una y otra vez:
Cómo hacer más con menos, cómo conseguir que los profesionales IT de nuestra empresa dediquen más tiempo a
generar valor para la compañía y menos a tareas repetitivas que se podrían realizar de forma automática.
Beneficios de automatizar.
● Elevar la productividad empresarial.
● Reducir costos operativos.
● Disminuir los riesgos de fallas.
● Elevar la seguridad de la información.
● Tener una mejor capacidad de respuesta.
● Facilidad de adaptación.
● Alojar una mayor cantidad de datos.
● Elevar la competitividad del negocio.
Las 5 tareas más comunes en TI para automatizar.
Configuración y mantenimiento del sistema.
“La automatización de la infraestructura consiste en el uso de sistemas de software para crear instrucciones y
procesos repetibles a fin de reemplazar o reducir la interacción humana con los sistemas de TI”.
Este plantea una visión muy amplia, ya que
tiene que abarcar los diversos rubros de las
empresas que poseen su área de sistema.
Según el tipo de organización en la que
trabajamos, es el grado de automatización
con el que nos vamos a encontrar en la
infraestructura de TI.
Uno de los roles del equipo de trabajo del
área de sistemas es el DevOps engineer,
encargado de automatizar los procesos del
área de Development y Operations, es hacer
más amigable y eficiente la relación entre
estos dos equipos de trabajo.
Infraestructura y servicios
Primero tenemos que analizar los dispositivos tenemos en nuestra red de IT. Si contamos con servidores legacy o
servicios contratados por un cloud providers. De las dos opciones, lo que tenemos que tener en cuenta es el sistema
operativo con el que trabajan (MAC, Linux, Windows).
De los cloud providers más conocidos contamos con:
● AWS.
● Google Cloud.
● Microsoft Azure.
Para la elección se evalúan los costos y la oferta de servicios que disponen.
Esta última es cada vez más robusta y completa (load balancing, backup, clustering, security, etc.).
Manejo del código.
Partimos desde donde alojamos nuestro código de trabajo si somos programadores.
Por excelencia el gestor de versionado e integrador de código más utilizado es Git.
Los alojamientos de estos repositorios más conocidos en la nube son GitLab, GitHub, Bitbucket, Gitea, entre otros.
En estos se almacena nuestro código de las aplicaciones que pueden estar en lenguajes de programación diversos
según lo que necesitemos —por ejemplo: Python, JavaScript, Java, .NET, etc.—.
También podemos automatizar el deploy de nuestro código con CI/CD (refiere a las prácticas combinadas de
integración continua y entrega continua). Algunas herramientas para hacerlo son:
● Jenkins.
● GitActions.
● JetBrains.
Contenedores.
Los contenedores se están convirtiendo en el modelo de empaquetado de software del producto que desarrollamos.
Permiten la virtualización de ambientes de trabajo compatibles transportables, totalmente configurados para que
nuestro código funcione en todos los equipos.
El más popular es Docker.

Cuando manejamos muchos contenedores, tenemos que migrar a un clúster de contenedores, dirigidos por los
orquestadores de contenedores. Por ejemplo, Kubernetes o Docker Swarm.
Ambientes de trabajo.
Luego, hay que tener en cuenta en qué ambiente está nuestro clúster.

En cada ambiente se trabaja con distintas tecnologías, según el grado de exposición del producto.
Automatizando estos procesos vamos a tener más eficiencia, transparencia, facilidad de replicación y recuperación.
Los ambientes más populares son:
● Ansible.
● Chef.
● Puppet.
● Terraform.
Monitores de red.
Es muy importante tener la supervisión de los dispositivos que hay en nuestra red y de los servicios, y programar
alertas en caso de que suceda algún cambio.
Para esto podemos utilizar: Nagios, Prometheus, Icinga2 o DataDog.

Lenguajes de scripting.
Necesitamos trabajar en estrecha colaboración con los
desarrolladores y el administrador del sistema para automatizar
tareas de los operadores y desarrolladores (como pueden ser
backups, cron jobs, system monitoring).
Según el sistema operativo, podemos usar: Bash o PowerShell.
Pero también existen lenguajes de scripting independientes del SO,
como Python, Ruby o Go.
El más popular es Python, ya que posee muchas librerías y es de fácil
lectura y aprendizaje.
Conclusión.
Estas tecnologías expuestas para automatizar la infraestructura TI no son todas las que están en el mercado, sino
una visión general de las que hoy son las más populares.
Hay que tener en cuenta que cada día se están desarrollando nuevas herramientas y metodologías de trabajo para
cada empresa, como también empresas que brindan el servicio de automatización outsourcing de la organización.
Siempre hay que tomar la decisión basándose en la necesidad, recursos disponibles y experiencia que cuenta la
empresa.
Introducción a Virtualización.
La virtualización permite mejorar la agilidad, la flexibilidad y la escalabilidad de la infraestructura de IT, al mismo
tiempo que proporciona un importante ahorro de costos.
Algunas ventajas de la virtualización son:
Mayor movilidad de las cargas de trabajo.
● Aumento del rendimiento.
● Menos esfuerzo en los upgrades/updates del sistema.
● Mejor disponibilidad de los recursos o la automatización de las operaciones:
● Simplifican la gestión de la infraestructura de IT.
● Permiten reducir los costos de propiedad y operativos.
Componentes de virtualización.
Máquinas virtuales: (ejecución de sistemas operativos)
En la actualidad se pueden crear sistemas operativos guest del tipo Microsoft y Linux en casi todas sus versiones, se
deben tener en cuenta las versiones de cada sistema operativo y la compatibilidad con el sistema host.
Administrador de máquinas virtuales.
Desde la herramienta de management se administran todos los recursos físicos y virtuales de los guest que son las
instancias virtuales que se crean para usos específicos. Desde el mismo management podremos establecer clustering
con otros virtual machines manager para tener alta disponibilidad y tolerancia a fallos. Además, administra todos los
recursos virtuales de nuestras virtual machines.
Sistemas operativos bases.
Es el sistema operativo encargado de administrar los dispositivos físicos (hardware) y proveer una capa de
abstracción a los entornos virtuales.
Para infraestructura enterprise:
● VMware vSphere.
● Red Hat Virtualization.
● Proxmox VE.
● Microsoft Hyper-V.
● Citrix Hypervisor.
● Oracle VM Server.
● IBM PowerVM.
● Virtuozzo.
Hardware (servidores físicos)
Los microprocesadores, tanto los de Intel como los de AMD, tienen una característica llamada virtualización de CPU.
Se aplica a servidores o máquinas de escritorio.
Introducción a la terminal de Linux.
La consola de Linux.
La interfaz de línea de comandos, o CLI —por sus siglas en inglés command-line interface—, es un método de
comunicación entre usuario y máquina que acepta instrucciones del usuario a través de líneas de texto (siguiendo
unas determinadas reglas de sintaxis que puedan ser interpretadas por el sistema operativo).
La herramienta que posibilita la función de interfaz de usuario se la denomina shell.
Aplicado en el ámbito de la interfaz de línea de comandos, estaríamos hablando de una shell CLI o intérprete de
comandos.
Tipos de Shell.
En Linux tenemos una multitud de shells o intérpretes diferentes. El más conocido de todos probablemente es Bash,
debido a que es el que suele venir por defecto en la gran mayoría de distribuciones GNU/Linux, pero también
destacan otros como:
● Bourne Shell (sh)
● C Shell (csh)
● Korn Shell (ksh)
Bourne Shell.
Lleva el nombre de su creador en los Laboratorios Bell, Steve Bourne. Fue la
primera shell utilizada para el sistema operativo Unix y ha superado en gran
parte la funcionalidad de muchas de las shells más recientes. Todas las
versiones de Linux Unix permiten a los usuarios cambiar a la original Bourne
Shell, conocida simplemente como "sh", si así lo desean.
Sin embargo, hay que tener en cuenta que, al hacerlo se renuncia a
funcionalidades como el completado de nombres de archivo y el historial de
comandos que los depósitos posteriores han añadido.
C/TC Shell.
El C Shell fue desarrollado posteriormente al Bourne Shell y está pensado
en facilitar el control del sistema al programador en lenguaje C. La razón de
esto es que su sintaxis, como vamos a apreciar, es muy similar a la de este
lenguaje.
Conocido popularmente también como csh, está presente en otros SO, por
ejemplo, en Mac OS. Posee una evolución, conocida como tcsh que
incorpora funcionalidades avanzadas y mayores atajos de teclado.
Korn Shell.
Esta también fue escrita por un programador en los
Laboratorios Bell, David Korn. Intenta combinar las
características de la C Shell, TC Shell y Bourne Shell en
un solo paquete.
También incluye la capacidad para crear nuevos
comandos de shell para los desarrolladores cuando
surja la necesidad.
● Posee funciones avanzadas para manejar archivos de
comandos que la colocan a la par de lenguajes de
programación especializados, como AWK y Perl.
Bourne-Again Shell (BASH).
La Bourne-Again Shell es una versión actualizada de la
Bourne Shell original.
Es una shell utilizada ampliamente en la comunidad de
código abierto.
Su sintaxis es similar a la utilizada por la Bourne Shell,
incorporando funcionalidades más avanzadas que se
encuentran en las shells C, TC y Korn.
● Entre las funcionalidades adicionales que carecía
Bourne, está la capacidad para completar nombres de
archivos pulsando la tecla TAB, la capacidad de recordar
un historial de comandos recientes y la capacidad de
ejecutar múltiples programas en segundo plano a la vez.
Consola de Linux: Ejecución en inicio.
Si bien cada distribución de Linux tiene su manera particular de acceder a la consola, cuando el SO se inicia en los
niveles 1, 2, 3 y 4 nos llevará por defecto a la consola.

Consola de Linux: Ejecución desde GUI.


Si en cambio nuestro SO inicia en nivel 5 (con GUI), para poder utilizar la terminal tenemos diferentes opciones.
Estas varían de acuerdo a la distribución instalada.
En el caso de Ubuntu, tenemos dos opciones:
● La primera de ellas es lanzando un TTY, o espacio de trabajo sin entorno gráfico.
Podemos ejecutar 7 terminales al mismo tiempo de esta forma.
De la 1 a la 6, ninguna tiene interfaz gráfica.
Para cambiar de TTY en Linux debemos usar el atajo de teclado Control+Alt más la tecla —de F1 al F7— del TTY que
queramos ejecutar.

Consola de Linux: Ejecución desde GUI.


● La segunda opción es encontrar una app dedicada que se ejecuta en una ventana, dentro del panel de aplicaciones
de nuestra distro. En el caso de Ubuntu, por ejemplo, podemos encontrar esta terminal dentro del cajón de
programas del entorno gráfico GNOME.

Los privilegios del superusuario root.


Por lo general, los sistemas operativos contemplan el uso de solo un usuario, el cual tiene permisos de
administrador.
En Linux las cosas se manejan de una forma particular, se separa la cuenta de usuario común de la de superusuario y
es eso lo que conocemos como root.
Esta cuenta posee todos los privilegios y permisos para realizar acciones sobre el sistema.
Para la ejecución de algunos comandos debemos ingresar dicho acceso (clave de root).
Sin embargo, se debe tener un conocimiento sobre las acciones que se realizan, ya que una acción realizada de
manera errónea podría ocasionar daños importantes en el sistema.
El uso de instrucciones con privilegios de superusuario pueden ser sumamente útiles, pero totalmente devastadoras
si desconocemos las consecuencias de su uso en el sistema.
Veamos el método para elevar nuestros privilegios.
Elevando privilegios.
Suponiendo que iniciamos sesión como un usuario “común”, denominado “edorio” y queremos reiniciar un servicio
(cron), vamos a obtener lo siguiente:

Para evitar el error, debemos usar el comando sudo, previo al comando que queremos ejecutar. Nos pedirá la
contraseña de root y se ejecutará como tal de manera satisfactoria.
Consolidando nuestro ambiente.
Para poder seguir correctamente los ejemplos posteriores, es deseable que en tu ambiente (máquina virtual o WSL)
tengas replicada la siguiente estructura de carpetas y archivos.

Para ello debemos ejecutar los siguientes comandos, en el orden dado (solo el texto que está luego del prompt o
sea, luego del “$”, en color blanco):

Verificando nuestro ambiente.


Listamos los directorios con la
instrucción “ls -R”.
Deberíamos obtener lo siguiente:

Comandos para el manejo de archivos.


ls.
Con el comando ls podrás listar los diferentes archivos y directorios de la carpeta de trabajo en la que te encuentres.
El comando acepta multitud de opciones, algunas de las cuales veremos a continuación.
A continuación, podemos observar el uso más simple del comando ls.
Si no le indicamos ninguna opción, enumerará todos los archivos y directorios que se encuentran en la carpeta de
trabajo actual, sin tener en cuenta archivos ocultos.

ls -a
Con esta opción, el comando te mostrará —en forma de lista— todo el contenido que se encuentre dentro del
directorio de trabajo, incluyendo archivos y carpetas ocultos. Dependiendo del shell, algunos tipos de archivos se
mostrarán con colores diferentes.

ls -l.
Esta opción es similar a la anterior, pero muestra el contenido en forma de lista e incluye información referente a
cada elemento.
Es de las más utilizadas, siendo especialmente útil a la hora de conocer el propietario y los permisos de cada fichero.

mkdir.
Te permitirá crear un directorio con el nombre y la ruta que especifiques. Si no le indicás ninguna ruta, por defecto,
te creará la carpeta dentro del directorio de trabajo en el que te encuentres.

Caso contrario, le podés indicar que cree un directorio con un path definido dentro de dir1.
rmdir.
Te permite eliminar el directorio que le especifiques.
Un detalle importante es que para poder utilizar este comando, el directorio a borrar debe estar vacío.
El de arriba es el uso más simple del comando, sin indicar ruta.

Podemos también borrar un directorio con un path definido.

rm.
Este comando permite eliminar archivos sueltos y directorios que no se encuentren vacíos.

El de arriba es el uso más simple del comando, sin indicar ruta.


Eliminamos 1 archivo específico dentro de dir1.

Con el modificador -r eliminamos el directorio dir2 y, recursivamente, todo su contenido. Es un comando a utilizar
con mucha precaución.
cp.
Usando este comando serás capaz de copiar archivos y directorios.
Así como ubicarlos en otras rutas, definiendo origen primero y luego destino.

El de arriba es el uso más simple del comando, sin indicar ruta.


Copiamos en este caso el archivo3.txt, hacia dir1 y lo nombramos archivo1.txt.
En este caso, con el modificador -r copiamos el directorio dir3 en uno llamado dir2, que el mismo comando creo.
mv.
Este comando te servirá para mover archivos desde la consola.
La sintaxis es muy sencilla, solamente deberás especificar la ubicación de inicio —incluyendo el nombre del
archivo— y la ubicación de destino.

Movimos un archivo de dir1 a dir3, conservando su nombre original.


En el siguiente caso usamos el comando mv para renombrar un archivo, ya que las rutas definidas son las mismas.

cat.
Este es uno de los comandos más utilizados cuando se trata de manejar archivos de texto (en formato .txt) desde la
terminal.
Entre sus múltiples opciones, está la posibilidad de crear un archivo e imprimir por pantalla su contenido.

Esto nos abrirá el archivo1.txt, permitiendo editarlo.


Con la combinación CTRL+D terminaremos la edición y se guardará el contenido.

Invocando el comando sin el símbolo “>”, nos mostrará por pantalla el contenido del mismo.
Se puede usar con el modificador -n, para numerar las líneas y con el -b, con el propósito de no mostrar las líneas en
blanco.
more.
Este es otro comando útil para imprimir por pantalla el contenido de un archivo de texto.
Esencialmente es igual que el comando cat, con la diferencia que este comando pagina el contenido, por lo que es
más adecuado para leer archivos largos.

Nos paginará el archivo en cuestión, de tal manera que en sus últimas líneas lo veremos así:

nano.
Nano es un editor de textos para la terminal, que más que para leer archivos sirve para modificarlos y editarlos.
Aunque para esta guía también nos vale perfectamente para abrir el archivo y visualizar su contenido desde la línea
de comandos.

Nos mostrará:

Una vez abierto, en la parte inferior se visualizará las diferentes combinaciones de teclas que necesitarás a la hora de
trabajar con archivos.
nano (cont.)
En la parte inferior se muestran las diferentes combinaciones de teclas que se necesitarán a la hora de trabajar con
archivos:
● CTRL+R: Combinación para indicarle un archivo de texto a Nano para que lo abra y muestre su contenido por la
consola.
● CTRL+V: Estando dentro de Nano y con el archivo abierto en la consola, esta combinación sirve para avanzar a la
página siguiente.
● CTRL+Y: Sirve para retroceder a la página anterior.
● CTRL+W: Sirve para introducir un carácter o grupo de caracteres y buscar en el texto cualquier letra o palabra que
coincida con el parámetro de búsqueda.
● CTRL+X: Para cerrar el archivo una vez que lo hayas terminado de visualizar en la consola. Eso cerrará el editor de
texto Nano y volverá a aparecer el prompt de Bash por consola.
grep.
Este comando, perteneciente a la familia Unix, es una de las herramientas más versátiles y útiles disponibles. Se
encarga de buscar un patrón que definamos en un archivo de texto.
Su primer parámetro es la cadena de texto a buscar, luego el o los archivos (acepta comodines como *, pudiendo
con el modificador -r recorrer recursivamente) que vamos a buscar.

En este caso, buscamos la cadena “Digital House” en todos los archivos, de manera recursiva, la ejecución nos
devolvió lo siguiente:

tee.
Lee una entrada estándar y la escribe en la salida estándar y en uno o más archivos. De forma normal, en la
redirección de salida, las líneas del comando se escriben en un archivo, pero si queremos ver dicha salida al mismo
tiempo, no podemos. ¡Usando el comando tee sí es posible lograrlo!

En este caso, además de mostrarnos el directorio, el mismo será guardado en un archivo.

Utilizando el modificador -a, se agregará el contenido al archivo, sin pisar lo anterior.


Obtener datos desde un web service.
La terminal de Linux tiene tanta versatilidad y potencia
que nos permite vincularla con un web service, obtener
datos de allí y procesarlos con propósitos tales como
agregarlo a archivos en nuestro servidor, modificarlos y
republicarlos.
Las opciones son muy variadas, por ejemplo obtener
un JSON desde una URL externa, procesar su
contenido, obtener el o los atributos que nos interesen
y —en función de ello— crear nuevos archivos,
insertarlos en una base de datos.
Aspectos técnicos.
Es un comando disponible en la mayoría de los sistemas basados en Unix. Es una abreviatura
de “Client URL”.
Los comandos de cURL están diseñados para funcionar como una forma de verificar la
conectividad a las URL y como una gran herramienta para transferir datos.
El comando tiene una amplia compatibilidad con los protocolos más usados.
Sintaxis básica
El uso más simple de cURL es mostrar el contenido de una página. El siguiente ejemplo mostrará la página de inicio
de digitalhouse.com:

Como vemos, no es muy útil esto, ya que es difícil llegar a información que nos pueda ser de utilidad visualizándola
solamente en pantalla.
Pero si usamos el modificador -o, podremos escribir ese contenido HTML de la página de inicio en un archivo en
nuestro equipo:

Esto guardará todo el HTML en el archivo mipagina.html.


Descargas.
El uso de este modificador puede extenderse a procesar descargas:

Descarga la ISO de la URL de referencia y la nombrará ubuntu.iso.

En este caso, no renombramos el archivo de destino (con el modificador -O).


Además, permitimos la continuidad de la descarga con el modificador -C.
Encabezados y verificaciones.
El modificador -v nos permite verificar la conectividad hacia un sitio remoto.

Esto nos brindará, además del contenido, datos como la IP de destino, protocolos de seguridad y certificados
utilizados.

El modificador -I nos muestra todos los encabezados de la solicitud, tales como ruta por defecto, publicador web,
entre otros.
Contenido JSON.
Viendo todas las opciones brindadas, nos podemos imaginar lo útil de este comando con el propósito de obtener el
contenido en formato JSON desde un endpoint que lo entregue en dicho formato.
Por ejemplo, la API de OpenStreetMap, la cual nos devuelve una dirección pasándole las coordenadas, con la
siguiente URL:
https://nominatim.openstreetmap.org/reverse.php?lat=-34.60378&lon=-58.38161&zoom=18&format=jsonv2

Allí estamos guardando en el archivo resultado.json lo obtenido en el web service.


Notemos el detalle de colocar la URL entre comillas simples o dobles.
Aspectos técnicos.
JSON es un formato de datos estructurados ampliamente utilizado que se utiliza normalmente en la mayoría de las
API y servicios de datos modernos.
Es particularmente popular en aplicaciones web debido a su naturaleza liviana y compatibilidad con JavaScript.
Desafortunadamente, shells como Bash no pueden interpretar y trabajar con JSON directamente.
Esto significa que trabajar con JSON a través de la línea de comando puede ser engorroso e implica la manipulación
de texto utilizando una combinación de herramientas como sed y grep.
Allí es donde aparece jq, un potente procesador JSON para la consola.
Sintaxis básica.
jq se basa en el concepto de filtros que funcionan sobre un flujo de JSON. Cada filtro toma una entrada y emite JSON
a la salida estándar.
Tomando el archivo JSON obtenido con cURL, una ejecución sencilla de jq nos devuelve todo el contenido del JSON.

Como vemos, no vamos a acceder a ningún atributo en especial, ya que con el modificador ‘.’ no se lo indicamos.
Accediendo a propiedades.
Para poder acceder a una propiedad específica es necesario indicarla luego del punto, con el nombre de la misma.

En este caso, accederemos a la propiedad display_name del JSON.


Si queremos acceder a varias propiedades, las separamos por coma.

De esta manera, accedemos a display_name y type.


TIP: Si alguna propiedad tuviese un espacio en su nombre, debemos envolverla con comillas dobles.
Combinar comandos con pipelines.
Para poder combinar el poder de cURL con el recurso y la capacidad de proceso de jq debemos
combinarlo usando pipelines.
Para ello vamos a realizar una introducción a una de las características más interesantes que
tiene la terminal.
El pipeline o tubería es una función que permite utilizar la salida de un programa como entrada
en otro.
Combinar comandos con pipelines.
El pipeline en Linux se representa con la barra vertical (|), la cual dividirá los comandos. Por ejemplo, si nosotros
queremos saber la IP de nuestro equipo, lo hacemos con la instrucción:

Esta nos devolverá muchísimos datos (MAC, protocolos, direcciones IPv4 e IPv6, entre otros). Si quisiéramos filtrar
dentro de ese texto por la cadena “192.168”, lo deberíamos llevar a un archivo y allí buscar con grep.

Pero es aquí en donde aparece la magia del pipeline, ya que podemos combinar ambas sentencias en una.
Para ello, primero colocamos nuestra sentencia inicial, sabiendo que tipo de salida puede tener, separamos con el
pipeline y colocamos la segunda sentencia.

Allí el grep nos indicará la línea coincidente con “192.168”.


Nuestro pipeline podría seguir aplicándose sin límites más allá de aquellos que imponga el sistema operativo, por
ejemplo, cantidad de procesos en ejecución.
Aplicar el pipeline con cURL y jq.
Conociendo el uso básico del pipeline, vamos a aplicarlo a la obtención de datos externos y el parseo de una
propiedad específica, la cual la guardaremos en un archivo.
Nuestro comando tendrá tres partes:

Aplicar el pipeline con cURL y jq.


En este caso, vemos cómo la sentencia obtiene el JSON con cURL, lo procesa con jq para obtener el display_name y
el type, y finalmente lo guarda en un archivo llamado consultapipe.txt.

Tipos de variables.
Variables globales o de entorno.
El sistema Linux establece algunas variables de entorno globales cuando iniciamos sesión en nuestro sistema y
siempre son en LETRAS MAYÚSCULAS.
Si queremos ver las variables de entorno que estamos usando y que están cargadas en nuestra sesión, escribimos el
comando printenv o env en nuestro Shell.
Para declarar una variable global se debe realizar de la siguiente manera:

Para acceder a la misma utilizamos la sentencia:


Variables de usuario o locales.
Las variables del tipo usuario o local tienen la particularidad que pueden ser accedidas solo por el usuario y la sesión
en la que fueron creadas. Una variable local se declara de la forma sencilla:

Para acceder a la misma utilizamos la sentencia

Estructuras de control.
Sentencia if-then.
Los scripts de Bash necesitarán condicionales. Normalmente nos imaginamos un escenario tal como “Si el valor es
menor que 10, hacé esto, si no hacé aquello”.
Para ello utilizamos if-then. La estructura más básica de la sentencia if-then es así:

if command; then
hacer algo
fi

Sentencia if-else.
La sentencia if-then-else toma la siguiente estructura:

if comand; then
hacer algo
else
hacer otra cosa
fi

Si el comando se ejecuta y retorna cero (lo cual significa éxito), no ejecuta los comandos después de la sentencia
else. Por otro lado, si la sentencia if retorna un número distinto de cero (lo cual significa que la condición no se
cumple), el Shell ejecuta los comandos después de la sentencia else. En el ejemplo que sigue vemos cómo nos
devuelve un mensaje de acuerdo si el comando ping fue satisfactorio.
Comparaciones numéricas.
Podemos realizar una comparación numérica entre dos valores numéricos utilizando las sentencias de esta tabla:

number1 -eq number2 Comprueba si number1 es igual a number2.


number1 -ge number2 Comprueba si number1 es más grande o igual number2.
number1 -gt number2 Comprueba si number1 es más grande que number2.
number1 -le number2 Comprueba si number1 es más pequeño o igual number2.
number1 -lt number2 Comprueba si number1 es más pequeño que number2.
number1 -ne number2 Comprueba si number1 no es igual a number2.
Teniendo en cuenta que la sentencia de comparación se encuentra entre corchetes, ejemplificamos:
Comparaciones de cadenas.
Podemos realizar una comparación de cadena entre dos valores alfanuméricos utilizando las sentencias de esta
tabla:

string1 = string2 Comprueba si string1 es idéntico a string2.


String1! = string2 Comprueba si string1 no es idéntico a string2.
string1 < string2 Comprueba si string1 es menor que string2.
string1 > string2 Comprueba si string1 es mayor que string2
-n string1 Comprueba si string1 es mayor que cero.
-Z string1 Comprueba si string1 tiene una longitud de cero.
Podemos aplicar la comparación de cadenas en nuestro ejemplo.
Si estamos logueados como root, va por el if, si no por el then.

Cálculos matemáticos.
Podemos realizar cálculos matemáticos básicos utilizando la sintaxis $ ((2 + 2)):

Realización de un ejemplo en Bash.


Preparación del entorno.
Nos preparamos.
Para este ejemplo debemos tener en ejecución alguna de las máquinas virtuales de clase 2. Adicionalmente,
debemos instalar un paquete nuevo, llamado cowsay, con las siguientes sentencias:

Codificación del script.


A codear
Creamos una carpeta en nuestro equipo y nos posicionamos en ella con las instrucciones:

Creamos un nuevo archivo llamado lista_verduras y lo completamos con 4 verduras aleatoriamente.

Usamos el comando cat, finalizamos la edición del archivo con CTRL+D.


Creamos otro archivo llamado lista_frutas y lo completamos con 4 frutas aleatoriamente.
Usamos nuevamente el comando cat, finalizamos la edición del archivo con CTRL+D.

Verificamos la creación de ambas listas con cat.

Vamos a crear un nuevo archivo que será nuestro script, pero no vamos a usar cat sino el comando nano.
Se abrirá el editor nano, con un documento en blanco, en él escribimos las siguientes líneas:

El propósito del script es listar los archivos y pasar dicho output a cowsay.
Salimos de nano con CTRL+X, le contestamos que queremos salvar los cambios y dejamos el nombre de archivo tal
cual propone.
Ahora debemos darle permisos de ejecución a nuestro script:

Ejecución del script.


A probar.
Con nuestro script creado, y con sus permisos correspondientes,
procedemos a ejecutarlo con la sentencia (prestar atención al “./”

inicial):
Si la ejecución fue exitosa, debemos tener un output como el que
observamos.
Introducción a la cronología de PowerShell.

Diferencias entre PowerShell y PowerShell Core.


PowerShell Core es una nueva versión de PowerShell, un shell de línea de comandos y lenguaje de scripts que se
incluye con Microsoft Windows. Es decir que contamos con dos ediciones de PowerShell.
Existe el PowerShell de hace una década que está integrado en todas las versiones recientes del sistema operativo
Windows de Microsoft y el nuevo PowerShell Core.
Microsoft ve a PowerShell Core como una evolución de PowerShell.
El primero está disponible como una aplicación multiplataforma, el último solo para Windows.
La naturaleza multiplataforma de PowerShell Core significa que las secuencias de comandos que se escriban se
ejecutarán en cualquier sistema operativo compatible.
Se pueden escribir scripts de PowerShell Core en Windows y usarlos en dispositivos macOS X o Linux compatibles.
Incluso hay versiones experimentales (no compatibles) para dispositivos ARM.
Microsoft trabaja en PowerShell Core.
PowerShell se encuentra en un estado que se puede comparar mejor con el soporte extendido para las versiones de
Windows.
Microsoft no tiene planes de agregar funciones a PowerShell, pero lanzará correcciones de errores críticos y
actualizaciones de seguridad.
La regresión de PowerShell para Windows será muy bajo, por lo que es una plataforma estable para cargas de
trabajo existentes.
PowerShell Core no afecta a PowerShell en dispositivos con Windows por lo que ambos conviven sin problemas.
Usos comunes de PowerShell.
Automatización de tareas.
PowerShell sirve para facilitar a los administradores de
sistemas las tareas de automatización, administración y
configuración de sistemas.
Configuración de management.
Al usar PowerShell DSC.
Monitoreo.
Para escribir scripts que pueden ser utilizados por un software de monitoreo.
Testear infraestructura.
Las pruebas de infraestructura en Pester son código de PowerShell que ejecuta el módulo Pester PowerShell y se
crea de una manera específica, conocida como lenguaje específico de dominio (DSL).
Este DSL describe el estado deseado y tiene el código necesario para verificar ese estado y comparar el resultado.
Automatización de procesos.
Automatizar tareas en un proceso de liberación de software (CI/CD).
Glosario de comandos.
Los cmdlets más útiles y más comunes que estaremos usando en Windows PowerShell, que son 25 comandos
básicos de Windows PowerShell.

Cmdlet Descripción.
Set-Location Establece la ubicación de trabajo actual en una ubicación específica.
Get-Content Obtiene el contenido del elemento en la ubicación especificada.
Add-Content Agrega contenido a los elementos especificados, por ejemplo, agregar palabras a un archivo.
Set-Content Escribe o reemplaza el contenido de un elemento con contenido
nuevo.
Copy-Item Copia un elemento de una ubicación a otra.
Remove-Item Elimina los elementos especificados.
Move-Item Mueve un elemento de una ubicación a otra.
Set-Item Cambia el valor de un elemento al valor especificado en el comando.
New-Item Crea un nuevo elemento.
Start-Job Inicia un trabajo en segundo plano de Windows PowerShell.
Compare-Object Compara dos conjuntos de objetos.
Group-Object Agrupa objetos que contengan el mismo valor en propiedades especificadas.
Invoke-WebRequest Obtiene contenido de una página web en Internet.
Measure-Object Calcula los valores de propiedad de determinados tipos de objetos. Puede realizar tres tipos de
mediciones según los parámetros del comando.
Resolve-Path Resuelve los caracteres comodín en una ruta y muestra el contenido.
Resume-Job Reinicia un trabajo suspendido.
Set-Variable Establece el valor de una variable. Crea la variable si no existe una
con el nombre solicitado.
Show-Command Muestra comandos de Windows PowerShell en una ventana de comandos gráfica.
Sort-Object Ordena los objetos por valores de propiedad.
Start-Service Inicia uno o más servicios detenidos.
Start-Process Inicia uno o más procesos en la computadora local.
Suspend-Job Detiene temporalmente un trabajo.
Wait-Job Espera a que los trabajos en segundo plano de Windows PowerShell
se completen antes de mostrar el símbolo de sistema.
Where-Object Selecciona los objetos del conjunto de objetos que se le pasan.
Write-Output Envía el objeto especificado al siguiente comando en la canalización.
Si es el último comando en la canalización, el objeto se mostrará en consola.
Ejemplos de uso.
● Set-Location: Establece la ubicación actual.

● Get-Content: Obtiene el contenido de un archivo de texto.

● Add-Content: Añade contenido a un archivo de texto.

● Set-Content: Modifica una línea de un archivo de texto.

● Copy-Item: Copia un archivo a un directorio específico.

● Remove-Item: Este ejemplo elimina de la carpeta actual todos los archivos que tienen una extensión de nombre
de archivo .doc con la excepción de los que tengan un *1* en su nombre.
● Move-Item: Mueve un archivo a otro directorio y lo renombra.

● Set-Item: Este ejemplo crea un alias llamado np para el Notepad de Windows.

● New-Item: Crea un archivo en el directorio actual.

● Start-Job: Ejecuta un script como un proceso en segundo plano.

● Compare-Object: Compara el contenido de dos archivos:


Este ejemplo compara el contenido de dos archivos, el ejemplo usa los siguientes dos archivos de texto, cada uno
con un valor en una línea diferente.
● verduras.txt contiene los valores: papa, zapallo, tomate.
● frutas.txt contiene los valores: banana, tomate, naranja.
El resultado muestra solo las líneas que son diferentes entre los archivos.
En verduras.txt usa el objeto de referencia (<=) y en frutas.txt usa el objeto de diferencia (=>). Las líneas que se
encuentran en los dos archivos no son mostradas.

● Group-Object: Agrupa archivos por su extensión.


● Invoke-WebRequest: Muestra una página web.

● Measure-Object: Este comando cuenta los archivos y carpetas del directorio actual.

● Resolve-Path: Muestra la ruta actual.

● Resume-Job: Reanuda un trabajo por nombre.

● Set-Variable: Establece una variable y obtiene su valor.

● Show-Command: Abre un cmdlet en una ventana de comandos.


● Sort-Object: Ordena el directorio actual por nombre.

● Start-Service: Inicia un servicio detenido.

● Start-Process: Inicia un proceso que use valores por defecto.

Kit de supervivencia de PowerShell.

Get-Help: Lo usamos para obtener ayuda e información sobre cmdlets, módulos y otros.
Update-Help: Lo usamos para actualizar el repositorio de ayuda.
Get-Command: Lo usamos para buscar un cmdlet.
Get-Member: Lo usamos para mostrar las propiedades y los métodos de un objeto devuelto.
Get-Command: Lo usamos para obtener información sobre los módulos disponibles en el sistema.
$PSVersionTable: Lo usamos para ver la variable de entorno que contiene información sobre PowerShell.
Pipeline, variables, estructuras de control, scripts y funciones.
¿Qué es un pipeline?
Es una serie de comandos conectados mediante operadores de canalización (“|”, ASCII 124).
Cada operador del pipeline envía los resultados del comando anterior al siguiente comando.
La salida del primer comando se puede enviar para procesar como entrada para el segundo comando y el resultado
se puede enviar a otro comando.
Lo anterior es una cadena de comandos o pipeline complejo que se compone de una serie de comandos simples.

En este ejemplo, los objetos que Command-1 emite se envían a Command-2.


Command-2 procesa los objetos y los envía a Command-3.
Este último procesa los objetos y los envía a través del pipeline.
Dado que no hay más comandos en la canalización, los resultados se muestran en la consola.
En un pipeline, los comandos se procesan en orden de izquierda a derecha.
El procesamiento se controla como una operación única y el resultado se muestra a medida que se genera.
Una variable es una unidad de memoria en la que se almacenan los valores.
En PowerShell, las variables se representan mediante cadenas de texto que comienzan por un signo de dólar ($),
como $a, $process o $my_var.
Los nombres de variable no distinguen mayúsculas de minúsculas y pueden incluir espacios y caracteres especiales.
Sin embargo, los nombres de variable que incluyen caracteres especiales y espacios son difíciles de usar y deben
evitarse.
Para obtener más información, vea nombres de variable que incluyen caracteres especiales.
Tipos de variables en PowerShell.
● Variables creadas por el usuario: El usuario crea y mantiene las variables.
De forma predeterminada, las variables que se crean en la línea de comandos de PowerShell solo existen mientras la
ventana de PowerShell está abierta.
Cuando se cierra la ventana de PowerShell, se eliminan las variables.
Para guardar una variable, deberán agregarla a su perfil de PowerShell.
● Variables automáticas: Estas almacenan el estado de PowerShell.
Estas variables las crea PowerShell y cambia sus valores según sea necesario para mantener su precisión.
Los usuarios no pueden cambiar el valor de estas variables.
● Variables de preferencia: Estas almacenan las preferencias de usuario para PowerShell.
Estas variables las crea PowerShell y se rellenan con valores predeterminados.
Los usuarios pueden cambiar sus valores.
Estructuras de control.
Las estructuras de control permiten modificar el flujo de ejecución de las instrucciones de un programa.
Con ellas se puede:
● De acuerdo con una condición, ejecutar un grupo u otro de sentencias (If-Then-Else).
● De acuerdo con el valor de una variable, ejecutar un grupo u otro de sentencias (Switch-Case).
● Solo cuando se cumpla una condición, ejecutar un grupo de sentencias (Do-While).
● Hasta que se cumpla una condición, ejecutar un grupo de sentencias (Do-Until).
● Ejecutar un grupo de sentencias un número determinado de veces (For-Next).
Tipos de estructuras de control.
Todas las estructuras de control tienen un único punto de entrada.
Las estructuras de control se pueden clasificar en:
● Secuenciales.
● Iterativas.
● De control avanzadas.
Esta es una de las cosas que permiten que la programación se rija por los principios de la programación estructurada.
Los lenguajes de programación modernos tienen estructuras de control similares.
Básicamente lo que varía entre las estructuras de control de los diferentes lenguajes es su sintaxis.
Cada lenguaje tiene una sintaxis propia para expresar la estructura.
Script de PowerShell.
Un script es un archivo de texto sin formato que contiene uno o más comandos de PowerShell.
Los scripts de PowerShell tienen una extensión de archivo .ps1.
Ejecutar un script es muy parecido a ejecutar un cmdlet.
Pueden ejecutar scripts en el equipo o en una sesión remota en otro equipo.
Al escribir un script se guarda un comando para su uso posterior y facilita el uso compartido con otros usuarios.
Permite ejecutar los comandos simplemente escribiendo la ruta de acceso del script y el nombre de archivo.
Los scripts pueden ser tan simples como un solo comando en un archivo o tan complejos como un programa
completo.
Una función en PowerShell.
una función es un conjunto de instrucciones a las que les damos un nombre.
El principal interés de las funciones es que podemos llamarlas varias veces, sin tener que volver a escribir las
instrucciones en cada llamada.
Si se escriben scripts o comandos únicos de una línea de PowerShell y encuentran que a menudo tienen que
modificarlos para distintos escenarios, es bastante probable que estos sean buenos candidatos para convertirlos en
una función que se pueda volver a usar.
Los módulos de PowerShell.
Un módulo es un paquete que contiene objetos de PowerShell, como cmdlets, proveedores, funciones, flujos de
trabajo, variables y alias.
Los objetos u acciones de este paquete se pueden implementar en un script de PowerShell, una DLL compilada o una
combinación de ambos.
Estos archivos se agrupan en un solo directorio.
Las personas que escriben comandos pueden usar módulos para organizar sus comandos y compartirlos con otros.
Las personas que escriben módulos pueden agregar los comandos en los módulos a sus sesiones de PowerShell y
usarlos como comandos integrados.
Carga automática de los módulos.
A partir de PowerShell 3.0, este importa módulos automáticamente la primera vez que ejecuta cualquier comando
en un módulo instalado.
Ahora se pueden usar los comandos en un módulo sin ninguna configuración o configuración de perfil, por lo que no
es necesario administrar los módulos después de instalarlos en tu computadora.
Los comandos de un módulo son fáciles de encontrar.
El cmdlet Get-Command obtiene todos los comandos en todos los módulos instalados, incluso si aún no están en la
sesión.
Se puede encontrar un comando y usarlo sin tener la necesidad de importar el módulo primero.
Solo los módulos que se almacenan en la ubicación especificada por la variable de entorno PSModulePath se
importan automáticamente.
Los comandos que incluyen un carácter comodín (*) se consideran para descubrimiento, no para uso y no importan
ningún módulo.
Los módulos en otras ubicaciones deben importarse ejecutando el Import-Module cmdlet.
PowerShell Script.
Estructura PowerShell.
¿Cómo utilizar un PowerShell?, ¿Extensión para usar PowerShell?
Los script en PowerShell deben contener: nombre_del_archivo.ps1
¿En este lenguaje se puede manejar variables y objetos?
ejemplos:
Multiplataforma.
https://learn.microsoft.com/es-mx/powershell/scripting/install/installing-
powershell-on-windows?view=powershell-7.2&viewFallbackFrom=powershell-7.1
Infografía y uso común.
. Infografía diferencias entre PowerShell y PowerShell Core

PowerShell PowerShell Core


Versión más reciente 5.1 7.1
Windows (cliente y servidor),
Plataformas Solo Windows (cliente y servidor)
Mac OS y Linux
Dependencia .NET Framework .NET Core
Se basa en el runtime de .NET Se basa en el runtime
Uso
Framework de .NET Core
Ejecutado como PowerShell.exe Pwsh.exe (Windows), pwsh (Mac y Linux)
Verificar el contenido de la
propiedad Devuelve:`Escritorio` Devuelve: `Core`
$PSVersionTable.PSEdition
Solo correcciones de errores Todas las actualizaciones
Políticas de actualización
críticos. (características, errores)
Usos comunes.
Automatización de tareas.
PowerShell sirve para facilitar a los administradores de sistemas las tareas de automatización, administración y
configuración de sistemas.
Configuración de management.
Al usar PowerShell DSC.
Monitoreo.
Para escribir scripts que pueden ser utilizados por un software de monitoreo.
Testear infraestructura.
Las pruebas de infraestructura en Pester son código de PowerShell que ejecuta el módulo Pester PowerShell y se
crea de una manera específica, conocida como lenguaje específico de dominio (DSL).
Este DSL describe el estado deseado y tiene el código necesario para verificar ese estado y comparar el resultado.
Automatización de procesos.
Automatizar tareas en un proceso de liberación de software (CI/CD).
Ejemplos.

Python.
Python es un lenguaje de escritura rápida, escalable, robusto y de código abierto.
Esto hace que Python sea un aliado perfecto para la inteligencia artificial, ya que permite plasmar ideas complejas
con unas pocas líneas de código, lo que no es posible con otros lenguajes.
Historia de Python.
Su nombre se debe a la afición de Van Rossum al grupo
Monty Python.
Su concepción se enfocaba en que fuera fácil de usar y
aprender, sin que esto penalizará sus capacidades, en su
momento, no llegó a adquirir la suficiente importancia
debido a la falta de recursos en el hardware de la época.
¿Qué es y para qué sirve Python?
Se define como un “lenguaje de programación versátil, multiplataforma y multiparadigma que se destaca por su
código legible y limpio” .
Se emplea en plataformas de alto tráfico como Google, YouTube o Facebook.
Su principal objetivo es la automatización de procesos, lo que hará de las tareas algo mucho más simple.
Uno de sus puntos fuertes es que “comprueba los errores sobre la marcha”.
Python crea un código con gran legibilidad, que ahorra tiempo y recursos.
Usos de Python.
Phyton se convirtió en uno de los lenguajes de programación más utilizados en la actualidad, aunque tiene una
presencia en el mercado de más de 30 años.
Uno de sus principales aliados es la inteligencia artificial, pero también se destaca en aplicaciones web y big data.
Python también se usa para obtener información de otros sitios web, lo que comúnmente se denomina “scraping”.
Incluso tiene aplicaciones prometedoras en el campo médico que mejoran la capacidad de brindar diagnósticos y
tratamientos precisos a los pacientes.
Otras áreas como astronomía, robótica, vehículos autónomos, negocios, meteorología y desarrollo de interfaces
gráficas de usuario también se benefician con el uso de Python.
¿Por qué es importante saber Python en el contexto de infraestructura?
Principales industrias que usan este lenguaje de programación:
● Python en la inteligencia artificial (AI)
Python es un lenguaje de escritura rápido, escalable, robusto y de código abierto, ventajas que hacen de Python un
aliado perfecto para la inteligencia artificial.
Permite plasmar ideas complejas con unas pocas líneas de código, lo que no es posible con otros lenguajes.
● Python en big data.
El uso de Python está muy extendido en el análisis de datos y la extracción de información útil para empresas.
● Python en data science.
Python se ocupa de los datos tabulares, matriciales y estadísticos, e incluso los visualiza con bibliotecas populares.
● Python en frameworks de pruebas.
Python es ideal para validar ideas o productos, ya que
tiene muchos frameworks integrados que ayudan a
depurar el código y ofrecen flujos de trabajo y ejecución
rápidos.
● Python en Desarrollo Web.
Python permite construir mucho más con menos líneas
de código, por lo que se crean prototipos de forma más
eficiente.
Para qué se usa Python?
Para el desarrollo de aplicaciones:
● Desarrollo web.
● Video juegos.
● Análisis de datos.
● Internet de las cosas (IoT)
Python es un lenguaje interpretado de propósito general.
Su diseño acentúa la legibilidad del código y su sintaxis permite expresar conceptos en pocas líneas de código, a
diferencia de lenguajes como C++ o Java.
Python soporta múltiples paradigmas de programación.
Pros y contras.
Pros.
• Aprendizaje: Es un lenguaje relativamente fácil de aprender.
• Académico: Lenguaje preferido por las principales universidades en el mundo para comenzar a programar.
• Librerías: Cuenta con una extensa cantidad de módulos (escritos en C) como apoyo.
Contras.
• Rendimiento: Su rendimiento aún no es comparable con el de C++.
• Desarrollo móvil: Muy pocas aplicaciones móviles son desarrolladas con Python. Esta no es un área fuerte del
lenguaje.
• Errores: Algunos errores se pueden detectar solamente en tiempo de ejecución.
Introducción a variables en Python.
En algunos lenguajes de programación, las variables se pueden entender como "cajas" en las que se guardan los
datos, pero en Python las variables son "etiquetas" que permiten hacer referencia a los datos (que se guardan en
unas "cajas" llamadas objetos).
Python es un lenguaje de programación orientado a objetos y su modelo de datos también está basado en objetos.
Para cada dato que aparece en un programa, Python crea un objeto que lo contiene.
Cada objeto tiene:
• Un identificador único (un número entero, distinto para cada objeto).
El identificador permite a Python referirse al objeto sin ambigüedades.
• Un tipo de datos (entero, decimal, cadena de caracteres, etc.).
El tipo de datos permite saber a Python qué operaciones pueden hacerse con el dato.
• Un valor (el propio dato).
Definir una variable.
Las variables en Python se crean cuando se definen por primera vez, es decir, cuando se les asigna un valor por
primera vez.
Para asignar un valor a una variable se utiliza el operador de igualdad (=).
A la izquierda de la igualdad se escribe el nombre de la variable y a la derecha el valor que se quiere dar a la variable.
Una variable puede almacenar números, texto o estructuras más complicadas (que se verán más adelante).
Si se va a almacenar texto, el texto debe escribirse entre comillas simples (') o dobles ("), que son equivalentes.
A las variables que almacenan texto se les suele llamar cadenas (de texto).
Si no se escriben comillas, Python supone que estamos haciendo referencia a otra variable.
Nombres de variables.
Aunque no es obligatorio, se recomienda que el nombre de la variable esté relacionado con la información que se
almacena en ella, para que sea más fácil entender el programa.
Si el programa es trivial o mientras se está escribiendo un programa, esto no parece muy importante, pero si se
consulta un programa escrito por otra persona o escrito por uno mismo, pero hace tiempo, resultará mucho más
fácil entender el programa si los nombres están bien elegidos.
También se acostumbra a utilizar determinados nombres de variables en algunas ocasiones, como se verá más
adelante, pero esto tampoco es obligatorio.
Tipos de variables.
para Python no es lo mismo un número entero, un número decimal o una cadena ya que, por ejemplo, dos números
se pueden multiplicar, pero dos cadenas no (curiosamente, una cadena sí que se puede multiplicar por un número).
Una vez se ha definido una variable, se puede utilizar para hacer cálculos o para definir nuevas variables, como
muestran los siguientes ejemplos:
Utilizar o modificar variables ya definidas.
En caso de utilizar una variable no definida anteriormente, Python genera un mensaje de error.

Estructuras de control en Python.


Indentación (sangría).
En Python, las líneas de código que están dentro de un mismo grupo y deben estar agrupadas, teniendo el mismo
número de espacios a la izquierda de cada línea, al igual que sucedería en la vida real.
A modo de ejemplo:

Este siguiente caso no sería correcto, y en Python generaría un error (o el funcionamiento no sería el esperado):
Lógicamente, Manzanas no puede estar al mismo nivel que Frutería.

En Python, se recomienda usar siempre bloques de cuatro espacios, aunque si se usan otro número de espacios,
también funcionará. También se pueden usar tabuladores, aunque se recomienda no usarlos.
if en Python.
El comando if (condición principal), con los opcionales elif (condiciones adicionales, se pueden poner tantas como se
quiera) y else (si no se ha cumplido ninguna de las anteriores, solo se puede poner una vez y al final).
Por ejemplo:

Condiciones en Python.
Las condiciones que se suelen usar con más frecuencia son:
a == b => Indica si a es igual a b.
a<b
a>b
not => NO: Niega la condición que le sigue.
and => Y: Junta dos condiciones que tienen que cumplirse las dos.
or => O: Junta dos condiciones y tienen que cumplirse alguna de las dos.
Bucles while y for.
while.
Hay que tener la precaución con los while de no realizar un «bucle infinito», que consiste en un bucle que nunca
termina por un error en la programación.
En el caso siguiente, esto ocurriría si no hubiéramos puesto la línea vuelta=vuelta+1.

for.
En el for, no es posible realizar un bucle infinito.
range genera una secuencia de números desde 1 hasta 10.

for se puede usar con cualquier objeto con el que se pueda iterar (ir saltando de elemento en elemento), como
vemos en este ejemplo con una lista:

Si lo combinamos con la función enumerate, además irá dándole un número a cada elemento:

Estructuras de control.
Los algoritmos requieren dos estructuras de control importantes:
Iteración.
Elección.
Ambas están disponibles en Python en varias formas.
El programador puede elegir la instrucción que sea más útil para la circunstancia dada.
Para la iteración.
Python proporciona una instrucción while estándar y una instrucción for muy potente.
La instrucción while repite un cuerpo de código mientras una condición sea verdadera.
Por ejemplo:
>>> contador = 1
>>> while contador <= 5:
... print("Hola, mundo")
... contador = contador + 1
Hola, mundo
Hola, mundo
Hola, mundo
Hola, mundo
Hola, mundo
Este código imprime la frase “Hola, mundo” cinco veces.
La condición en la instrucción while se evalúa al inicio de cada repetición.
Si la condición es True, el cuerpo de la instrucción se ejecutará.
Es fácil ver la estructura de una instrucción while de Python debido al patrón de sangrado obligatorio que el lenguaje
impone.
La instrucción while es una estructura iterativa de propósito general que usaremos en una serie de algoritmos
diferentes.
En muchos casos, una condición compuesta controlará la iteración.
Un fragmento como el siguiente:
while contador <= 10 and not hecho:
...
Haría que el cuerpo de la instrucción fuera ejecutado solo en el caso en que se cumplan ambas partes de la
condición.
El valor de la variable contador tendría que ser menor o igual a 10 y el valor de la variable hecho tendría que ser
False (not False es True) de modo que True and True da como resultado True.
Aunque este tipo de estructura es muy útil en una amplia variedad de situaciones, otra estructura iterativa, la
instrucción for, se puede usar junto con muchas de las colecciones de Python.
La instrucción for puede usarse para iterar sobre los miembros de una colección, siempre y cuando la colección sea
una secuencia.
Por ejemplo:
>>> for item in [1,3,6,2,5]:
... print(item)
...
1
3
6
2
5
Asigna a la variable item cada valor sucesivo de la lista [1,3,6,2,5]. Entonces se ejecuta el cuerpo de la iteración. Esto
funciona para cualquier colección que sea una secuencia (listas, tuplas y cadenas).
Un uso común de la instrucción for es implementar una iteración definida sobre un rango de valores.
La siguiente instrucción:
>>> for item in range(5):
... print(item**2)
...
0
1
4
9
16
>>>
Ejecutará la función print cinco veces.
La función range devolverá un objeto de rango que representa la secuencia “0,1,2,3,4” y cada valor se asignará a la
variable item.
Este valor es entonces elevado al cuadrado y se imprime en pantalla.
Las instrucciones de selección les permiten a los programadores hacer preguntas y luego, con base en el resultado,
realizar diferentes acciones.
La mayoría de los lenguajes de programación proporcionan dos versiones de esta útil estructura: ifelse e if.
Un ejemplo sencillo de una selección binaria que utiliza la instrucción ifelse es el siguiente:
if n<0:
print("Lo siento, el valor es negativo")
else:
print(math.sqrt(n))
En este ejemplo, el objeto referenciado por n se comprueba para ver si es menor que cero.
Si es así, se imprime un mensaje indicando que es negativo.
Si no es así, la instrucción ejecuta la cláusula else y calcula la raíz cuadrada.
Las estructuras de selección, como ocurre con cualquier otra estructura de control, pueden anidarse de modo que el
resultado de una pregunta ayude a decidir si se pregunta la siguiente.
Por ejemplo, supongamos que puntaje es una variable que contiene una referencia a un puntaje de un examen de
ciencias de la computación.
if puntaje >= 90:
print('A')
else:
if puntaje >= 80:
print('B')
else:
if puntaje >= 70:
print('C')
else:
if puntaje >= 60:
print('D')
else:
print('F')
Este fragmento clasificará un valor llamado puntaje mediante la impresión de la calificación cualitativa obtenida.
Si el puntaje es mayor o igual a 90, la instrucción imprimirá “A”.
Si no lo es (else), se hace la pregunta siguiente. Si el puntaje es mayor o igual a 80, entonces debe estar entre 80 y
89, ya que la respuesta a la primera pregunta era falsa.
En este caso se imprimirá la letra “B”.
Puede verse que el patrón de sangrado de Python ayuda a dar sentido a la asociación entre if y else sin necesidad de
elementos sintácticos adicionales.
Una sintaxis alternativa para este tipo de selección anidada utiliza la palabra clave elif.
El else y el if siguiente se combinan para eliminar la necesidad de niveles de anidamiento adicionales.
Tené en cuenta que el último else sigue siendo necesario para proporcionar el caso por defecto, en caso de que
todas las demás condiciones fallen.
if puntaje >= 90:
print('A')
elif puntaje >= 80:
print('B')
elif puntaje >= 70:
print('C')
elif puntaje >= 60:
print('D')
else:
print('F')
Python también tiene una estructura de selección de una sola vía, la instrucción if.
Con esta instrucción, si la condición es verdadera, se realiza una acción.
Si la condición es falsa, el procesamiento simplemente continúa con la instrucción que siga después del if.
Por ejemplo, el siguiente fragmento comprobará primero si el valor de una variable n es negativo.
Si lo es, entonces es modificado mediante la función de valor absoluto.
Sea cual sea el caso, la siguiente acción es calcular la raíz cuadrada.
if n<0:
n = abs(n)
print(math.sqrt(n))
Regresando a las listas, existe un método alternativo para crear una lista que usa estructuras de iteración y de
selección, conocido como comprensión de listas.
Una comprensión de lista permite crear fácilmente una lista basada en algunos criterios de procesamiento o de
selección.
Por ejemplo, para crear una lista de los primeros 10 cuadrados perfectos, podemos usar una instrucción for:
>>> listaCuadrados=[]
>>> for x in range(1,11):
listaCuadrados.append(x*x)
>>> listaCuadrados
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>>
Usando comprensión de listas, podemos hacer lo mismo en un único paso como
>>> listaCuadrados=[x*x for x in range(1,11)]
>>> listaCuadrados
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>>
La variable x toma los valores de 1 a 10 especificados por la estructura for.
El valor de x*x se calcula y se agrega a la lista que se está construyendo.
La sintaxis general para una comprensión de listas también permite agregar un criterio de selección para que
únicamente se agreguen ciertos ítems.
Por ejemplo:
>>> listaCuadrados=[x*x for x in range(1,11) if x%2 != 0]
>>> listaCuadrados
[1, 9, 25, 49, 81]
>>>
Esta comprensión de listas construyó una lista que contenía solamente los cuadrados de los números impares en el
rango de 1 a 10.
Cualquier secuencia que soporte la iteración se puede utilizar dentro de una comprensión de listas para construir
una nueva lista.
>>>[letra.upper() for letra in 'estructuras' if letra not in 'aeiou']
['S', 'T', 'R', 'C', 'T', 'R', 'S']
>>>
Configuration management (gestión de la configuración).
¿Qué es configuration management?
Configuration management y change management son dos de los procesos fundamentales del conjunto de
metodologías conocido como ITIL.
Change management.
ITIL describe la gestión de cambios como el proceso de controlar y gestionar un cambio a lo largo de todo su ciclo
de vida con el objetivo de minimizar el riesgo.
¿Qué es un cambio? Según ITIL, un cambio es la modificación o eliminación de cualquier cosa que pueda afectar
directa o indirectamente los servicios.
Básicamente, cualquier cambio en la infraestructura de IT de una organización puede afectar las operaciones de la
organización.
Ejemplos de un cambio: Reemplazo de hardware, instalación de software en un servidor o la modificación de una
configuración de un sistema que alterará su comportamiento.
Configuration management.
Es el proceso que permite gestionar los cambios de configuración de nuestros activos informáticos —ya sean de
software o hardware—, permitiendo a la organización mantener un registro histórico y a su vez aplicar controles —
como un proceso de aprobación para cambios que cumplan con determinadas características—.
Cada uno de los activos informáticos en el contexto de este proceso se los conocen como configuration items (CI) y
se almacenan en lo que es llamado CMDB (configuration management database).
Change management + Configuration management.
Ambos procesos se complementan, ya que change management aporta a la gobernabilidad de los cambios que se
efectúan en el parque tecnológico de una organización, y configuration management nos permite gestionar una
base de datos (CMDB) con la informacion de nuestros activos (CIs) y un historial de los cambios realizados para cada
uno de ellos.
De esta manera, de ocurrir la falla de uno de nuestros activos que nos fuercen a restaurarlo, por ejemplo, una falla
crítica en un servidor, el proceso de configuration management nos aporta una vista de todos los cambios sucedidos
para ese activo desde su creación, y así permitirnos reproducir cada uno de los cambios y devolverlo al estado
anterior a la falla.
Configuration management tradicional.
¿Cómo se ve en la práctica?
Tomemos como ejemplo el ciclo de vida de un servidor.
Este se puede dividir en 2 etapas:
● La etapa de construcción del servidor: Un conjunto de pasos que pueden ser automatizados, documentados o
sencillamente conocimiento común del área de IT, que permiten la puesta en marcha de un servidor y registrarlo en
la CMDB como un nuevo CI.
● Su ciclo de vida, a lo que podemos llamar etapa de ejecución: todo lo que suceda en relación al activo y cambios
que puedan suceder en él.
Mapa del proceso tradicional.

Etapa de construcción de un servidor.

Instalación del S.O.


El proceso de instalación del sistema operativo en el hardware o máquina virtual.
Configuración del S.O.
El conjunto de configuraciones definido por la organización como requeridas para el que el servidor pueda formar
parte del ecosistema.
Instalación del software de base.
Es probable que la organización de IT haya determinado que debe instalarse software adicional para que el servidor
pueda operar correctamente dentro del ecosistema.
Estos pueden incluir: antivirus, software de IDS / IPS, agentes de backup, etcétera.
Instalación de aplicación y servicios.
Durante el proceso de construcción del servidor se debe instalar y configurar el software o servicio que dará sentido
a su existencia. Por ejemplo, si el servidor está destinado a ser un servidor web, no solo se trata de instalar el
servidor web (IIS, NGINX, Apache, etc.), sino que también se trata de desplegar el sitio web que lo alojará.
Etapa de ejecución de un servidor.

Patching.
El proceso de instalar actualización del sistema operativo, dependiendo del sistema operativo es la cadencia con la
que este proceso se ejecutará.
En términos generales las organizaciones eligen ejecutar instalaciones mensuales de actualizaciones.
Este proceso debería verse reflejado mediante el proceso de change management.
Cambios de configuración.
Cualquier cambio de configuración del sistema operativo o hardware que responda a una necesidad.
Estos deberían verse reflejados como parte del proceso de change management.
Solución de problemas.
Cualquier incidencia que haya producido una falla en el sistema reduciendo o anulando su funcionamiento.
Requiriendo la intervención de un administrador para restaurar el nivel de servicio.
Estas deberían verse reflejadas como parte del proceso de incident management.
Cambios no autorizados.
¡Alerta! Cualquier cambio o actividad realizado en el servidor y que no queda documentado en un ticket, ya sea
como un cambio o un incidente.
Problemáticas.
Configuration management + Change management, ¿es practicable?
¿Es posible reconstruir un activo el mismo estado que se encontraba previo a la falla que nos forzó a restaurarlo?
El poder realizar esto de manera exitosa depende de muchas variables:
● La disciplina que hayamos tenido para realmente reflejar cada uno de los cambios realizados al activo durante su
ciclo de vida.
● Quedará a discreción del administrador a cargo de la restauración que cambios son necesarios reproducir, y cuáles
pueden ser obviados.
● Error humano, podemos equivocarnos al intentar reconstruir el activo.
Toda tarea manual conlleva lugar a errores y cuanto más antiguo sea un activo, mayor será la cantidad de cambios
que tengamos que aplicar, en consecuencia, mayor la posibilidad de cometer un error.
● La existencia de cambios no autorizados.
Un cambio no autorizado que es implementado con éxito es más peligroso que uno que no lo es, ya que produce una
configuración efectiva sin dejar evidencia de la misma.
Mascotas vs. Ganado.
Cuando se habla de configuration management se tiene a hacer una divergencia entre ‘Mascotas’ y ‘Ganado’.
¿Por qué?
En términos generales, se dice que, en los procesos tradicionales, aquellos en los que encontramos las problemáticas
previamente mencionadas, cada servidor administrado de forma individual se convierte en una mascota, con un
trato personalizado.
Mientras que, en los procesos modernos de administración de servidores, los mismos se administran en conjunto,
con una mirada industrial y abarcativa del parque tecnológico.
Se adopta un enfoque que nos permite implementar soluciones rápidas y reemplazar componentes fallidos en lugar
de invertir tiempo en intentar resolver problemas complejos, similar a como sucede en la ganadería donde el ganado
se administra como un todo.
¡Configuration as Code al rescate!
En los procesos modernos de configuration management, la posibilidad de definir la configuración de un servidor
como código (Configuration as Code, o CaC) es fundamental.
● Gestionar el parque tecnológico como ganado no sería posible sin la utilización de un sistema de configuration
management.
● Cualquier cosa definida como código puede ser automatizada.
● El código puede ser sometido a pruebas.
● CaC es un paso anterior a habilitar Self-Healing y Self-Remediation (dos prácticas del mundo moderno de
infraestructura que permiten implementar procesos de autorreparación).
● Es compatible con el proceso de change management de ITIL, ya que las modificaciones no suceden en los activos,
sino en un repositorio que soporta versionado, de modo que los cambios pueden ser testeados y desplegados en
ambientes bajos para luego aplicarlos en producción.
● No reemplaza al proceso de configuration management de ITIL, hasta comparten el mismo nombre.
Los desafíos de adoptar Configuration as Code.
Transicionar de los procesos tradicionales a los procesos modernos puede llevarnos a afrontar varios desafíos:
● Tenemos que entender si realmente tiene sentido transicionar a estos procesos.
● Comprender qué tan lejos queremos ir con la implementación de CaC, ¿vamos a adaptar los sistemas existentes?
¿O adoptaremos la práctica solo para los nuevos sistemas?
● Abandonar las viejas formas de trabajar puede presentar resistencia.
● Puede que necesitemos repensar la forma en la que se construyen los servidores en la organización.
Herramientas de configuration management.

Chef.
Es una plataforma de configuration management con una arquitectura cliente-servidor, principalmente, orientada a
Linux.
Lo que significa que las configuraciones son definidas y asignadas en el servidor y es mediante el cliente de Chef que
se hacen efectivas en aquellos activos que deseamos configurar.
La presencia de un cliente hace que Chef pueda detectar las desviaciones que se producen a causa de posibles
intervenciones manuales y así corregirlas para devolverla al estado deseado.
El cliente de Chef funciona en modo “pull”, lo que significa que este verifica periódicamente contra el servidor si hay
nuevas versiones de la configuración.
Las configuraciones de Chef se escriben en Ruby.
Puppet.
Al igual que Chef, es una plataforma de configuration management con una arquitectura cliente-servidor,
principalmente, orientada a Linux.
Lo que significa que las configuraciones son definidas y asignadas en el servidor y es mediante el cliente de Puppet
que se hacen efectivas en aquellos activos que deseamos configurar.
Como en Chef, la presencia de un cliente hace que Puppet pueda detectar las desviaciones que se producen a causa
de posibles intervenciones manuales y así corregirlas. El cliente también funciona en modo “Pull”.
Las configuraciones de Puppet se escriben en un DSL (domain specific language) creado por Puppet labs.
La gran diferencia entre Puppet y Chef está dada por las capacidades de reporting que tiene Puppet.
PowerShell DSC.
DSC (del inglés, desired state configuration) es una tecnología que forma parte de PowerShell, originalmente
desarrollada para mantener la configuración de hosts que Windows Server, es multiplataforma y puede también
configurar hosts Linux.
Puede funcionar tanto en una arquitectura cliente-servidor (modo “pull’) o en una modalidad standalone (modo
“push”). Cuando DSC funciona en modo “push” las configuraciones son definidas localmente y el cliente (llamado
LCM, del inglés local configuration manager) es el encargado de aplicarlas sin buscar en un servidor.
Tanto en modo “push” como en modo “pull”, tiene la capacidad de determinar si han habido desviaciones respecto
de la configuración definida y corregirlas.
Las configuraciones para DSC son escritas en el lenguaje de scripting PowerShell.
Ansible.
Es una tecnología de configuration management desarrollada en Python. Ansible no requiere de la instalación de un
agente en aquellos servidores que se configuraran usando Ansible, sino que la herramienta establece una conexión
vía SSH y de esa manera despliega las configuraciones.
Su versatilidad ha hecho que su uso evolucione más allá de ser utilizada como herramienta de configuration
management para configurar hosts.
También se utiliza como orquestador, para controlar despliegues en la nube y hasta desplegar aplicaciones como
parte de un proceso de liberación de software.
Las configuraciones en Ansible se escriben en archivos con formato YAML (un superset del formato JSON).
Se trata de un software de gestión de la configuración automática y remota, que nos permite
centralizar la configuración de numerosos servidores, dispositivos de red y cloud providers de una
forma sencilla y automatizada.
● Ansible es una herramienta open source de configuration management y de aprovisionamiento,
similar a Chef, Puppet o Salt.
● Usa SSH para conectarse a los servidores y ejecutar las tareas de configuración. Ansible nos permite controlar y
configurar nodos desde un servidor central.
● Lo que lo hace diferente de otras herramientas de configuration management es que Ansible utiliza la
infraestructura de SSH.
El proyecto se originó en 2013 y fue comprado por Red Hat en 2015.
¿Por qué elegir Ansible?
● No usa agentes: Mientras que al equipo que queramos configurar se pueda acceder vía SSH y correr Python, se
podrá configurar usando Ansible.
● Idempotente: Toda la arquitectura de Ansible está estructurada alrededor del concepto de idempotencia. Solo se
harán configuraciones si son necesarias y que se podrán aplicar de manera repetible sin provocar efectos
secundarios.
● Declarativo: A diferencia de un script, en donde debemos escribir la lógica necesaria para efectuar una
configuración, Ansible trabaja por nosotros, dejándonos escribir una descripción del estado que deseamos para un
servidor o conjunto de servidores.
Es luego Ansible el que se encarga de aplicar dicha descripción de forma idempotente.
● Fácil de aprender.
Idempotencia.
● Wikipedia define a la idempotencia como la propiedad para realizar una acción determinada varias veces y aun así
conseguir el mismo resultado que se obtendría si se realizase una sola vez.
● En los procesos de infraestructura modernos, en donde las configuraciones se definen en forma de código y
muchas veces de forma declarativa, la idempotencia no solo es una herramienta sino una necesidad para poder
implementar procesos de alta predictibilidad.
Arquitectura.
Inventario.
● El inventario es una lista de los nodos que pueden ser accedidos por Ansible. Por defecto, el inventario está
soportado por un archivo de configuration, cuya ubicación es /etc/ansible/hosts. Los nodos pueden estar listados
por nombre o IP.
● Cada nodo es asignado a un grupo, como pueden ser “web servers”, “db servers”, entre otros. ● El inventario debe
estar escrito en uno de muchos formatos, estos pueden ser YAML, INI, etcétera. YAML es el formato más utilizado en
la industria.
Ejemplo de un inventario:

Playbooks.
● Los playbooks son archivos también escritos en formato YAML.
Estos archivos son la descripción del estado deseado de los sistemas que vamos a configurar.
Ansible es el que hace todo el trabajo para llevar los servidores al estado que nosotros hayamos especificado sin
importar el estado en el que estén cuando la configuración se aplique.
Los playbooks hacen que las nuevas instalaciones, actualizaciones y la administración del día a día sea repetible,
predecible y confiable.
● Los playbooks son simples de escribir y mantener.
Se escriben en un lenguaje natural por lo que son muy sencillos de evolucionar y editar.
● Los playbooks contienen Plays (jugadas).
● Las jugadas (contienen tareas (en inglés, tasks).
● Las tareas invocan módulos.
Ejemplo de un playbook.
Este playbook instala la versión más reciente de
Apache y se asegura que este corriendo en aquellos
servidores que estén bajo el grupo “webservers” en
el inventario:
Módulos.
● Hay más de 1000 módulos incluidos con Ansible para automatizar las diferentes partes de nuestro ambiente.
Se puede pensar en los módulos como los plugins que hacen el trabajo real de configuración. Cuando se ejecutan las
tareas escritas en un playbook, lo que se está ejecutando es en realidad un módulo.
● Cada módulo es independiente (no debería tener dependencia de otros módulos) y se lo puede escribir en
cualquiera de los lenguajes de scripting standard de mercado (Python, Perl, Ruby, Bash, etc.). Uno de los principios
de diseño de los módulos es la idempotencia.
● Dentro de los módulos más populares podemos encontrar: Service, file, copy, iptables, entre otros.
Ejemplo de la invocación de un módulo.
Los módulos se incluyen en los playbooks para componer configuraciones complejas o abarcativas.
También es posible invocar módulos individualmente desde la línea de comandos una única vez para probar el
módulo o realizar una tarea específica.
A continuación, vemos dos comandos, el primero reproduce una de las tareas que ya vimos en un playbook que nos
ayuda a asegurarnos que el servicio de Apache está corriendo.
Mientras que el segundo invoca el módulo ‘ping’ para hacer un ‘ping’ localmente contra ‘localhost’:

La herencia de Python.
Ansible está desarrollado en Python y hereda o implementa algunos aspectos del lenguaje.
Si bien, no es necesario ser desarrollador de Python para poder hacer uso de Ansible, hay algunas cuestiones que es
importante conocer:
● El lenguaje de templating (Jinja2)
● Operador ternario: El operador ternario de Python se puede utilizar dentro de los templates de Jinja para alterar
algunos comportamientos de nuestros playbooks en función de ciertas condiciones.
● Errores: Muchas veces los errores que encontremos van a estar en un formato que, de estar familiarizados con
Python, nos resultará más sencillo de leer.
Casos de uso de Ansible.
● Aprovisionamiento: Utilizar Ansible para instanciar servidores o máquinas virtuales “configurando el sistemas de
virtualización”.
● Configuration management: gestionar y mantener las configuraciones de nuestros servidores.
● App deployment: distribuir aplicaciones.
● Continuous delivery: Utilizarlo como componente de un proceso de CI/CD para automatizar el despliegue de una
aplicación luego de su proceso de compilación.
● Seguridad y compliance: La naturaleza idempotente de Ansible hace que podamos utilizarlo para distribuir
configuraciones asociadas con la seguridad sin importar la configuración actual.
● Orchestration: Puede ser utilizado también para orquestar operaciones en la nube o ‘configurar’ la nube.
Configuration management con Ansible.
Ansible es la herramientas más simple para implementar una estrategia de configuration management.
Está diseñado para ser minimalista, consistente, seguro y altamente confiable.
Cualquier desarrollador, tester o administrador de infraestructura puede fácilmente utilizarlo para configurar un
conjunto de nodos. Además, cualquier persona en el departamento de IT podría escribir un playbook sin mayores
dificultades.
Las configuraciones descritas en Ansible (playbooks) son sencillamente una descripción de la infraestructura (en un
lenguaje fácilmente inteligible para el ojo humano) de modo que cualquier persona en el área de IT podría entender
el significado de cada tarea en un playbook.
Ansible solo requiere el password o la clave privada del usuario que se utilizará para acceder desde Ansible a los
sistemas que se configuraron.

Ansible en acción.
Creación del ambiente de trabajo.

Vamos a crear nuestro servidor Linux con Ansible y


dos entornos de trabajos (Desarrollo y
Producción), cada uno con dos servidores.
Tal como podemos observar en la siguiente
imagen:
Generación de las MV.
Hasta ahora hemos visto la virtualización a través VirtualBox y Vagrant. Ahora, vamos a agilizar la creación de
máquinas virtuales y vamos a descargarlas completas en el siguiente link: https://descargarmaquinasvirtuales.com.
Descargamos la imagen de Debian Gnome v10 de 2612 MB para el server donde vamos a instalar Ansible, y la
imagen de Debian Server v10 de 676 MB para los servers de “Producción” y “Desarrollo”.

El próximo paso es abrir Oracle VM VirtualBox.

Vamos a “Preferencias” y creamos una nueva Red NAT.


En este caso, creamos la NatNetwork.

Con IPs en la red: 10.0.2.0/24. Luego, aceptamos y continuamos.


Ahora, en Oracle VM VirtualBox, vamos a “Archivo” y seleccionamos “Importar servicio virtualizado”.
Vamos a “Archivo”, “Importar servicio virtualizado”. El próximo paso es seleccionar el archivo de VM descargado.

Luego, cambiamos el nombre del VM para que podamos identificarlo.

Seleccionamos la opción de “Generar nuevas direcciones MAC ...”.


Una vez finalizado hacemos clic en “Importar”.

Repetimos estos pasos con cada VM que vamos a utilizar en nuestros entornos.
Podemos hacer una prueba más reducida de acuerdo al hardware disponible con el que contamos, ya que puede ser
que no tengamos disponible una máquina real que soporte todo este entorno.
La versión reducida son dos VM (un servidor de Ansible y un cliente).
Nuestro VirtualBox debería verse así.
Login:
- Usuario: root
- Contraseña: toor
- Usuario: usuario
- Contraseña: usuario
En la configuración de la red, tenemos que colocar la Red NAT para que tener acceso a la red.

Ayuda de comandos.
Login:
user: usuario user: root
pass: usuario pass: toor
Para saber la IP de nuestro servidor debemos correr el siguiente comando:

NOTA: Ver el contenido de “Configuración de IP en MV” para configurar las IP de los hosts.
Instalar Ansible en nuestro servidor.
Levantamos nuestro servidor de Ansible.

user: usuario
pass: usuario

Ansible.
Abrimos una terminal:
Inventario.
Ansible trabaja con un inventario de servidores. Este inventario se configura en el fichero (hay que crearlo si no
existe) '/etc/ansible/hosts' y tiene la siguiente forma:

Tal como se ve es un listado de IPs que se agrupan.


Por ejemplo, aquí el grupo de servidores “desarrollo” tiene los servidores 10.0.2.10 y 10.0.2.8. (los IPs dependen de
la red que tengan configurada).
Configuración de los certificados de seguridad.
Primero tenemos que habilitar el usuario root en los hosts para que se pueda acceder por ssh, ya que por defecto
viene bloqueado por seguridad.

Ahora tenemos que agregar la siguiente línea:

Grabamos con presionando Ctrl+O y salimos con Ctrl+X, y luego reiniciamos el servicio SSH con el siguiente
comando.

Configuración de los certificados de seguridad.


Ansible se comunica con los otros servidores vía SSH y un certificado de seguridad.
Ahora toca crear este certificado de seguridad (recomendación no agregar frase):

Después tendremos que copiar el certificado de seguridad a los distintos servidores:

Esto nos pedirá la clave del usuario SSH del servidor y copiará el certificado.
Una vez todo instalado y configurado podemos probar de hacer un ping, para chequear que funcione:

Debemos habilitar el usuario ssh y copiar el certificado en todos los hosts.


Deberíamos ver:

Ejecutando comandos Ansible.


Ahora que ya tenemos todo instalado y configurado ya podemos empezar a ejecutar comandos.

Podés encontrar información en el siguiente link de la documentación oficial de Ansible: https://docs.ansible.com.


Configuración de IP en MV.
Cambiar o añadir una dirección IPv4 en un servidor dedicado Linux.
Por defecto, los servidores dedicados están configurados para llevar a cabo una configuración automática de la red
a través de DHCP.
Al servidor se le asigna siempre la primera dirección IP establecida en el contrato.
Si desea cambiar la dirección del servidor o asignar una adicional, se requiere una configuración IP estática.
Por razones de seguridad de la red, todos los servidores están configurados con una red /32 (máscara de red
255.255.255.255) y, por lo tanto, solo pueden llegar directamente a su puerta de enlace (gateway) y a las direcciones
IP configuradas localmente.
Para poder "comunicarse" con otros servidores en el segmento de red, todos los demás paquetes deben enrutarse
utilizando la puerta de enlace estándar.
Esto requiere una ruta de host a la puerta de enlace.
Editor Vim.
El editor Vim dispone de un modo de línea o inserción y un modo de mando o comando.
Podemos acceder al modo de inserción con la tecla “i”.
En este modo, los caracteres introducidos se insertarán inmediatamente en el texto. Para acceder al modo de
comando, usamos “ESC”.
En este modo, todo lo que se introduzca con el teclado se interpretará como un comando.
Para salir de Vim y guardar el archivo, debemos usar el comando :wq y luego presionar “Enter”.
Notas de experiencia y buenas prácticas.
Siempre que vamos a modificar una archivo de configuración, es de muy buena práctica hacer un backup del archivo
que vamos a modificar en caso de que necesitemos volver al estado original.
En este caso, vamos a modificar el archivo de configuración de la red.
Por lo tanto, el primer paso será hacer un backup de la configuración:

De esta manera, podremos —en caso de equivocarnos— volver al estado inicial con el comando inverso:
sudo cp -f intinterfaces.old interfaces
Debian o Ubuntu.
1- Abrí el archivo /etc/network/ifcfg-eth0 con el editor Vim.
2- Copiá y pegá el siguiente comando en /etc/network/interfaces, sustituyendo <DIRECCIÓN_IPv4_PRINCIPAL> con
la dirección IP de tu servidor.
Comprobá que la máscara de red, la puerta de enlace y la conexión Point-To-Point se hayan copiado exactamente
como se especificó anteriormente. Prestá especial atención al parámetro pointopoint.
El archivo de configuración editado tendrá el siguiente aspecto:

Por ejemplo:

3- Reinicia la red con el siguiente comando:

CentOS.
1- En CentOS, abrí el archivo /etc/sysconfig/network-scripts/ifcfg-eth0 con el editor Vim.
2 - Aplica los siguientes cambios para la configuración de IP estática y sustituí <DIRECCIÓN_IPv4_PRINCIPAL> con tu
dirección IP.

3- Ahora, configura la ruta necesaria. Crea un archivo de configuración /etc/sysconfig/network-scripts/route-eth0


insertando el siguiente contenido:

4- Reinicia la red con el siguiente comando:


Contenedores.
Los contenedores son la vía que nos coloca a Docker para tener el mismo uso que con las máquinas virtuales creadas
de la forma tradicional.
Docker usa estos contenedores para aislar uno o más procesos.
Estos procesos en el host necesitan memoria, CPU, acceso a la red y espacio en disco.
Es un ambiente perfecto para que las aplicaciones funcionen de forma correcta.
Docker.
¿Por qué Docker?
● Pueden contener cualquier aplicación en
cualquier lenguaje usando cualquier stack
(sistema operativo).
● Las aplicaciones dockerizadas pueden ejecutarse
en cualquier lugar y sobre cualquier cosa.
● No más al dicho: “Funciona en mi máquina”.
● Encapsulando dependencias los desarrolladores y los administradores de sistemas trabajan mejor en conjunto.
Vocabulario de Docker.
● Host: Una máquina virtual que ejecuta Docker daemon para alojar una colección de contenedores Docker.
● Cliente: aquí se ejecutan los comandos que están siendo ejecutados. (cliente-servidor).
● Imagen: Una colección ordenada de sistemas de archivos (capas) que se utilizarán al crear
una instancia de un contenedor.
● Contenedor: Una instancia en tiempo de ejecución de una imagen.
● Registro: Una colección de imágenes de Docker.
Docker: Desafíos con la virtualización.

La creación de una máquina virtual (VM) con el fin de ejecutar una aplicación puede superar algunos inconvenientes
de ejecutar aplicaciones directamente en el sistema operativo host. Aunque la máquina virtual está en el host, se
ejecuta como un sistema operativo separado, que incluye su propio kernel, sistema de archivos, interfaces de red,
entre otros. Esto hace que sea fácil; mantener casi todo dentro del sistema operativo separado del host.
Máquina Virtual vs. Contenedores.
Máquina Virtual

Contenedores

Sistema operativo duplicado: Las máquinas virtuales deberán contener el sistema operativo y todos los
componentes de soporte.
Arquitectura del contenedor: Los contenedores ofrecen una alternativa a la ejecución de aplicaciones
directamente en el host o en una máquina virtual que puede hacer que las aplicaciones sean más rápidas, portátiles
y escalables. La flexibilidad proviene de que el contenedor puede llevar todos los archivos que necesita. Al igual que
la aplicación que se ejecuta en una máquina virtual, puede tener sus propios archivos de configuración y bibliotecas
dependientes, además de tener sus propias interfaces de red distintas de las configuradas en el host. Entonces,
nuevamente, al igual que con la VM, una aplicación en contenedores debería poder moverse más fácilmente que sus
contrapartes instaladas directamente y no tener que competir por los mismos números de puerto porque cada
contenedor en el que se ejecutan tiene interfaces de red separadas.
Containers y plataforma de Docker.
Containers.
● Aplicaciones construidas e implementadas tradicionalmente en sistemas físicos con relación 1:1.
● Las nuevas aplicaciones a menudo requieren nuevos sistemas físicos para el aislamiento de recursos.

● Mejor utilización e implementación de aplicaciones, más rápidas que en un entorno físico tradicional.
● Las aplicaciones implementadas en máquinas virtuales son muy compatibles.

● Aceleran aún más la implementación de la aplicación.


● Reducen el esfuerzo para implementar aplicaciones.
● Optimizan el desarrollo y las pruebas.
● Menores costos asociados con la implementación de aplicaciones.
● Incrementan la consolidación de servidores.
Plataforma de Docker.
● Docker Engine, también conocido como Docker Daemon.
Es el programa que permite construir, enviar y ejecutar contenedores.
Utiliza espacios de nombres y grupos de control del kernel de Linux para proporcionar un entorno de
tiempo de ejecución aislado para cada aplicación.

● Docker Hub.
Es un registro en línea de imágenes de Docker.

● Docker Trusted Registry.


Es un registro privado en el sitio para imágenes de Docker.

● Docker Client.
Es el que toma las entradas del usuario y las envía al daemon.
El cliente y el daemon pueden ejecutarse en el mismo host o en diferentes hosts.

● Docker Images.
Es una plantilla de solo lectura utilizada para crear contenedores.
Contiene un conjunto de instrucciones para crear los contenedores.

● Docker Containers.
Es una plataforma de aplicación aislada basada en una o más imágenes que contiene todo lo necesario
para ejecutar una aplicación.

Registro Docker.
Sirven para almacenar las diversas imágenes Docker que utilicemos en nuestro sistema.
Así podemos subir imágenes nuevas a los registros o descargarlas cuando necesitemos en alguna máquina Docker.
El registro es como una estantería donde las imágenes se almacenan y están disponibles para extraerlas con el fin de
compilar contenedores que ejecuten servicios o aplicaciones web.
Hay registros de Docker privados a nivel local y en la nube pública.
● Docker Hub es que un registro público mantenido por Docker; junto con Docker Trusted Registry, una solución a
nivel empresarial.
Colocar imágenes en un registro permite almacenar fragmentos de la aplicación que son estáticos e inmutables,
incluidas todas sus dependencias a nivel de marco.
Esas imágenes se pueden versionar e implementar en varios entornos y proporcionar una unidad de implementación
coherente.
Imágenes de Docker.
Una imagen de Docker se crea a partir de una serie de
capas.
La imagen del sistema operativo de la plataforma base la
proporcionan proveedores como Microsoft para la imagen
del sistema operativo Windows, Canonical para a imagen
de Ubuntu, entre otros.
Estas imágenes se publican en DockerHub.
Cada capa representa una instrucción en el Dockerfile de la
imagen.
Todas las capas, excepto la última, son de solo lectura.
Taxonomía básica en Docker.

Dockerfile.
Es un archivo de texto simple con un conjunto de
comandos o instrucciones.
Estos comandos / instrucciones se ejecutan
sucesivamente para realizar acciones en la imagen base
para crear una nueva imagen de la ventana acoplable.
Instrucciones básicas de Dockerfile.
● DE: Define la imagen base para usar e iniciar el proceso de construcción.
● CORRER: Toma el comando y sus argumentos para ejecutarlo desde la imagen.
● CMD: Similar a un comando run, pero se ejecuta solo después de que se crea una instancia del contenedor.
● PUNTO DE ENTRADA: Se dirige a su aplicación predeterminada en la imagen cuando se crea el contenedor.
● AÑADIR: Copia los archivos de origen a destino (dentro del contenedor).
● ENV: Establece variables de entorno.
Etiquetas de imagen.
Los tags o etiquetas sirven para identificar las versiones de las imágenes, a la hora de listar las imágenes se listan con
su tag o etiqueta asociado.
Pueden agrupar sus imágenes usando nombres y etiquetas (si no proporcionan ninguna etiqueta, se asume el valor
predeterminado de la última).
● Docker es una tecnología de código abierto que se usa para implementar aplicaciones a través de contenedores.
Es una plataforma relativamente nueva que se actualiza constantemente y cuenta con una comunidad de usuarios.
Docker Hub.
Docker Hub es un servicio de registro de repositorios proporcionado por Docker Inc. Compartir y colaborar son sus
premisas.
¿Para qué sirve Docker Hub?
Nos permite extraer y enviar imágenes de la ventana acoplable hacia y desde Docker Hub. Podemos tratar esto
como un GitHub, donde obtenemos y enviamos nuestro
código fuente, pero en el caso de Docker Hub descargamos o
publicamos nuestras imágenes de contenedor. Es un
repositorio en línea basado en la nube que almacena ambos
tipos de repositorios, es decir, el repositorio público y el
privado.
Los repositorios públicos son accesibles para todos, pero el
privado es accesible para el propietario interesado de los
repositorios. También hay un costo asociado si almacenamos
más de un cierto número de repositorios como privado.
Características de Docker Hub.
1. Repositorios de imágenes:
Nos ayuda a encontrar y extraer imágenes de contenedores de Docker Hub.
2. Equipo y organizaciones:
Nos permite crear grupos de trabajo e impulsar los repositorios privados, que están disponibles para su uso
únicamente dentro de nuestra organización. De esta forma, hemos gestionado el acceso a nuestros repositorios
privados de imágenes de contenedores.
3. Integración de GitHub y Bitbucket:
Permite la integración con repositorios de código fuente como GitHub y Bitbucket.
4. Construcciones automatizadas:
Si se ha enviado algún cambio en el código fuente a los repositorios, automáticamente detecta y crea imágenes de
contenedor desde GitHub o Bitbucket y las envía a Docker Hub.
5. Webhooks:
Una vez que hemos enviado nuestras imágenes con éxito, con la ayuda de un webhook, desencadena una acción
para integrar Docker Hub con otros servicios.
6. Imágenes oficiales y del editor:
Las imágenes de alta calidad proporcionadas por los dockers se consideran imágenes oficiales y se pueden extraer y
utilizar. Del mismo modo, las imágenes de alta calidad proporcionadas por proveedores externos son imágenes del
editor —también llamadas imágenes certificadas— que brindan soporte y garantía de compatibilidad con Docker
Enterprise.
Creación del primer repositorio.
Este paso requiere iniciar sesión en Docker Hub utilizando
tus credenciales de inicio de sesión. Si no tenés una
cuenta, podés crearla haciendo clic en el botón
“Registrarse”, disponible en la página web.
Una vez que hayas iniciado sesión, podés crear el
repositorio haciendo clic en “Crear repositorio” en la
página de bienvenida. Luego, te pedirá un nombre y le
dará un nombre a tú repositorio.
Podés seleccionar una visibilidad pública o privada. También podés integrar tus repositorios de código fuente como
GitHub y Bitbucket a través de la configuración de compilación, pero es opcional (y también se puede hacer en una
etapa posterior). Una vez que todo esté hecho, se debe hacer clic en ‘’Crear’’. Con estos pasos podés crear tus
primeros repositorios. En la próxima diapositiva podés ver cómo se verán.
Docker Hub nos ofrece solo un repositorio privado de forma gratuita. Si necesitamos más repositorios privados,
podemos actualizar nuestra cuenta a un plan pago. Con la herramienta terminal de Docker Desktop, descargada e
instalada, podremos iniciar sesión en Docker Hub mediante un comando.

Explorar imágenes.
Hay dos formas de buscar imágenes y repositorios públicos desde Docker Hub. Podés buscarlo en el sitio web de
Docker Hub o usar la herramienta de línea de comandos y ejecutar el siguiente comando, suponiendo que queremos
buscar en la imagen del repositorio de MySQL.

Descargar una imagen.


Podemos descargar una imagen de Docker Hub usando el comando pull de la siguiente manera:

Si ya tenemos mysql image en nuestra máquina, el comando anterior actualizará automáticamente la imagen a la
última versión. Una cosa a tener en cuenta aquí es que, si notamos la salida del comando de búsqueda de la ventana
acoplable, hay muchas imágenes de MySQL en Docker Hub, y eso se debe a que cualquiera puede enviar una
imagen. Pero depende de nosotros saber cuál usar en función de nuestro caso de uso y asegurarnos de que sea el
apropiado.
Digamos que queremos extraer una imagen bitnami/mysql:

Crear una imagen.


El proceso de crear una imagen requiere un Dockerfile. Podemos pensar un Dockerfile como un manual de
instrucciones que le dice a Docker qué ensamblar. En resumen, es un archivo de configuración que sigue
ensamblando instrucciones.
¿Cómo funciona?
Docker lee las instrucciones de un Dockerfile y crea imágenes automáticamente. La imagen de Docker es un sistema
de archivos en capas y consta de varias capas de solo lectura. Cada capa de una imagen de Docker representa las
instrucciones de un Dockerfile. A continuación, sigamos los pasos para crear una imagen usando un Dockerfile que
especifica la configuración de nuestra aplicación.

Nota: el nombre del archivo debe ser Dockerfile con “D” mayúscula.

Algunas de las palabras clave importantes que se utilizan en Dockerfile.


Podemos utilizar # para agregar un comentario en un Dockerfile.
● MANTEINER (mantenedores): persona que va a mantener esa imagen.
● RUN (correr): se utiliza para ejecutar la instrucción dada para la imagen. En nuestro caso, primero actualiza el
sistema y luego instala MySQL.
● CMD: se utiliza para ejecutar un comando una vez que se ha lanzado el contenedor.
● COPY (copiar): se utiliza para copiar un archivo de nuestro sistema operativo host al contenedor de la ventana
acoplable.
● EXPOSE (exponer): se utiliza para especificar el número de puerto en el que el contenedor ejecutará su proceso.
Una vez que nuestro Dockerfile se ha creado correctamente, debemos ejecutar Docker build para “armar” nuestra
imagen localmente, para luego enviarla a Docker Hub. Este comando debemos ejecutarlo dentro de la carpeta donde
se encuentra el Dockerfile.

Podemos verificar que la imagen está creada con la siguiente línea de código:

Empujar una imagen.


Una vez que nuestra imagen se ha creado correctamente y se está ejecutando, podemos enviarla a Docker Hub
mediante el comando push.

Podemos verificar las etiquetas de la imagen y el estado en Docker Hub, que se verá así.

Imágenes certificadas por Docker.


Son las imágenes oficiales impulsadas por proveedores o contribuyentes.
Una imagen solo puede ser certificada por Docker Hub si su contenido cumple con las reglas, estándares y leyes
proporcionadas por Docker Hub. En resumen, esa imagen debe pasar ciertas pruebas de referencia.
Docker Hub proporciona inspectDockerImage, herramienta a través de la cual un proveedor puede autocertificar las
imágenes y los complementos (por lo general, el proveedor o contribuyente publica sus complementos para registrar
volúmenes y redes).
Imágenes populares en Docker Hub.
Hay muchas imágenes seleccionadas y optimizadas disponibles en Docker Hub.
La popularidad de estas imágenes depende de varios factores, presencia en el mercado, calificaciones, puntajes de
satisfacción, entre otros.
Para obtener una lista detallada de los repositorios más populares, podés visitar el sitio web de Docker Hub.
El uso de una imagen también depende del sistema operativo y su arquitectura.
Si conocemos para qué sistema operativo y arquitectura se utilizarán las imágenes, debemos considerar los
siguientes factores clave antes de extraer una imagen:
● Buscar una versión específica utilizando etiquetas (principalmente la última).
● Optar por el que tenga máxima cantidad descargas y estrellas.
● Buscar la fecha de su última actualización.
● Si es posible, verificar su tipo, ya sea del editor verificado u oficial (Docker Certified).
Docker Networking.
Introducción a las redes de Docker.
Nos vamos a enfocar en el driver llamado bridge, ya que con el nuevo enfoque de Docker orientado a habilitar a los
desarrolladores es el que mayoritariamente le darán uso en sus computadoras.
Todos los otros drivers están orientados a ambientes productivos, pero ese ámbito hoy está dominado por
Kubernetes, que tienen otro modelo de Networking completamente diferente.
● Las redes de tipo “bridge” son locales y exclusivas del host en donde fueron creadas.
● Son el tipo de red por defecto en Docker.
● Simula la creación de switches o hubs, de nivel 2 (en el modelo OSI).
Podemos utilizar herramientas como ‘brctl’ en Linux para ver el funcionamiento interno.
● Luego de la instalación de Docker se crea por defecto una red de tipo bridge llamada “bridge”, las buenas prácticas
indican que esta no debe ser utilizada y en su lugar se deben crear nuevas redes para usos específicos.
Bridge Driver en acción.

Resolución de nombres.
Las IPs son efímeras y más aún en el mundo de los containers —estos también deberían serlo—. De modo que
necesitamos una forma que le permita a un container hablar con otro sin conocer necesariamente la IP que le fue
asignada.
¿Qué hace Docker por nosotros?
Para todas las redes que creemos —las redes creadas por defecto no nos proveen esta ventaja—, y para todos los
containers a los que se le asigne un nombre de manera deliberada —usando --name en docker create— conectados
a estas, Docker nos provee con un servicio de resolución de nombres dentro del ámbito de la red misma utilizando el
nombre del container para identificarlo por medio del servicio DNS.
- create: nos permite crear una red.
--internal: agrando esta opción la red creada será del tipo ‘privada’.
- connect: nos permite conectar un container existente a una red.
docker run
--network <networkName>: nombre de la red a la cual conectaremos el container.
--name: nombre del container, necesario para que funcione la resolución de nombres.
-p <hostPort>:<containerPort>: nos permite publicar ciertos puertos de un container en el host para poder acceder
al servicio dentro del container.
-P: nos permite publicar todos los puertos definidos en la especificación del container (Dockerfile) en puertos
aleatorios del host.
Docker Compose.
Aprender a utilizar Docker Compose.
Docker Compose es una herramienta que permite simplificar el uso de Docker.
A partir de archivos YAML es más sencillo crear contendores, conectarlos, habilitar puertos, volúmenes, etc.
Con Compose podemos crear diferentes contenedores y al mismo tiempo, en cada contenedor, diferentes servicios,
unirlos a un volumen común, iniciarlos y apagarlos, etc.
Es un componente fundamental para poder construir aplicaciones y microservicios.
En vez de utilizar Docker vía una serie inmemorizable de comandos Bash y scripts, Docker Compose te permite
mediante archivos YAML para poder instruir al Docker Engine a realizar tareas, programáticamente.
Y esta es la clave, la facilidad para dar una serie de instrucciones y luego repetirlas en diferentes ambientes.
¿Por qué utilizar Docker con Docker Compose?
Docker y Docker Compose nos brindan algunos beneficios:
● No necesitamos instalar ni mantener software adicional en nuestro equipo.
● Podemos tener todo nuestro entorno de desarrollo en un único repositorio, por ejemplo, tenemos el back end, el
front end y las configuraciones de la base de datos en un mismo repositorio lo que facilita a los desarrolladores el
poder colaborar de mejor manera en el proyecto.
● Levantar todo el entorno de desarrollo se limita a un solo comando docker-compose up.
Pero no todo es color de rosa, también tenemos una desventaja que está enfocada al rendimiento, ya que a pesar de
que los contenedores están enfocados a ser eficientes, siguen consumiendo recursos de la máquina anfitriona tales
como procesador y memoria por lo que si la cantidad de contenedores que están corriendo al mismo tiempo es
grande o si los contenedores son pesados al momento de crearse y levantarse, podrían llevar a cuelgues del sistema
y cosas similares.
Conclusión
Podemos probar con distintos entornos y lenguajes, la idea es conseguir
optimizar al máximo nuestro entorno de desarrollo y enfocarnos en el principal
objetivo que es escribir código de calidad.
Mejoras prácticas en Docker.
Docker es una tecnología compleja y, como tal, hay muchísimos lugares en donde podemos implementar prácticas
para mejorar la seguridad, performance o hasta hacernos la vida más sencilla.
Usar imágenes oficiales
En Docker Hub vamos a encontrar 2 tipos de imágenes. Las oficiales, publicadas por organizaciones (por ejemplo,
Ubuntu) o las publicadas por usuarios individuales. ¿Cómo diferenciarlas? Las imágenes oficiales están etiquetadas
como tal en el sitio de Docker Hub. Si buscamos Ubuntu, vamos a ver que las imágenes publicadas por Canonical
están etiquetadas como Docker Official Image.
Sin embargo, la manera más práctica para entender si una imagen es oficial o no, es su nombre. Las imágenes no
oficiales incluyen el nombre del usuario que las publicó, mientras que las oficiales, no. Veamos la diferencia a la hora
de ejecutar “docker pull”. Para una imagen oficial sería: docker pull ubuntu:latest. Mientras que para una imagen
que no lo es, el comando se vería así: docker pull usuario/nginx:latest.
En el caso de la imagen no oficial, seguramente contenga un servidor Nginx, pero no sabemos (por lo menos sin
realizar un análisis más detallado) qué otras modificaciones podría haber incluido el usuario que publicó la imagen.
Utilizar el comando COPY en lugar de ADD
Ambos permiten agregar o copiar un archivo de una fuente externa a una imagen de Docker. ADD fue el primero en
ser creado para la especificación de los Dockerfiles. La gran diferencia reside en que ADD soporta copiar desde
distintos orígenes. Por ejemplo, puede agregar un archivo hosteado en la web, puede agregar un archivo que está
en un filesystem de la máquina que está compilando el Dockerfile y también puede desempaquetar un archivo .tar
(tarball, un formato de empaquetado nativo de Unix/Linux). El problema es que ADD —al hacer un montón de
cosas— puede generar confusión, incluso algunos inconvenientes técnicos (¿qué pasa si quiero copiar un archivo .tar
a la imagen en lugar de descomprimirlo?) y hasta generar problemas de performance. COPY, por el contrario, fue
introducido más tarde para cumplir la función específica de copiar un archivo desde un filesystem local a la imagen.
Incluso COPY, al tener un propósito más específico, facilita la lectura del Dockerfile.
En términos generales, se recomienda:
● Usar COPY para copiar archivos locales a la imagen en tiempo de compilación.
● Usar RUN para ejecutar curl y encadenar con otros comandos para bajar un archivo de una fuente web y copiarlo,
instalarlo o descomprimirlo.
● Usar ADD cuando se tiene un archivo .tar y se lo quiere desempaquetar dentro de la imagen que se está
construyendo.
Usar multi-stage builds.
Esta es una práctica un tanto compleja, pero vale la pena saber que existe. Nos permite generar imágenes más
pequeñas incluyendo explícitamente solo aquellos componentes necesarios para ejecutar una aplicación.
Hasta ahora, debés haber visto Dockerfiles que incluyen un solo FROM. En los multi-stage builds, los Dockerfiles
tienen dos o más ocurrencias de FROM. Esto produce varias imágenes etéreas durante el proceso de “build” y nos
permite copiar elementos entre ellas, hasta generar una imagen definitiva con solo aquello estrictamente
necesario para ejecutar la aplicación. En esta práctica, por lo general, se usa una primera imagen de base
(especificada en el primer FROM), en la que copiamos el código fuente de nuestra aplicación y contamos con las
herramientas necesarias para compilarla. Luego, indicamos un segundo FROM dentro del mismo Dockerfile,
haciendo referencia a una imagen de base que tiene solo lo necesario para ejecutar la aplicación, pero no así las
herramientas de compilación. Y copiamos el artefacto generado producto de la compilación en el primer container,
al segundo.
No generar dependencias externas.
Los contenedores que construyamos tienen que ser trasladables. No importa en dónde corran, deben poder contar
con todo lo necesario para ejecutar las aplicaciones que viven en ellos. Es natural que los desarrolladores se sientan
tentados a montar directorios del equipo en el que desarrollan dentro de un container para así acelerar el ciclo de
desarrollo. En lugar de tener que compilar la imagen cada vez que desean probar su aplicación y copiar los artefactos
necesarios dentro de ella, es más sencillo mapear un directorio local y dejar allí los componentes actualizados. Esta
práctica puede llevar a que, a la hora de correr las aplicaciones en producción, haya dependencias no resueltas. De
modo que, contrario a lo que se especifica aquí: https://docs.docker.com/develop/dev-best-practices/#differences-
in-development-and-production-environments, recomendamos que no utilices volúmenes de tipo bind en los
ambientes de desarrollo.
Concatenar comandos.
Muchas veces nos vamos a encontrar con líneas como esta en Dockerfiles:
RUN apt-get update && apt-get upgrade -y
En lugar de algo como:
RUN apt-get update
RUN apt-get upgrade -y
¿Por qué? Cada línea en un Dockerfile produce una nueva capa en nuestra imagen. De modo que ejecutar estos dos
comandos por separado, produciría dos capas. En este caso, ambos comandos sirven al mismo propósito: actualizar
los paquetes instalados en el sistema operativo. Por eso, tiene sentido concatenarlos, ya que están estrechamente
relacionados, y ejecutar uno sin ejecutar el otro no tendría sentido. De esta manera, optimizamos el uso de recursos
y tiempo de compilación.
Podés encontrar más información al respecto de esta práctica en: https://docs.docker.com/develop/dev-best-
practices/#how-to-keep-your-images-small.
Cloud Computing, una mirada holística e integradora.
“La nube proporciona servicio a empresas de todos los tamaños... la nube es para todo el mundo”
Ventajas:
● Reduce el costo operativo y aumenta la productividad del desarrollador.
● Se reducen los costos operativos porque se puede pagar por el tiempo de procesamiento en la nube según sea
necesario, en lugar de ejecutar y gestionar sus propios servidores todo el tiempo.
Desventajas:
● Los proyectos de nube tienen restricciones estrictas en cuanto a la interacción con sus elementos. Lo cual -a su
vez- determina el grado de flexibilidad y personalización de sus propios sistemas.
● La decisión de cambiar de proveedor implica un costo de actualización de los sistemas para cumplir con las
especificaciones de la nueva empresa.
Servicios que se ofrecen más allá de compute y storage.

Introducción a la nube híbrida.


La nube híbrida es una arquitectura de IT que incorpora cierto grado de gestión, organización y portabilidad de las
cargas de trabajo en dos o más entornos.
Según a quién le consulte, es posible que esos entornos deban incluir lo siguiente:
● Al menos una nube privada y una pública.
● Dos o más nubes privadas.
● Dos o más nubes públicas.
● Un entorno virtual o sin sistema operativo conectado a al menos una nube, ya sea pública o privada.
Funciones de las nubes híbridas.
Todas las nubes híbridas deben poder realizar lo siguiente:
● Conectar varias computadoras a través de una red.
● Consolidar los recursos de IT.
● Escalar horizontalmente e implementar los recursos nuevos con rapidez.
● Poder trasladar las cargas de trabajo entre los entornos.
● Incorporar una sola herramienta de gestión unificada.
● Organizar los procesos con la ayuda de la automatización.
Funcionamiento las nubes híbridas.
La forma en que las nubes públicas y privadas funcionan como parte de una nube híbrida es similar a cómo lo hacen
de forma independiente:
● Una red de área local (LAN), una red de área amplia (WAN), una red privada virtual (VPN) y las interfaces de
programación de aplicaciones (API) conectan varias computadoras entre sí.
● La virtualización, los contenedores o el almacenamiento definido por software extraen los recursos, que pueden
agruparse en lagos de datos.
● El sistema de software de gestión asigna esos recursos a entornos donde las aplicaciones pueden ejecutarse, los
cuales luego se implementan, según se solicite, con la ayuda de un servicio de autenticación.
Las nubes independientes se vuelven híbridas cuando esos entornos se conectan de la forma más sencilla posible.
Esa interconectividad es lo único que permite que las nubes híbridas funcionen, y es por eso que estas nubes son la
base del edge computing. Además, determina la forma en que se trasladan las cargas de trabajo, se unifica la gestión
y se organizan los procesos.
La calidad de las conexiones tiene un efecto directo sobre el funcionamiento de su nube híbrida.
Arquitectura moderna de la nube híbrida.
Las nubes híbridas no necesitan una red amplia de API para trasladar las cargas de trabajo de una nube a otra.
Para diseñar nubes híbridas, los equipos modernos de IT ejecutan el mismo sistema operativo en todos los entornos
de IT, desarrollan e implementan aplicaciones como grupos de servicios pequeños, independientes y sin conexión
directa y gestionan todo con una PaaS unificada.
Si se utiliza el mismo sistema operativo, se extraen todos los requisitos del sistema de hardware, mientras que la
plataforma de organización extrae todos los de las aplicaciones. Esto genera un entorno informático uniforme e
interconectado en el que las aplicaciones pueden trasladarse de un entorno a otro sin tener que mantener un mapa
complejo de las API que falle cada vez que se actualicen las aplicaciones o que cambie de proveedores de nube.
Esta interconectividad permite que los equipos de desarrollo y operaciones trabajen juntos en un modelo de
DevOps, que es un proceso con el cual los equipos trabajan en conjunto en entornos integrados utilizando una
arquitectura de microservicios compatible con los contenedores.
Las nubes híbridas son seguras
Una nube híbrida diseñada, integrada y gestionada de forma correcta puede ser tan segura como una infraestructura
de IT local.
Hay algunos desafíos exclusivos de la seguridad de la nube híbrida como:
● La migración de datos.
● El aumento de la complejidad.
● Mayor superficie de ataque.
La presencia de varios entornos puede constituir una de las defensas más sólidas contra los riesgos de seguridad.
Con todos esos entornos interconectados, las empresas pueden elegir dónde colocar los datos confidenciales en
función de los requisitos, y los equipos de seguridad pueden adoptar de manera uniforme un sistema de
almacenamiento en la nube que sea redundante y pueda aumentar los esfuerzos de recuperación ante desastres.
Conexión de un centro de cómputos a una nube.
Point-to-Site (Punto a Sitio)
Una VPN Point-to-Site nos permite crear una conexión segura a la red virtual desde un equipo cliente individual.
Se establece una conexión de punto a sitio al iniciarla desde el equipo cliente. Esta solución resulta útil para los
teletrabajadores que deseen conectarse a redes virtuales desde una ubicación remota, por ejemplo, desde una casa.
La conexión VPN de punto a sitio también es una solución útil en comparación con la conexión VPN de sitio a sitio
cuando solo necesitan conectarse a la red virtual algunos clientes.
Site-to-Site (Sitio a Sitio)
Una VPN Site-to-Site se usa en las empresas. Las organizaciones con instalaciones en diferentes ubicaciones
geográficas usan esta VPN para conectar la red de una instalación a la red en otra.
Informática en la nube.
Es una tecnología a tener en cuenta.
Existe un consenso generalizado en el sector de que se trata de un nuevo paradigma.
La informática en la nube está cambiando la forma en que utilizamos y gestionamos IT, teniendo repercusión en el
mercado.
Modelo de responsabilidades.
Como ya vimos, en cloud computing lo que hacemos es utilizar recursos de un tercero.
Básicamente nos convertimos en inquilinos de aquel que es propietario de los activos informáticos.
El modelo de responsabilidades es un estándar que nos permite definir diferentes tipos de contratación de los
servicios al dueño de la nube, qué tareas quedan delegadas a la nube y cuáles serán nuestra responsabilidad.

Si miramos el modelo podemos identificar:


● Columnas: centro de cómputos, IaaS, PaaS y SaaS.
● Roles: consumidor y proveedor.
● Cajas que definen un conjunto de tareas, tecnologías y disciplinas con las que ya estamos familiarizados, como
pueden ser: redes, virtualización o middleware.
● Colores que tiñen cada una de ellas, dependiendo la columna en la que nos encontremos.
Los roles: consumidor y proveedor.
Usamos estos dos roles para definir quién es responsable.
En cloud computing se contratan recursos de manera flexible y con interfaces bien definidas —como pueden ser
APIs— para la administración de los mismos por un tercero.
Ese tercero, dueño de la nube o de los centros de cómputos en los que decidamos correr nuestras aplicaciones, es a
quien vamos a llamar proveedor.
Mientras que el consumidor somos nosotros, que decidimos contratar los servicios del proveedor para ejecutar
nuestras aplicaciones en sus centros de cómputos.
Las columnas: centro de cómputos
Cuando se habla de centro de cómputos lo que hacemos es definir de qué tareas nosotros seríamos responsables si
somos quienes alojamos en su totalidad los servicios de tecnologías, es decir que no contratamos los servicios de
ningún proveedor para que albergue o administre nuestros sistemas.
● Pros: Tenemos control total sobre los activos, podemos decidir cómo, para qué, dónde y cuándo los utilizamos.
● Contras: Tenemos responsabilidad total por la salud, utilización y mantenimiento del parque informático. No
podemos escalar de manera flexible.
Las columnas: IaaS (Infrastructure as a Service (infraestructura como servicio)).
En este modelo de responsabilidad, el proveedor nos da la posibilidad de instanciar máquinas virtuales en su centro
de cómputos sin que nosotros tengamos la necesidad de administrar la infraestructura subyacente.
● Pros: Seguimos teniendo control sobre el sistema operativo, un ambiente ideal para instalar aplicaciones legacy.
Nos permite escalar la infraestructura de forma más dinámica.
● Contras: Seguimos siendo responsables por la administración y salud del sistema operativo y todos los servicios y
aplicaciones que se ejecuten encima de este.
Las columnas: PaaS (Platform as a Service (plataforma como servicio)).
En este modelo de responsabilidad, el proveedor nos ofrece una tecnología específica, expuesta por medio de
interfaces definidas, ya sean gráficas o APIs, y nos abstrae de toda la gestión de los recursos subyacentes.
● Pros: Nos abstraemos de la administración de los recursos de las capas inferiores. Delegamos en el proveedor la
gestión, monitoreo y escalabilidad de la tecnología. Nos permite enfocarnos en la entrega de valor.
● Contras: Tiende a ser una opción costosa, ya que nos abstrae de todo el músculo requerido para administración y
monitoreo de la infraestructura subyacente. Las configuraciones disponibles están limitadas a aquellas que el
proveedor haya decidido exponer o disponibilizar.
Ejemplo de columna PaaS.
El modelo PaaS tiende a ser difícil de visualizar cuando no tenemos experiencia.
Tomemos un ejemplo para ayudarnos: Amazon DynamoDB.
DynamoDB es una base de datos no estructurada, similar a MongoDB. Pero mientras que si queremos utilizar
MongoDB, debemos instanciar la infraestructura necesaria y luego instalarla; Amazon DynamoDB la podemos
consumir, sencillamente, como un servicio.
¿Qué significa esto?
Que una vez suscrito al servicio mediante el sitio web de Amazon AWS, nos van a proveer:
● Una interfaz web a través de la cual podremos hacer algunas configuraciones del servicio de Dynamo.
● Una API que nos permitirá configurar los mismos parámetros que la interfaz web, pero de manera programática.
● Y una cadena de conexión que utilizaremos en nuestra aplicación para conectarnos contra la base de datos de
Dynamo.
Así no tenemos que instalar ningún recurso. Solo suscribirnos al servicio y la plataforma o tecnología está disponible
para nuestro uso, Internet mediante.
Las columnas: SaaS (Software as a Service (software como servicio).
En este modelo de responsabilidad, el proveedor nos ofrece una aplicación. La mejor manera de entender este
modelo de responsabilidad es pensar en ejemplos: Trello, Salesforce o Gmail son ejemplos de SaaS.
● Pros: Con tan solo una tarjeta de crédito podemos acceder a una aplicación lista para utilizar y resolver una
necesidad. Y sin tener que cubrir el costo de la infraestructura y operación de la misma.
● Contras: Poco a nulo control sobre la configuración del sistema contratado. Dependiendo la flexibilidad de
software puede que tengamos que adaptar nuestros procesos a lo que el software permite hacer. No hay control
sobre las nuevas funcionalidades del sistema y cuándo se liberan.
Máquinas virtuales en la nube.
La computación en la nube es la tecnología informática que más ha crecido en los últimos años.

Gracias a la popularidad creciente de la nube, las empresas recurren cada vez más al uso de máquinas virtuales en la
nube y aplicaciones móviles.
La virtualización no es otra cosa que el proceso de creación —a través de un software o programa especial— de una
versión virtual de algún recurso tecnológico, como un sistema operativo, una plataforma de software o un periférico,
disco de almacenamiento o cualquier otro equipamiento que exista en la vida real.
Con el creciente acceso a Internet en todos los países del mundo, las mayores velocidades de conexión y la cada vez
mayor capacidad de almacenamiento que ofrecen muchas empresas —tanto de forma gratuita como pagando por
servicios especiales— es posible también disponer de máquinas virtuales que funcionarán en la nube.
¿Por qué usar una máquina virtual en la nube?
Por ejemplo, podrías necesitar un servidor conectado las 24 horas a Internet, donde alojes páginas web y servicios
online de venta o distribución de algún producto.
En este caso solo tenés 2 opciones. La primera sería comprar un costoso equipo —o disponer de uno ya existente—
para montar un servidor en tu casa o negocio. Además de tener que comprar dispositivos para conectarlo a Internet
y un plan de datos de alta velocidad, configurarlo, instalar sistemas de seguridad y contra incendios para protegerlo,
comprar e instalar sistemas de respaldo de datos, instalar sistemas de energía por si hay un apagón o, en fin, atender
cualquier problema físico o de configuración característico de la administración de un servidor.
La segunda opción sería contratar un servicio para crear una máquina virtual en la nube, que podría actuar como
servidor y a la cual solo tendrías que subir tus bases de datos y programas usados para operar tus negocios. Además,
esta máquina sería accesible en poco tiempo a partir de la contratación y su mantenimiento quedaría a cargo de la
prestataria del servicio. Microsoft Azure, Amazon Web Services, Google Platform son algunos de los grandes
servicios existentes para crear sistemas virtualizados en la nube.
Casos de uso.
¿Cómo crear una máquina virtual en la nube?
Actualmente hay dos grandes sistemas que ofrecen servicios de máquinas virtuales en la nube, operados por las
gigantes Amazon y Microsoft —que poseen grandes centros de datos en varios países del mundo—.
El sistema de Amazon es parte de su plataforma Amazon Web Services (AWS) y se denomina Amazon Elastic
Compute Cloud (EC2). Este servicio crea y ejecuta máquinas virtuales en la nube a las cuales denomina “instancias”.
Además, ofrece plantillas para que el cliente configure y cree en línea las máquinas que desee, cada una basada en
un sistema operativo, como SUSE Linux, Amazon Linux, Ubuntu y Red Hat, así como Windows Server 2012. Estas
plantillas también incluyen aplicaciones y configuraciones predefinidas de memoria RAM, número de procesadores
virtuales y otros detalles “físicos” de cada máquina a crear.
Microsoft ofrece su plataforma Azure —que es parte de los servicios de su tecnología IaaS (Infraestructure as a
Service)—. Estos servicios incluyen desde la instalación de un servidor web hasta bases de datos y la creación de
máquinas virtuales de cualquier tipo y potencia.
Ventajas de las máquinas virtuales en la nube.
La principal ventaja es la económica, ya que solo tenemos que pagar el servicio a un proveedor y este ofrece
atractivos paquetes diseñados en función de cuántas máquinas queremos tener, cantidad de procesadores, memoria
RAM, espacio en disco duro, entre otras características.
● Menos gasto en hardware: con una máquina virtual en la nube es el proveedor del servicio quien asume el costo
del mantenimiento de los servidores y demás equipos reales requeridos. Así como también del tiempo y costo de
mantener el “hardware virtual” que se configuró según los requerimientos.
● Software actualizado constantemente: el proveedor tendrá siempre actualizado el software usado para configurar
y mantener las máquinas virtuales de los clientes.
● Solo pagamos por el uso: al contratar una máquina virtual en la nube solo pagaremos por el uso que le dan a la
misma y, cuando no la necesitemos, podemos desconectarnos para reducir costos.
● Accesibilidad desde cualquier lugar: no importa dónde nos encontremos, siempre podemos acceder y usar las
máquinas virtuales en la nube desde un equipo que tenga conexión a Internet.
Mayor rapidez de implementación: el costo y tiempo necesario desde que contratamos una máquina virtual hasta
que podemos usarla es mucho menor que lo que tardaríamos en armar y configurar un servicio similar en un equipo
físico en nuestra casa u oficina.
● Menores costos operativos: contratar una máquina virtual en la nube nos evita tener que pagar facturas de
electricidad, sistemas antirrobo, aire acondicionado o calefacción y alquiler del espacio físico o infraestructura donde
se instalarán equipos servidores reales.
● Fiabilidad: la mayoría de las empresas que ofrecen máquinas virtualizadas en la nube operan en centros de datos
muy modernos y equipados con lo mejor en cuanto a conectividad a Internet, abastecimiento eléctrico las 24 horas,
seguridad y, sobre todo, poseen equipos de muy alto nivel y con gran capacidad de almacenamiento de datos.
● Potencia escalable: si lo necesitamos, podemos aumentar o disminuir la potencia de un conjunto de máquinas
virtuales o modificar los parámetros de los servicios que estas requieren. Entre estos cambios tenemos el aumento
de la capacidad de procesamiento de datos, la necesidad de cambiar a un software más adecuado para nuestras
necesidades —pero más exigente en recursos—, un mayor o menor almacenamiento en disco o incluso la asignación
de una máquina virtual más potente para una tarea específica durante un período de tiempo.
Desventajas de las máquinas virtuales en la nube.
● Menor rendimiento: entre una máquina virtual y un equipo anfitrión físico hay una capa de programación que
influye ligeramente en el rendimiento de los programas y sistemas operativos virtualizados. Este problema es mayor
cuando la máquina virtual opera desde la nube porque se agregan más capas entre el hardware real del servidor de
la empresa que presta el servicio de alojamiento y virtualización, el sistema operativo del servidor y el equipo usado
por el cliente que accede a la máquina virtual desde su casa u oficina.
● Su tiempo de respuesta o latencia es mayor: al depender de Internet, como acceso a la máquina virtual, se
enfrentan al problema del lag o retraso en la transmisión de datos y respuesta a cada comando durante las horas del
día en que hay mayor tráfico de datos en las redes. Eso implica que será imposible tener una respuesta instantánea
de parte de la máquina virtual cuando el flujo de Internet esté muy saturado —o si los servidores de la empresa que
maneja la nube tienen mucha carga de trabajo—.
Si vivimos en una zona o país con conexión a Internet lenta o irregular, enfrentaremos el riesgo de llegar a quedar
desconectados de nuestras máquinas virtuales y los datos alojados en ellas durante los momentos en que el servicio
sea más lento o se interrumpa. En muchas ocasiones, esto se resuelve contratando dos o más conexiones con
proveedores distintos, pero a su vez esto implica un mayor gasto económico para los particulares o pequeños
emprendedores. A esto se suma que la transferencia de grandes volúmenes de datos nunca será tan rápida por
Internet como lo sería a través del disco duro de una máquina anfitriona física y una máquina virtual instalada
directamente en ella.
Al depender del acceso a la nube a través de terceros, se corre el riesgo de que los datos del usuario puedan ser
vulnerados por un atacante que logre acceso al sistema del proveedor del servicio de virtualización. En este caso la
seguridad dependerá de la capacidad tecnológica del proveedor, por lo que deberemos confiar que aplique medidas
como instalación de cortafuegos físicos en sus líneas de datos, servicios automatizados de respaldo de datos,
instalación de sus servidores en espacios protegidos contra robos y fuego, entre otras.
Tipos de máquinas virtuales.
De uso general.
Brindan una combinación equilibrada de recursos informáticos, memoria y red.
Son perfectas para aplicaciones que usan estos recursos en partes iguales, como los servidores web y los repositorios
de código.
Informática acelerada.
Se usan aceleradores de hardware, o coprocesadores, para realizar tanto funciones como procesamiento de gráficos
o la búsqueda de coincidencias de patrones de datos.
Optimizadas para almacenamiento.
Creadas para las cargas de trabajo que necesitan acceso a escritura y lectura secuencial alto a conjuntos de datos
muy grandes en el almacenamiento local. Se optimizan para brindar decenas de miles de operaciones.
Optimizadas para la memoria.
Diseñadas con el objetivo de brindar un rendimiento rápido para las cargas de trabajo que procesan grandes
conjuntos de datos en la memoria.
Optimizadas para la informática.
Ideales para las aplicaciones que dependen de los recursos informáticos y se benefician de los procesadores de alto
rendimiento. Funcionan bien con las cargas de trabajo de procesamiento por lotes.
Escalabilidad, tolerancia al fallo y disponibilidad en la nube.
¿Qué es la escalabilidad de la nube?
Se refiere a la capacidad de crecer en capacidad de demanda. Por ejemplo, si tenemos 1000 usuarios y de repente
crecemos a 2000, la capacidad de escalamiento de la nube se refiere a su habilidad para incrementar su capacidad.
Pero no solamente crecer, sino también aumentar su capacidad para ahorrar recursos. A este concepto de crecer y
reducir su tamaño se le llama elasticidad, una infraestructura que permite este comportamiento se denomina
elástica. Cuando se utilizan servicios elásticos, la nube debe ser capaz de realizar cobros en relación con el uso de
estos, de forma que no se realicen cargos por recursos que no se encuentran en uso.
¿Qué es la tolerancia al fallo de la nube?
Cuando un servicio es tolerante a los fallos, es capaz de responder a cierto grado de errores sin dejar de ser
funcional, es decir que tiene la capacidad de solucionar los problemas que existen o reemplazar elementos que no
funcionan de forma correcta por otros que sí lo hacen. Un ejemplo puede ser una red local conectada a un switch de
muchos puertos alámbricos. Si uno de estos puertos falla, la red puede seguir operando con el resto de los puertos
existentes.
¿Qué es la disponibilidad de la nube?
Cuando, por ejemplo, tenemos múltiples recursos y uno de estos falla, pero hay otros que hagan su trabajo,
podemos considerar que existe alta disponibilidad. Si, por el contrario, este recurso es único y no puede ser
reemplazado, se dice que existe una baja disponibilidad.
Proveedores.
Amazon EC2.

Amazon Elastic Compute Cloud (Amazon EC2) es un servicio web que proporciona capacidad informática segura y de
tamaño modificable en la nube. Está diseñado para simplificar el uso de la informática en la nube a escala web para
los desarrolladores. La sencilla interfaz de servicios web de Amazon EC2 permite obtener y configurar capacidad con
una fricción mínima. Proporciona un control completo sobre los recursos informáticos y puede ejecutarse en el
entorno informático acreditado de Amazon.
Amazon EC2 ofrece la plataforma informática más amplia y profunda con elección de procesador, almacenamiento,
red, sistema operativo y modelo de compra. Cuenta con las instancias de GPU más poderosas para la capacitación
de machine learning y las cargas de trabajo gráficas, así como las instancias de costo por inferencia más bajas de la
nube. En AWS se ejecutan más cargas de trabajo de SAP, HPC, machine learning y Windows que en cualquier otra
nube.
Microsoft Azure.

Microsoft Azure brinda soporte para sistemas operativos Windows y Linux, e incluso soporte a Windows Server
2003.
Permite configurar, a través de diversas opciones, la memoria RAM asignada y la CPU que va a tener asociada.
Componentes de una máquina virtual.
Una máquina virtual en Azure tiene diversos componentes:
● Disco virtual: el disco es el que tendrá, por ejemplo, el sistema operativo instalado. Gracias al disco virtual puedo
iniciar el equipo y guardar información en forma persistente.
● Placa de red virtual: al igual que en un equipo físico, es la que me facilitará la conexión con una o más redes.
● Direcciones IP: mediante las que podré conectarme al equipo virtual. Estas direcciones IP pueden ser privadas y
públicas.
● Grupos de seguridad de red: que nos ayudarán a definir desde qué orígenes me puedo conectar y hacia qué
destinos puedo acceder, teniendo en cuenta protocolos, puertos, etc. Los Network Security Groups son una manera
ágil de gestionar los permisos de red para una o más máquinas.
Todos estos componentes son definidos por software. No somos los responsables de mantener los componentes de
bajo nivel que permiten su funcionamiento (hardware).

Microsoft Azure permite parametrizar tres elementos fundamentales:


● El nombre de la máquina virtual: una vez elegido, no se podrá cambiar luego de su creación.
● El sistema operativo: lo que ejecutará como core el equipo virtual. No se puede modificar salvo operaciones
avanzadas sobre la VM.
● El tamaño: a través de tamaños preconfigurados que me brindan diversas opciones de CPU, memoria, cantidad de
discos soportados y calidad de componentes. Se puede cambiar en cualquier momento y a eso se le llama “cambio
vertical” en el hardware virtual. A veces, estos cambios requieren que el equipo se reinicie.
Google Cloud.

Una instancia es una máquina virtual (VM) alojada en la infraestructura de Google. Podemos crear una instancia si
utilizamos Google Cloud Console, la herramienta de línea de comandos de gcloud o la API de Compute Engine.
Las instancias de Compute Engine pueden ejecutar las imágenes públicas de Linux y Windows Server que
proporciona Google, así como las imágenes personalizadas privadas que podemos crear o importar desde nuestros
sistemas existentes. También podemos implementar contenedores de Docker, que se inician de forma automática
en instancias que ejecutan la imagen pública de Container-Optimized OS.
Si usamos un conjunto de tipos predefinidos de máquinas o creamos nuestros propios tipos personalizados de
máquinas, podemos elegir las propiedades de máquina de sus instancias, como la cantidad de CPU virtuales y de
memoria.
Instancias y proyectos.
Cada instancia pertenece a un proyecto de Google Cloud Console y cada proyecto puede tener una o más
instancias. Cuando creamos una instancia en un proyecto, especificamos la zona, el sistema operativo y el tipo de
máquina de esa instancia.
Cuando borramos una instancia, se quita del proyecto.
Instancias y opciones de almacenamiento.
De forma predeterminada, cada instancia de Compute Engine tiene un pequeño disco de arranque persistente que
contiene el sistema operativo. Cuando las aplicaciones que se ejecutan en sus instancias requieren más espacio de
almacenamiento, podemos agregar opciones de almacenamiento adicionales.
Herramientas para gestionar instancias.
Podemos usar diversas herramientas para crear y administrar instancias, como Google Cloud Console, la herramienta
de línea de comandos de gcloud y la API de REST. Si queremos configurar aplicaciones en nuestras instancias, nos
conectamos a la instancia con Secure Shell (SSH) para instancias de Linux o Remote Desktop Protocol (RDP) para
instancias de Windows Server.

También podría gustarte