Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Admin Prac Linux Azure v2
Admin Prac Linux Azure v2
Administración
práctica de Linux en
Azure: segunda edición
Desarrolle, mantenga y automatice aplicaciones en
la plataforma en la nube de Azure
Prólogo i
Requisitos técnicos .................................................................................................... 284
Definición de la administración de la configuración ...................................... 284
Uso de Ansible ..................................................................................................... 285
Instalación de Ansible ............................................................................................... 285
Configuración de SSH ................................................................................................ 286
Configuración mínima indispensable ..................................................................... 287
Archivo de inventario ................................................................................................ 288
Manuales y módulos de Ansible .............................................................................. 289
Autenticación en Microsoft Azure ........................................................................... 292
Grupo de recursos ..................................................................................................... 293
Máquina virtual .......................................................................................................... 294
Administración de inventario de Azure en Ansible ............................................... 296
Uso de Terraform ................................................................................................ 301
Instalación .................................................................................................................. 301
Autenticación en Azure ............................................................................................. 302
Implementación en Azure ........................................................................................ 303
Implementación de una máquina virtual ............................................................... 306
Uso de DSC de PowerShell ................................................................................. 312
DSC de Azure Automation ........................................................................................ 313
Instalación de DSC de PowerShell en Linux ........................................................... 314
Creación de estado deseado .................................................................................... 316
Recursos de DSC de PowerShell ............................................................................... 317
Configuración de invitado de Azure Policy ...................................................... 318
Extensión de configuración de invitado para Linux .............................................. 319
Comandos ................................................................................................................... 320
Otras soluciones ................................................................................................. 322
Resumen .............................................................................................................. 322
Preguntas ............................................................................................................. 323
Lectura adicional ................................................................................................ 324
Capítulo 11: S
olución de problemas y supervisión de sus
cargas de trabajo 417
En esta sección se presenta brevemente al autor, el alcance de este curso, las aptitudes técnicas
que necesitará para empezar y los requisitos de hardware y software necesarios para completar
todas las actividades y ejercicios incluidos.
ii | Prólogo
Frederik Vos, que vive en Purmerend (una ciudad cerca de Ámsterdam en los Países
Bajos), trabaja como entrenador técnico sénior de tecnologías de virtualización, como
Citrix XenServer y VMware vSphere. Se especializa en infraestructuras de centros
de datos (hipervisor, red y almacenamiento) e informática en la nube (CloudStack,
CloudPlatform, OpenStack y Azure). También es instructor y consultor de Linux. Tiene
el conocimiento de un profesor y la experiencia en el mundo real de un administrador
de sistemas. Durante los últimos 3 años, ha trabajado como entrenador y consultor
independiente dentro de ITGilde Cooperation, entregando muchas sesiones de
capacitación de Linux, como la capacitación de Linux en Azure para la Fundación Linux.
Objetivos de aprendizaje
Al final de este curso, será capaz de:
• Conocer los conceptos básicos de la virtualización y la informática en la nube
• Comprender la jerarquía de archivos y montar nuevos sistemas
• Mantener el ciclo de vida de la aplicación en Azure Kubernetes Service
• Administrar recursos con la CLI de Azure y PowerShell
• Administrar usuarios, grupos y permisos del sistema de archivos
• Utilizar Azure Resource Manager para volver a implementar máquinas virtuales
• Implementar la administración de configuración para configurar correctamente
una VM
• Compilar un contenedor con Docker
Público
Si es un administrador de Linux o un profesional de Microsoft que busca implementar
y administrar su carga de trabajo en Azure, este libro es para usted. Aunque no es
necesario, conocer Linux y Azure ayudará a comprender los conceptos básicos.
Enfoque
Este libro proporciona una combinación de conocimientos prácticos y teóricos. Abarca
escenarios del mundo real que demuestran cómo los administradores de Linux trabajan
en la plataforma de Azure. Cada capítulo está diseñado para facilitar la aplicación
práctica de cada habilidad nueva.
iv | Prólogo
Requisitos de hardware
Para una experiencia óptima de estudio, recomendamos esta configuración de hardware:
• Procesador: Intel Core i5 o equivalente
• Memoria: 4 GB de RAM (8 GB preferido)
• Almacenamiento: espacio disponible de 35 GB
Requisitos de software
También se recomienda tener instalado con antelación lo siguiente:
• Un equipo instalado con el sistema operativo Linux, Windows 10 o macOS
• Una conexión a Internet para que pueda conectarse a Azure
Convenciones
Palabras de código en el texto, nombres de la tabla de base de datos, nombres de
carpetas, nombres de archivos, extensiones de archivos, nombres de ruta, direcciones
URL ficticias, entrada del usuario e identificadores de Twitter se muestran como sigue:
“El siguiente fragmento de código crea un grupo de recursos con el nombre MyResource1
y especifica la SKU como Standard_LRS que es la opción de redundancia en este
contexto”.
Este es un bloque de ejemplo de código:
New-AzStorageAccount -Location westus '
-ResourceGroupName MyResource1'
-Name "<NAME>" -SkuName Standard_LRS
En muchos casos, hemos usado los corchetes angulares, <>. Debe reemplazarlos con el
parámetro real y no usar estos corchetes dentro de los comandos.
Virtualización
En informática, la virtualización se refiere a la creación de una forma virtual de un
dispositivo o un recurso, como un servidor, un dispositivo de almacenamiento, una
red o incluso un sistema operativo. El concepto de virtualización apareció en escena
cuando IBM desarrolló sus soluciones de tiempo compartido a finales de la década
de 1960 y comienzos de la década de 1970. El tiempo compartido se refiere al uso
compartido de recursos informáticos entre un grupo grande de usuarios, lo que
aumenta su productividad y elimina la necesidad de comprar un equipo para cada
usuario. Este fue el comienzo de una revolución en la tecnología informática, donde
el costo de comprar equipos nuevos disminuyó significativamente y fue posible para
las organizaciones utilizar los recursos informáticos subutilizados que ya tenían.
Hoy en día, este tipo de virtualización ha evolucionado a la virtualización basada en
contenedores. Las máquinas virtuales tienen su propio sistema operativo, que se
virtualiza sobre un servidor físico; por otro lado, todos los contenedores en una máquina
(ya sea física o virtual) comparten el mismo sistema operativo subyacente. Hablaremos
más sobre los contenedores en el Capítulo 9, Virtualización de contenedores en Azure.
Pasemos rápidamente al año 2001, cuando empresas como VMware introdujeron
otro tipo de virtualización, llamada virtualización de hardware. En su producto,
VMware Workstation, agregaron una capa sobre un sistema operativo existente que
proporcionaba un conjunto de hardware estándar y software integrado, en lugar de
elementos físicos para ejecutar una máquina virtual. Esta capa se conoce como un
hipervisor. Posteriormente, crearon su propio sistema operativo, que se especializaba
en la ejecución de máquinas virtuales: VMware ESXi (antes conocido como ESX).
En 2008, Microsoft ingresó al mercado de virtualización de hardware con el producto
Hyper-V, como un componente opcional de Windows Server 2008.
En la virtualización de hardware, se trata de separar el software del hardware y derribar
los límites tradicionales entre hardware y software. Un hipervisor es responsable de la
asignación de recursos virtuales en recursos físicos.
4 | Exploración de la nube de Microsoft Azure
SDDC
Claro está que, si se puede transformar el hardware en software para procesamiento,
es solo cuestión de tiempo antes de que alguien se dé cuenta de que puede hacer lo
mismo para las redes y el almacenamiento.
En el caso de las redes, todo comenzó con el concepto de conmutadores virtuales. Al
igual que cualquier otra forma de virtualización de hardware, solo se trata de crear un
conmutador de red en software en lugar de hardware.
El Grupo de trabajo de ingeniería de Internet (IETF) comenzó a trabajar en un
proyecto llamado Forwarding and Control Element Separation (separación del
elemento de control y reenvío), que era una interfaz estándar propuesta para
separar el plano de control y el plano de datos. En 2008, la primera implementación
de conmutador real que logró este objetivo se llevó a cabo mediante el protocolo
OpenFlow en la Universidad de Stanford. Las redes definidas por software (SDN)
se asociaron comúnmente con el protocolo OpenFlow.
Conceptos básicos de la informática en la nube | 5
SOA
En el mismo período en que la virtualización de hardware se volvió popular en los
centros de datos y se inició el desarrollo de SDN y SDS, surgió algo nuevo en el mundo
del desarrollo de software para aplicaciones basadas en web: el SOA, que ofrece varios
beneficios. Estos son algunos de los puntos clave:
• Servicios mínimos que pueden comunicarse entre sí, mediante un protocolo
como el Protocolo simple de acceso a objetos (SOAP). En conjunto, ofrecen una
aplicación completa basada en web.
• La ubicación del servicio no importa; el servicio debe conocer la presencia del otro
servicio, y eso es todo.
• Un servicio es una especie de caja negra; el usuario final no necesita saber qué hay
dentro de la caja.
• Cada servicio puede reemplazarse por otro.
Para el usuario final, no importa dónde resida la aplicación o que la formen varios
servicios más pequeños. En cierta manera, es como la virtualización: lo que parece ser
un recurso físico, por ejemplo, un almacenamiento LUN (Número de unidad lógica)
realmente podría incluir varios recursos físicos (dispositivos de almacenamiento) en
varias ubicaciones. Como se mencionó antes, si un servicio conoce la presencia de
otro servicio (que podría estar en otra ubicación), actuarán en conjunto y entregarán la
aplicación. Muchos sitios web con los que interactuamos a diario se basan en el SOA.
El poder de la virtualización en combinación con el SOA le ofrece aún más opciones en
términos de escalabilidad, confiabilidad y disponibilidad.
Hay muchas similitudes entre el modelo de SOA y el de SDDC, pero hay una diferencia:
el SOA tiene que ver con la interacción entre diferentes servicios; el SDDC tiene más
que ver con la entrega de servicios al usuario final.
La implementación moderna del SOA son los microservicios, proporcionados
por entornos de nube como Azure, que se ejecutan de forma independiente o en
contenedores de virtualización como Docker.
Conceptos básicos de la informática en la nube | 7
Servicios en la nube
La palabra mágica es: nube. Un servicio en la nube es cualquier servicio disponible para
organizaciones, empresas o usuarios proporcionado por una solución en la nube o un
proveedor informático, como Microsoft Azure. Los servicios en la nube son apropiados
si desea proporcionar un servicio con las siguientes características:
• Tiene alta disponibilidad y es del tipo “siempre a petición”.
• Se puede administrar a través de autoservicio.
• Tiene escalabilidad, lo que permite a un usuario escalar verticalmente
(lo que hace que el hardware sea más sólido) o escalar horizontalmente
(agregar nodos adicionales).
• Tiene elasticidad: la capacidad de expandir o reducir de forma dinámica la
cantidad de recursos en función de los requisitos empresariales.
• Ofrece una implementación rápida.
• Puede automatizarse y organizarse completamente.
Además de eso, hay servicios en la nube para supervisar sus recursos y nuevos tipos de
opciones de facturación: la mayoría de las veces solo paga por lo que usa.
La tecnología de nube tiene que ver con la entrega de un servicio a través de Internet,
con el fin de proporcionar a una organización acceso a recursos como software,
almacenamiento, red y otros tipos de componentes e infraestructura de TI.
La nube puede ofrecerle muchos tipos de servicios. Los siguientes son los más importantes:
• Infraestructura como servicio (IaaS): una plataforma para hospedar sus máquinas
virtuales. Las máquinas virtuales implementadas en Azure son un buen ejemplo de
este servicio.
• Plataforma como servicio (PaaS): una plataforma para desarrollar, compilar
y ejecutar sus aplicaciones, sin la complejidad de crear y ejecutar su propia
infraestructura. Por ejemplo, está Azure App Service, donde puede insertar
su código y Azure hospedará la infraestructura por usted.
• Software como servicio (SaaS): aplicaciones listas para usar, que se ejecutan en la
nube, como Office 365.
8 | Exploración de la nube de Microsoft Azure
Aunque los servicios mencionados son los pilares clave de la nube, es posible que también
haya escuchado de los siguientes FaaS (Función como servicio), CaaS (Contenedores
como servicio), SECaaS (Seguridad como servicio) y la lista continúa a medida que la
cantidad de ofertas de servicio en la nube aumentan día a día. Function App en Azure sería
un ejemplo de FaaS, Azure Container Service de CaaS y Azure Active Directory de SECaaS.
Tipos de nube
Los servicios en la nube se pueden clasificar en función de su ubicación o de la
plataforma en la que se hospeda el servicio. Como se mencionó en la sección anterior,
en función de la plataforma, podemos clasificar las ofertas de nube como IaaS, PaaS,
SaaS y así sucesivamente. Sin embargo, en función de la ubicación, podemos clasificar
la nube de la siguiente forma:
• Nube pública: todos los servicios son hospedados por un proveedor de servicios.
Azure de Microsoft es una implementación de este tipo.
• Nube privada: su propia nube en su centro de datos. Microsoft desarrolló
recientemente una versión especial de Azure para esto: Azure Stack.
• Nube híbrida: una combinación de una nube pública y una privada. Un ejemplo es
combinar el poder de Azure y Azure Stack, pero también puede pensar en nuevas
opciones de recuperación ante desastres o en trasladar los servicios de su centro
de datos a la nube y viceversa si se necesitan más recursos de forma temporal.
• Nube de comunidad: una nube de comunidad es cuando varias organizaciones trabajan
en la misma plataforma compartida, dado que tienen objetivos o metas similares.
Tener varias regiones también ayuda a cumplir con las leyes y las directivas de seguridad
y privacidad. Se encuentran disponibles información y documentos relacionados con la
seguridad, la privacidad y el cumplimiento a través del Centro de confianza de Microsoft:
https://www.microsoft.com/es-xl/TrustCenter.
Arquitectura de Azure
Microsoft Azure se ejecuta en una versión personalizada, básica y reforzada de Hyper‑V,
también conocida como Hipervisor de Azure.
Por encima de este hipervisor, hay una capa de nube. Esta capa, o tejido, es un clúster
de muchos hosts hospedados en el centro de datos de Microsoft y es responsable de la
implementación, administración y estado de la infraestructura.
Esta capa de nube es administrada por el controlador de tejido, que es responsable de la
administración de los recursos, la escalabilidad, la confiabilidad y la disponibilidad.
Esta capa también proporciona la interfaz de administración a través de una API
compilada en REST, HTTP y XML. Azure Portal y software como la CLI de Azure
proporcionan otra forma de interactuar con el controlador de tejido a través de Azure
Resource Manager.
La siguiente es una representación gráfica de la arquitectura de Azure:
Estos servicios de interfaz de usuario (Azure Portal, PowerShell, CLI de Azure y API)
se comunicarán con el tejido a través de proveedores de recursos. Por ejemplo, si un
usuario desea crear, eliminar o actualizar un recurso informático, este interactuará con el
proveedor de recursos de Microsoft.Compute, que también se conoce como Proveedor
de recursos de Compute (CRP). Asimismo, los recursos de red se comunican a través del
Proveedor de recursos de red (NRP) o el proveedor de recursos de Microsoft.Network
y los recursos de almacenamiento se comunican a través del Proveedor de recursos de
almacenamiento (SRP) o el proveedor de recursos de Microsoft.Storage.
Estos proveedores de recursos crearán los servicios requeridos, por ejemplo, una
máquina virtual.
Azure en su organización
Azure puede ofrecer IaaS: es fácil implementar máquinas virtuales, de forma manual
o automática, y usarlas para desarrollar, probar y hospedar sus aplicaciones. Hay
muchos servicios adicionales disponibles para hacer que su vida como ingeniero
de sistemas sea más fácil, como opciones de copia de seguridad y restauración,
almacenamiento adicional y opciones de disponibilidad. En el caso de las aplicaciones
web, incluso es posible ofrecer el servicio sin crear una máquina virtual.
Por supuesto, Azure también se puede utilizar para soluciones de PaaS. Tal como
IaaS, PaaS incluye todos los componentes de su infraestructura, pero agrega soporte
para el ciclo de vida completo de sus aplicaciones en la nube: compilación, pruebas,
implementación, administración y actualización. También se encuentran disponibles
componentes de la aplicación predefinidos; puede ahorrar tiempo mediante la
transformación de estos componentes junto con su código en el servicio que desea
ofrecer. Los contenedores pueden ser otra parte de su solución de PaaS. Azure
Container Service simplifica la implementación, la administración y las operaciones
en contenedores que usan Kubernetes u otro orquestador, como Mesos.
Si tiene una empresa u organización que desea hospedar una solución SaaS en Azure,
lo puede hacer con AppSource. Incluso puede proporcionar integración con otros
productos de Microsoft, como Office 365 y Dynamics.
En 2017, Microsoft anunció Azure Stack. Puede ejecutar Azure ahora en su centro de
datos o ejecutarlo en un centro de datos del proveedor de servicios que elija para que
proporcione IaaS y PaaS. Esto le brinda el poder de Azure en términos de escalabilidad
y disponibilidad, sin preocuparse de la configuración. Solo necesita agregar más
recursos físicos si es necesario. Además, si lo desea, puede usarlo en una solución
híbrida con Azure público para recuperación ante desastres o cargas de trabajo
coherentes en implementaciones en la nube y en el entorno local.
Azure Stack no es la única opción que puede usar para entornos híbridos. Por ejemplo,
puede conectar su Active Directory local con Azure Active Directory, o usar la
aplicación de Azure Active Directory para proporcionar inicio de sesión único (SSO)
a las aplicaciones web locales y hospedadas.
12 | Exploración de la nube de Microsoft Azure
Resumen
En este capítulo, analizamos la historia de la virtualización y el concepto de la nube,
y explicamos la terminología utilizada en los entornos de nube.
Preguntas | 13
Algunas personas piensan que Microsoft ingresó un poco tarde en el mundo de la nube,
pero en realidad, comenzó a investigar y desarrollar técnicas en 2006, y muchas partes
de ese trabajo sobrevivieron en Azure. Algunos de los proyectos desaparecieron, porque
eran demasiado prematuros y muchas personas eran escépticas con respecto a la nube
en esos días.
También abarcamos la arquitectura de la nube de Azure y los servicios que Azure puede
ofrecerle a su organización.
En la última parte de este capítulo, vimos que Azure es un entorno muy apto para open
source y que Microsoft se esfuerza mucho por hacer que Azure sea una solución de
nube abierta y estándar que tiene en cuenta la interoperabilidad.
En el siguiente capítulo, comenzaremos a usar Azure y aprenderemos cómo
implementar y usar Linux en Azure.
Preguntas
1. ¿Qué componentes de su centro de datos físico se pueden transformar en software?
2. ¿Cuál es la diferencia entre la virtualización de contenedores y la virtualización
de hardware?
3. Si desea hospedar una aplicación en la nube, ¿qué tipo de servicio es la mejor solución?
4. Supongamos que una de sus aplicaciones necesita directivas de privacidad estrictas.
¿Sigue siendo una buena idea usar la tecnología de nube para su organización?
5. ¿Por qué hay tantas regiones disponibles en Azure?
6. ¿Cuál es el propósito de Azure Active Directory?
Lectura adicional
Si desea obtener más información sobre Hyper-V y cómo puede usar Azure junto con
Hyper-V para la recuperación de sitios y la protección de sus cargas de trabajo, consulte
el Manual de Hyper-V en Windows Server 2016, Segunda edición de Packt Publishing.
Hay muchos artículos técnicos geniales sobre la historia de la virtualización, la informática
en la nube y su relación. Uno que realmente nos gustaría mencionar es Formal Discussion
on Relationship between Virtualization and Cloud Computing (Análisis formal sobre la
relación entre la virtualización y la informática en la nube) (ISBN 978-1-4244-9110-0).
No olvide visitar el sitio web de Microsoft y el repositorio de GitHub, como se mencionó
en este capítulo.
Introducción a la
2
nube de Azure
Para dar los primeros pasos en su recorrido a la nube de Azure, es importante completar
todos los ejercicios y examinar los resultados. En este capítulo, usaremos PowerShell
y la CLI de Azure. Puede utilizar el método con el que se sienta cómodo; sin embargo,
aprender ambos sería beneficioso. Los objetivos clave de este capítulo son los siguientes:
• Configurar su cuenta de Azure.
• Iniciar sesión en Azure con la CLI de Azure y PowerShell.
• Interactuar con Azure Resource Manager (ARM) para crear recursos de red
y almacenamiento.
• Comprender las distribuciones de Linux y las distribuciones avaladas por Microsoft.
• Implementar su primera máquina virtual Linux.
Nota
Todo lo que se muestra en este capítulo está probado en macOS, Subsistema de
Windows para Linux y las versiones más recientes de CentOS y openSUSE LEAP.
Requisitos técnicos
Si desea probar todos los ejemplos de este capítulo, necesitará por lo menos un explorador.
Por motivos de estabilidad, es importante utilizar la versión más reciente. Microsoft ofrece
una lista de exploradores compatibles en la documentación oficial de Azure:
• Microsoft Edge (la versión más reciente)
• Internet Explorer 11
• Safari (la versión más reciente, solo Mac)
• Chrome (la versión más reciente)
• Firefox (la versión más reciente)
Puede utilizar la interfaz web y hacer todo gráficamente, o usar Azure Cloud Shell
a través de la interfaz web, que proporciona una interfaz de Bash o PowerShell.
18 | Introducción a la nube de Azure
Nota
Tenga en cuenta que copiar y pegar comandos de este libro podría generar
algunos errores debido a los espacios y las sangrías. Para obtener mejores
resultados, siempre escriba los comandos. Además, esto le ayudará a
acostumbrarse a ellos.
Usemos CentOS/Red Hat Enterprise Linux (RHEL) 7 como un ejemplo para instalar la
CLI de Azure:
1. Importe la clave de GNU Privacy Guard (GPG) del repositorio de Microsoft:
sudo rpm --import \ https://packages.microsoft.com/keys/microsoft.asc
2. Agregue el repositorio:
sudo yum-config-manager --add-repo= \
https://packages.microsoft.com/yumrepos/azure-cli
3. Instale el software:
sudo yum install azure-cli
4. Para instalar la CLI de Azure en un sistema basado en Ubuntu o Debian, utilice
este comando:
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
En macOS, tiene que instalar primero Homebrew, un sistema de administración de
paquetes gratuito y open-source que simplifica la instalación de software open-
source, en su mayoría.
5. Abra una terminal y ejecute lo siguiente:
ruby -e "$(curl -fsSL \
https://raw.githubusercontent.com/Homebrew/install/master/install)"
6. Actualice Homebrew e instale la CLI de Azure:
brew update && brew install azure-cli
7. Después de instalar la CLI de Azure, puede comprobar la versión instalada con
este comando:
az -v
Este comando abrirá un explorador y le solicitará que inicie sesión con su cuenta de
Microsoft. Si recibe un error que indica que el shell no pudo abrir el explorador interactivo,
utilice az login –use-device-code. Este comando generará un código que puede utilizar en
https://www.microsoft.com/devicelogin para completar la autenticación.
20 | Introducción a la nube de Azure
Si esta acción tiene éxito, generará alguna salida en formato JSON relacionada con su
suscripción, por ejemplo, su nombre de usuario:
[
{
"cloudName": "AzureCloud",
"id": "....",
"isDefault": true,
"name": "Pay-As-You-Go",
"state": "Enabled",
"tenantId": "....",
"user": {
"name": "....",
"type": "user"
}
}
]
Para obtener esta información nuevamente, escriba el siguiente código:
az account list
Siempre puede formatear la salida en formatos JSON, JSONC, TABLE o TSV mediante
parámetros adicionales.
El formato JSON (o JSONC, la variante de color) es más fácil de analizar en los lenguajes
de programación y scripting:
La salida de tabla es muy legible, pero es más limitada que la salida predeterminada:
Para obtener una lista de las suscripciones a las que tiene acceso la cuenta en la que se
inició sesión en un formato de tabla, ejecute el siguiente comando:
az account list -o table
Si ya tiene una gran cantidad de recursos o cuentas, será muy difícil revisar toda la
lista. Afortunadamente, existe una forma de examinar a fondo la salida y obtener
solo la información que necesita. Encadenar el comando con el parámetro --query lo
ayudará a hacerlo, mediante un poderoso lenguaje de consulta llamado JMESPATH
(http://jmespath.org). Observe nuevamente la salida JSON del comando az account
list. Esta consulta busca el campo user y la propiedad name.
Volvamos al procedimiento de inicio de sesión. Hacer esto cada vez, una y otra vez,
puede no ser el procedimiento más fácil para el usuario. Una mejor manera de hacerlo
es mediante la creación de una entidad de servicio, también conocida como registro de
aplicación, a fin de proporcionar una credencial para una aplicación específica:
az ad sp create-for-rbac --name <APP_NAME>
22 | Introducción a la nube de Azure
Anote la salida en un bloc de notas, porque usaremos estos valores para la autenticación.
Una entidad de servicio o una aplicación representa un objeto en el inquilino de Azure.
Un inquilino se refiere a una organización, a menudo, señalada como <yourcompany/
yourname>.onmicrosoft.com, que administra y posee una instancia de los servicios en la
nube de Microsoft. Si lo consideramos desde la perspectiva de Azure, todos los servicios
implementados se asociarán a una suscripción y la suscripción se asignará a un inquilino.
Un inquilino puede tener varias suscripciones que hospedan diferentes servicios.
A partir de la salida anterior, obtenemos los siguientes valores:
• appID: el ID de la aplicación es similar al nombre de usuario de la aplicación.
Utilizaremos este ID como el nombre de usuario cuando iniciemos sesión.
• displayName: un nombre descriptivo dado a la aplicación cuando la creamos.
Establecemos el nombre a través del parámetro name.
• name: una URL basada en el nombre que asignamos.
• password: esta es la contraseña de la entidad de servicio que creamos. Cuando
iniciemos sesión, usaremos este valor en el campo de la contraseña.
• tenant: la ID de inquilino. Hablamos de los inquilinos en el párrafo anterior.
Cómo obtener acceso a Azure | 23
Una aplicación que requiere acceso debe estar representada por una entidad de
seguridad. La entidad de seguridad define los permisos y la directiva de acceso para
el usuario o la aplicación en el inquilino. Esto permite la autenticación del usuario o la
aplicación durante el inicio de sesión y la autorización basada en roles durante el acceso
a los recursos. En resumen, puede usar appID para iniciar sesión.
Enumere los roles que se asignan a la appID recién creada:
az role assignment list --assignee <appID> --o table
Vuelva a iniciar sesión con la appID. Puede usar los valores que copió antes para
completar la autenticación:
az login --service-principal --username <appID> --tenant <tenant id>
En lugar de escribir comandos completos con el comando az, también puede abrirlo en
modo shell interactivo:
az interactive
Una de las principales características de este shell es que divide el terminal en dos
ventanas. En la pantalla superior, puede escribir sus comandos. En la pantalla inferior,
obtendrá ayuda mientras escribe los comandos. También hay compatibilidad con la
función de autocompletar para comandos, parámetros y, a menudo, valores de parámetro.
24 | Introducción a la nube de Azure
PowerShell
PowerShell es un lenguaje de scripting desarrollado por Microsoft que se integra en .NET
Framework. Fue diseñado por Jeffrey Snover, Bruce Payette y James Truher en 2006.
PowerShell no solo está disponible para Windows, sino también para Linux y macOS.
Puede encontrar instrucciones detalladas para usar PowerShell con estos sistemas
operativos en el repositorio de GitHub para PowerShell: https://github.com/PowerShell.
Por ejemplo, para instalarlo en RHEL o CentOS, siga estos pasos:
1. Importe la clave de GPG del repositorio de Microsoft si no lo hizo mientras seguía
el procedimiento de instalación de la CLI de Azure:
sudo rpm –import \ https://packages.microsoft.com/keys/microsoft.asc
2. Agregue el repositorio:
sudo yum-config-manager --add-repo= \https://packages.microsoft.com/rhel/7/
prod/
3. Instale el software:
sudo yum install -y powershell
4. Utilice pwsh -v para mostrar la versión instalada.
5. Ingrese en PowerShell:
pwsh
En macOS, necesitará Homebrew y Homebrew Cask. Cask amplía Homebrew para
instalar aplicaciones más grandes y en mayor cantidad:
1. Instale Homebrew Cask:
brew tap caskroom/cask
2. Instale PowerShell:
brew cask install powershell
3. Utilice pwsh -v para mostrar la versión instalada.
4. Para ingresar en PowerShell:
pwsh
Cómo obtener acceso a Azure | 25
Nota
Puede que sea necesario crear la estructura de directorios antes de poder crear
este archivo.
Este abrirá una ventana interactiva del explorador, donde puede usar sus credenciales
para autenticarse. Si el resultado no muestra un ID de inquilino, ejecute este comando:
Get-AzContext -ListAvailable | select Tenant
Nota
Un grupo de recursos se debe crear en una región, también conocida como
ubicación. Tenga en cuenta que puede haber diferencias entre los servicios
ofrecidos en diferentes regiones. Para obtener más información sobre estas
diferencias, visite https://azure.microsoft.com/es-xl/global-infrastructure/services/.
Azure tiene más de 54 regiones. Si una ubicación no está disponible, debe estar en la lista
de permitidos de su cuenta. Para eso, puede ponerse en contacto con el soporte técnico
de Microsoft. Si desea obtener una lista de las ubicaciones disponibles y los proveedores
de recursos compatibles para su cuenta, ejecute el siguiente comando en PowerShell:
Get-AzLocation | Select-Object Location
Nota
Encontrará más información disponible en el sitio web de Microsoft:
https://docs.microsoft.com/es-xl/azure/storage/common/storage-redundancy.
Linux y Azure
Linux está en casi todas partes, en muchos dispositivos diferentes y en muchos
entornos diferentes. Hay muchas variedades distintas y usted elige cuál utilizar.
Entonces, ¿cuál elegir? Hay muchas preguntas y son posibles muchas respuestas
diferentes. Pero algo es seguro: en los entornos corporativos, el soporte es importante.
Distribuciones de Linux
Como se indicó antes, existen muchas distribuciones de Linux diferentes. Pero hay
motivos por los cuales existen tantas opciones:
• Una distribución de Linux es una colección de software. Algunas colecciones tienen
un objetivo específico. Un excelente ejemplo de una distribución de este tipo es
Kali Linux, que es una distribución Linux de prueba de penetración avanzada.
• Linux es un sistema operativo multipropósito. Gracias a la gran cantidad de opciones
de personalización que tenemos para Linux, si no desea un paquete o característica
específicos en su sistema operativo, puede eliminarlos y agregar los suyos. Esta es
una de las principales razones por las que existen tantas distribuciones.
• Open source es darwiniano por naturaleza. A veces, un proyecto se divide, por
ejemplo, porque a otros desarrolladores no les gusta el objetivo del proyecto
o piensan que pueden hacerlo mejor y no se aceptan revisiones del proyecto.
Solo los proyectos más fuertes sobrevivirán.
• Es cuestión de gustos. Diferentes personas tienen diferentes gustos y opiniones.
A algunas personas les gusta el administrador de paquetes apt de Debian. A otras,
puede gustarles la herramienta Zypper de SUSE.
• Otra gran diferencia es que algunas distribuciones son recopiladas y admitidas por
proveedores como Red Hat, SUSE y Canonical, mientras que otras, como Debian,
son impulsadas por la comunidad.
Nota
Visite el sitio web de Microsoft para obtener una lista reciente de distribuciones
y versiones avaladas, además de detalles sobre el soporte disponible para
una distribución:
https://docs.microsoft.com/es-xl/azure/virtual-machines/linux/endorsed-distros
32 | Introducción a la nube de Azure
Imágenes
En nuestro ejemplo, implementamos una máquina virtual con el nombre de imagen
UbuntuLTS. Puede elegir entre varias imágenes de Linux:
• CentOS
• Debian
• RHEL
• UbuntuLTS
• CoreOS
• openSUSE
• SUSE Linux Enterprise
Sin embargo, existen muchas más imágenes ofrecidas por diferentes proveedores,
llamados publicadores.
Obtengamos una lista de estos publicadores. En PowerShell, use este comando:
Get-AzVMImagePublisher -Location <REGION>
34 | Introducción a la nube de Azure
Como puede ver en la siguiente captura de pantalla, Azure tiene muchos publicadores.
Seleccionaremos uno de ellos para la demostración:
La lista es la misma:
Ahora que conoce a los publicadores, puede obtener una lista de las imágenes
proporcionadas por un publicador mediante el siguiente comando:
Get-AzVMImageOffer -Location <REGION> '
-PublisherName <PUBLISHER> | select offer
Seleccionamos Canonical como el publicador y ahora tratamos de obtener la lista de las
ofertas disponibles. UbuntuServer es una de las ofertas. Usaremos esta:
Esta era la última versión disponible en el momento de escribir este capítulo. Si hay
versiones nuevas, es posible que vea otro número de versión.
Como alternativa, en la CLI de Azure, utilice el siguiente comando:
az vm image list --location <REGION> --publisher <PUBLISHER> \
--offer <OFFER> --sku <SKU> --all --query '[].version' \
--output tsv | tail -1
A fin de reducir la salida a la versión más reciente, se agregaron parámetros para
seleccionar la última línea. La información recopilada contiene parámetros para el
cmdlet Set-AzVMSourceImage. Sin embargo, antes de usar este comando, tenemos que
crear una nueva configuración de máquina virtual con New-AzVMConfig:
$vm = New-AzVmConfig -VMName <name> -VMSize "Standard_A1"
Set-AzVMSourceImage -PublisherName <PUBLISHER>'
-Offer <OFFER> -Skus <SKU> -Version <VERSION>
38 | Introducción a la nube de Azure
Por último, estamos creando una nueva máquina virtual con un tamaño Standard_A1
y ordenamos a PowerShell que use la versión de imagen 19.10.201912170 de la
distribución principal 19_10-daily-gen2 en la oferta de UbuntuServer publicada
por Canonical:
Nota
Tanto en Bash como en PowerShell, se puede usar la palabra latest, en lugar de
una versión específica. Sin embargo, la información recopilada no es suficiente
para crear la máquina virtual. Se necesitan más parámetros.
El comando anterior puede parecer un poco complicado, pero es un script práctico para
obtener la lista de IP privadas. Si desea obtener la dirección IP privada de las máquinas
virtuales en un grupo de recursos, puede usar este comando:
Get-AzNetworkInterface -ResourceGroup <resource group name>
40 | Introducción a la nube de Azure
Esto también se puede lograr con la CLI de Azure. Para obtener una lista de las
direcciones IP privadas de las máquinas virtuales, use este comando:
az vm list-ip-addresses --resource <RESOURCE GROUP> --output table
Puede obtener mucha más información sobre las máquinas virtuales implementadas. En
PowerShell, es bastante difícil recibir las propiedades de la máquina virtual. En primer
lugar, cree una variable:
$MYVM=Get-AzVM -Name <VM NAME> -ResourceGroupName <RESOURCE GROUP>
El único problema con esto es que muestra toda la información sobre todas las
máquinas virtuales al mismo tiempo. Afortunadamente, también hay un comando
show, que reduce la salida a una sola máquina virtual:
az vm show --name <VM NAME> --resource-group <RESOURCE GROUP>
Además, es una buena idea limitar la salida mediante el uso de consultas. Por ejemplo,
si desea ver el perfil de almacenamiento de una máquina virtual específica, puede
realizar consultas de la siguiente manera:
az vm show --name <VM NAME> --resource-group <RESOURCE GROUP>\
--query 'storageProfile'
El comando anterior debería mostrarle la siguiente salida:
Conexión a Linux
La máquina virtual se está ejecutando, lista para que inicie sesión de forma remota
con las credenciales (nombre de usuario y contraseña) que proporcionó durante
la implementación de su primera máquina virtual. Otro método más seguro para
conectarse a la máquina virtual Linux es mediante pares de claves SSH. Las claves SSH
son más seguras debido a su complejidad y longitud. Además de esto, Linux en Azure
admite el inicio de sesión con Azure Active Directory (Azure AD), donde los usuarios
podrán autenticarse con sus credenciales de AD.
Inicio de sesión en su máquina virtual Linux con una clave privada SSH
Utilizar un nombre de usuario y una contraseña no es la mejor manera de iniciar sesión en
una máquina remota. No es una operación completamente insegura; aun así, está enviando
su nombre de usuario y contraseña a través de la conexión. También es difícil de usar si
desea ejecutar scripts de forma remota, realizar operaciones de copia de seguridad, etc.
Una forma alternativa y más segura de iniciar sesión en su sistema es mediante pares
de claves SSH. Este es un par de dos claves criptográficamente protegidas: una clave
privada y una pública.
El cliente conserva la clave privada y no debe copiarse a ningún otro equipo. Debe
mantenerse absolutamente en secreto. Se recomienda proteger la clave privada con una
frase de contraseña durante la creación del par de claves.
44 | Introducción a la nube de Azure
Por otro lado, la clave pública se puede copiar en todos los equipos remotos que desee
administrar. Esta clave pública se utiliza para cifrar los mensajes que solo la clave
privada puede descifrar. Cuando intenta iniciar sesión, el servidor comprueba que el
cliente posea la clave privada mediante esta propiedad de funcionar con claves. No se
envía ninguna contraseña a través de la conexión.
Existen varias formas de crear un par de claves SSH. Por ejemplo, PuTTY y MobaXterm
proporcionan herramientas para crearlo. Debe hacerlo desde todas las estaciones de
trabajo que necesitan acceso a la máquina remota. En este libro, utilizamos ssh-keygen,
porque está disponible para cada sistema operativo:
ssh-keygen
Resumen
En este capítulo, se abordaron los primeros pasos en Microsoft Azure. El primer paso
siempre implica crear una cuenta nueva o usar una cuenta existente de la empresa.
Con una cuenta, puede iniciar sesión y comenzar a descubrir la nube de Azure.
En este capítulo, el descubrimiento de la nube de Azure se realizó mediante el comando
az de la CLI de Azure o a través de PowerShell. Mediante los ejemplos, obtuvo información
acerca de lo siguiente:
• El proceso de inicio de sesión de Azure
• Las regiones
• La cuenta de almacenamiento
• Las imágenes proporcionadas por los publicadores
• La creación de máquinas virtuales
• Cómo consultar información vinculada a una máquina virtual
• Qué es Linux y el soporte disponible para las máquinas virtuales Linux
• Cómo acceder a la máquina virtual Linux mediante SSH y un par de claves SSH
El siguiente capítulo comienza aquí, con un nuevo recorrido: el sistema operativo Linux.
Preguntas
1. ¿Cuáles son las ventajas de utilizar la línea de comandos para acceder
a Microsoft Azure?
2. ¿Cuál es el propósito de una cuenta de almacenamiento?
3. ¿Puede pensar en una razón por la que obtendría el siguiente mensaje de error?
Code=StorageAccountAlreadyTaken
Message=The storage account named mystorage is already taken.
4. ¿Cuál es la diferencia entre una oferta y una imagen?
5. ¿Cuál es la diferencia entre una máquina virtual detenida y una desasignada?
6. ¿Cuál es la ventaja de usar la clave SSH privada para la autenticación en su
máquina virtual Linux?
7. El comando az vm create tiene un parámetro --generate-ssh-keys. ¿Qué claves se
crean y dónde se almacenan?
46 | Introducción a la nube de Azure
Lectura adicional
Este capítulo de ninguna manera es un tutorial sobre cómo usar PowerShell. Pero
si desea comprender mejor los ejemplos o desea obtener más información sobre
PowerShell, podemos recomendarle que lea Dominar la creación de scripts en
Windows PowerShell, Segunda edición (ISBN: 9781787126305), de Packt Publishing. Le
sugerimos que comience con el segundo capítulo, Trabajar con PowerShell, y continúe,
al menos, hasta el cuarto capítulo Trabajar con objetos en PowerShell.
Puede encontrar una gran cantidad de documentación en línea sobre cómo usar SSH. Un
buen lugar para comenzar es este wikibook: https://en.wikibooks.org/wiki/OpenSSH.
Si desea explorar más sobre la administración de Linux, el Manual de administración de
Linux de Packt Publishing es un excelente recurso, en especial, para ingenieros de sistemas.
Si desea profundizar en las tareas de seguridad y administración, esta es una
buena lectura: Mastering Linux Security and Hardening (Dominar la seguridad
y el fortalecimiento de Linux) de Donald A. Tevault y publicado por Packt Publishing.
Administración
3
básica de Linux
El shell de Linux
En el capítulo anterior, creamos la VM e iniciamos sesión con SSH, pero ¿cómo
interactuamos con la máquina Linux y le ordenamos realizar tareas? Como
mencionamos al comienzo de este capítulo, usaremos el shell.
Exploraremos el shell de Bash que se utiliza ampliamente, su configuración y uso.
Un shell es una interfaz de usuario en la que puede hacer lo siguiente:
• Interactuar con el kernel, el sistema de archivos y los procesos
• Ejecutar programas, alias e integraciones de shell
Hay muchos shells diferentes disponibles, como el KornShell, Bash y el Z shell (Zsh).
Bash es el shell predeterminado en casi todos los sistemas Linux. Su desarrollo comenzó
en 1988 como un reemplazo para uno de los shells más antiguos: el shell Bourne. Bash
se basó en el shell Bourne y en las lecciones aprendidas de otros shells, como KornShell
y C shell. Bash se ha transformado en el shell más popular y está disponible en muchos
sistemas operativos diferentes, incluido Windows 10, FreeBSD, macOS y Linux.
El shell de Linux | 49
Por último, el Z shell es cada vez más popular. Su desarrollo comenzó en 1990 y se puede
considerar como una extensión de Bash. También existe un modo de compatibilidad
con Bash. Tiene una compatibilidad con la función de autocompletar aún mejor, que
incluye la corrección automática y la expansión más avanzada del nombre de ruta. Su
funcionalidad se puede ampliar con módulos, por ejemplo, para obtener más ayuda con
los comandos. Vale la pena mencionar los proyectos Oh-My-ZSH (https://github.com/
robbyrussell/oh-my-zsh) y Prezto (https://github.com/sorin-ionescu/prezto): estos
proporcionan temas, configuración avanzada y administración de complementos para
hacer que Z shell sea muy fácil de usar. Todas estas características interesantes vienen
con un precio: Z shell definitivamente consume más recursos que Bash.
Ejecución de comandos
Una de las características más importantes de un shell es que puede ejecutar comandos.
Un comando puede ser del siguiente tipo:
• Integrado en el shell (un comando proporcionado por el shell en cuestión)
• Ejecutable en un sistema de archivos
• Alias
Para saber qué tipo de comando está ejecutando, existe el comando type:
type echo
50 | Administración básica de Linux
Aquí, podemos ver que ls es un alias para el comando ls --color=auto con algunos
parámetros agregados. Un alias puede reemplazar un comando existente o crear uno
nuevo. El comando alias sin parámetros le dará alias que ya están configurados:
Por ejemplo, para reemplazar el comando grep con search, ejecute el siguiente comando:
alias search=grep
El alias que está creando se agregará al archivo .bashrc. Si desea eliminar un alias que
creó, puede usar el comando unalias:
unalias <alias name>
Nota
El editor vi se aborda en una próxima sección de este capítulo, Cómo trabajar con
archivos de texto. Por ahora, puede utilizar casi cualquier comando en el modo de
comando, incluidos navigation, yank y put.
El comando set es un comando integrado de Bash que alterna los atributos específicos
de Bash. Sin parámetros, vuelca las variables del entorno.
El shell de Linux | 53
La salida muestra una lista numerada de los comandos utilizados antes. Puede rehacer
un comando de forma sencilla mediante las siguientes opciones:
• !<number>: ejecuta el comando según el número de la lista del historial.
• !<-number>: por ejemplo, !-2 ejecuta el comando que se ejecutó dos comandos
antes del último del historial.
• !<first characters of the command>: esto ejecutará el último elemento que
comienza con este carácter.
• !!: rehace el último comando. Puede combinar esta opción con otros comandos.
Por ejemplo, sudo !!.
Puede realizar una búsqueda retroactiva en el historial con Ctrl + R (modo Emacs) o utilizar
la barra diagonal (modo de comando vi). Se puede explorar con las teclas de flecha.
El archivo del historial no se escribe directamente después de la ejecución de un
comando, sino al final de una sesión de inicio de sesión. Si trabaja en varias sesiones,
puede ser una buena idea escribir el historial de forma directa. Para hacerlo, ejecute
el siguiente comando:
history -a
A fin de leer el historial recién guardado en otra sesión, ejecute el siguiente comando:
history -r
Por lo tanto, cuando guarda el historial borrado, vacía el archivo del historial.
Otra característica interesante de trabajar con el historial es que puede editarlo.
Supongamos que ejecuta el comando ls -alh, pero necesita ls -ltr. Simplemente escriba:
^alh^ltr
54 | Administración básica de Linux
Por supuesto, puede hacer esto para cada entrada en el historial. Por ejemplo, para el
número 6 de la lista del historial, utilice:
!6:s/string/newstring/
A veces, necesita más flexibilidad y quiere editar una línea grande que contiene muchos
errores tipográficos. Ingrese el comando fc. Corrija el comando con lo siguiente:
fc <history number>
Finalización automática
Todo el mundo comete errores tipográficos; nadie puede recordar cada parámetro.
La finalización automática puede evitar muchos errores y le ayuda de muchas maneras
cuando ingresa comandos.
Funciona para lo siguiente:
• Ejecutables
• Alias
• Integraciones de shell
• Programas en el sistema de archivos
• Nombre de archivo
• Parámetros, si la utilidad es compatible con ellos y se encuentra instalado el
paquete bash-completion
• Variables
Si el shell está configurado en modo Emacs, utilice Ctrl + I para activar autocompletar.
Si el shell se configura en modo vi, puede usar también Ctrl + P.
Nota
Si existe más de una posibilidad, debe presionar Ctrl + I o Ctrl + P dos veces.
El shell de Linux | 55
Englobamiento
El englobamiento es expandir un nombre de archivo no específico que contiene un
comodín en uno o más nombres de archivo específicos en el shell de Linux. Otro
nombre común para el englobamiento es expansión del nombre de ruta.
Los siguientes comodines se reconocen en el shell de Bash:
• ?: un solo carácter.
• *: varios caracteres. Tenga en cuenta que, si usa este comodín como el primer
carácter, los nombres de archivo que comiencen con un punto no coincidirán.
Por supuesto, puede usar .*.
• [a-z], [abc]: un carácter del rango.
• {a,b,c}: a o b o c.
Redireccionamientos
En los primeros días de Unix, uno de los desarrolladores, Ken Thompson, definió
una filosofía de Unix, un enfoque basado en la experiencia para hacer que todo sea lo
más modular posible y reutilizar el código y los programas tanto como sea posible.
Particularmente en aquellos días, la reutilización era importante por motivos de
rendimiento y para proporcionar un método que permitiera un fácil mantenimiento
del código.
En una versión de esta filosofía de Unix modificada por Peter H. Salus, los objetivos del
redireccionamiento son los siguientes:
• Escribir programas que hagan algo y lo hagan bien.
• Escribir programas que trabajen en conjunto.
• Escribir programas que manejen secuencias de texto, puesto que es una
interfaz universal.
A fin de hacer posible esta filosofía, se desarrollaron programas con soporte para
descriptores de archivos o, en lenguaje moderno, canales de comunicación. Cada
programa tiene, por lo menos, tres canales de comunicación:
• Entrada estándar (0)
• Salida estándar (1)
• Error estándar (2)
Por ejemplo:
ls | more
A fin de enumerar las variables de entorno para su shell actual, puede usar el comando
env o printenv. printenv también puede mostrar el contenido de una variable específica:
Figura 3.7: Visualización del contenido de una variable específica mediante el comando printenv
El shell de Linux | 59
echo $animal
Para agregar más caracteres al valor, utilice lo siguiente:
animal=$animal,dog
echo $animal
La variable animal solo la conoce su shell actual. Si desea exportarlo a procesos
secundarios, debe exportar la variable:
export animal
Nota
Si utiliza Ubuntu o una distribución similar, pinfo no está instalado de forma
predeterminada. Ejecute apt install pinfo para instalarlo.
El script /etc/bashrc se inicia cada vez que un usuario invoca un shell o un script de
shell. Por motivos de rendimiento, manténgalo lo más mínimo posible. En lugar del
archivo /etc/bashrc, puede utilizar el archivo ~/.bashrc específico del usuario y el
script ~/.bash_logout se ejecuta si sale de un shell. Los archivos de configuración
bashrc a menudo se utilizan para modificar la solicitud (la variable PS1):
DARKGRAY='\e[1;30m'
GREEN='\e[32m'
YELLOW='\e[1;33m'
PS1="\n$GREEN[\w] \n$DARKGRAY(\t$DARKGRAY)-(\u$DARKGRAY)-($YELLOW-> \e[m"
Nota
Si no desea cerrar la sesión e iniciarla nuevamente, puede utilizar el comando
source, por ejemplo, source /etc/environment. De esta manera, las variables se
leerán en su shell actual.
Nota
Si desea reemplazar el comando man con pinfo, le recomendamos crear un alias
con el comando alias man="pinfo -m".
Todas las páginas man siguen una estructura similar y siempre están formateadas
y divididas en secciones:
• Name (Nombre): el nombre del comando y una breve explicación de este. Por
lo general, es una línea. Puede encontrar información detallada en la sección
Description (Descripción) de la página man.
• Synopsis (Sinopsis): información general con todos los parámetros disponibles.
• Description (Descripción): una descripción (larga) del comando, que a veces
incluye su estado. Por ejemplo, la página man del comando ifconfig establece
explícitamente que este comando está obsoleto.
• Options (Opciones): todos los parámetros disponibles de un comando, que a veces
incluyen ejemplos.
• Examples (Ejemplos): si los ejemplos no están en la sección Options, es posible que
haya una sección independiente.
• Files (Archivos): archivos y directorios que son importantes para este comando.
• See also (Consultar también): se refiere a otras páginas man, páginas de
información y otras fuentes de documentación. Algunas páginas man contienen
otras secciones, como notas, errores, historial, autores y licencias.
64 | Administración básica de Linux
Las páginas man son páginas de ayuda que se dividen en varias secciones. Estas
secciones se describen en la sección Description de la página man. Puede usar el
comando man man para obtener más información sobre las secciones. La siguiente
captura de pantalla muestra las diferentes secciones:
Nota
Normalmente, después de instalar un paquete, el índice se actualiza de forma
automática. A veces, es posible que el empaquetador no haya agregado un script
después de la instalación para ejecutar el comando mandb. Se recomienda ejecutar
el comando de forma manual si no puede encontrar la información y está bastante
seguro de que debe ser una página man.
Después de eso, puede usar los comandos apropos o man -k para encontrar la
información que necesita. No importa cuál elija; la sintaxis es la misma:
man -k -s 5 "time"
Nota
Si utiliza Ubuntu o una distribución similar, pinfo no está instalado de forma
predeterminada. Ejecute apt install pinfo para instalarlo.
Otra documentación
Otra fuente de documentación es la documentación proporcionada por el proveedor de
distribución de Linux. Los sitios web de Red Hat, SUSE, Canonical y Debian hospedan
manuales útiles, wikis, etcétera. Pueden ser muy útiles, en especial, para los temas que
son específicos de la distribución, como la administración de software.
Hay dos distribuciones que no son avaladas por Microsoft, Gentoo y Arch Linux,
y tienen excelentes wikis en sus sitios web. Y, por supuesto, parte de la información
de estas wikis es específica de estas distribuciones, pero muchos artículos son útiles
y funcionarán en cada distribución.
Linux Foundation presenta una wiki en https://wiki.linuxfoundation.org con
documentación sobre temas como redes y estándares, como Linux Standard Base
(Base Estándar para Linux, LSB), que se abordará más adelante en este capítulo. Otros
estándares se abordan en freedesktop.org (https://www.freedesktop.org). También son
responsables del sistema init de Linux, systemd y el firewall (firewalld) de Linux. Estos
temas se analizan en el Capítulo 5, Administración avanzada de Linux.
Por último, puede encontrar el Linux Documentation Project en https://www.tldp.org.
Aunque muchos de los documentos que puede encontrar allí son muy antiguos, sigue
siendo un buen punto de partida.
Lectura de texto
En el nivel más fundamental, leer el contenido de un archivo en texto sin formato
significa tomar el contenido de este archivo y redireccionarlo a la salida estándar. El
comando cat es una utilidad que puede hacerlo: concatenar el contenido de uno o más
archivos (u otro canal de entrada) a la salida estándar:
Hay otra utilidad como cat: la utilidad tac. Esta imprime el archivo en orden inverso:
Nota
Tanto more como less están disponibles en cada distribución. Sin embargo, en
algunas distribuciones, more es un alias para less. Utilice el comando type para
realizar la comprobación.
Si desea ver solo un número específico de líneas en la parte superior de un archivo, hay
una utilidad llamada head. De forma predeterminada, muestra las primeras 10 líneas de
un archivo. Puede modificar este comportamiento con el parámetro -n para el número
de líneas y el parámetro -c para el número de bytes/kilobytes.
Cómo trabajar con archivos de texto | 69
Figura 3.12: Uso de las utilidades head y tail para enumerar las primeras y las últimas 10 entradas del archivo
Reconoce los mismos parámetros que head para modificar ese comportamiento. Sin
embargo, hay un parámetro adicional que hace que esta utilidad sea extremadamente útil
para fines de registro. -f anexa la salida a medida que crece el archivo. Es una forma de
seguir y supervisar el contenido de un archivo. El siguiente es un ejemplo muy bien conocido:
sudo tail -f /var/log/messages
Búsquedas en archivos de texto
Es posible que haya escuchado que todo en Linux es un archivo. Además, muchos
aspectos en Linux se administran mediante secuencias de texto y archivos de texto.
Tarde o temprano, tendrá que buscar el texto para realizar modificaciones. Esto se
puede hacer mediante el uso de expresiones regulares. Una expresión regular (regex
para abreviar) es un patrón de caracteres especiales y texto que se utiliza para hacer
coincidir cadenas cuando se realiza una búsqueda. Las expresiones regulares se usan
en muchas aplicaciones con un procesador integrado, como los editores Emacs y vi,
y utilidades como grep, awk y sed. Muchos lenguajes de scripting y programación son
compatibles con las expresiones regulares.
70 | Administración básica de Linux
En este libro, solo trataremos los aspectos básicos de este tema, lo suficiente como para
que pueda usarlos en sus tareas diarias de administración del sistema.
Cada expresión regular se construye en torno a un elemento atom. El elemento atom
identifica qué texto coincidirá y dónde se encontrará cuando se realice una búsqueda.
Podría ser un elemento de un solo carácter conocido (o un punto si no conoce el
carácter), una clase o un rango, como:
Una expresión regular también se puede expresar en forma de una clase abreviada. Aquí
hay algunos ejemplos de clases abreviadas:
Una utilidad que ya mencionamos es la utilidad grep, que se utiliza para buscar en
archivos de texto. Existen varias versiones de esta utilidad. Actualmente, egrep es la
versión más utilizada porque tiene la compatibilidad con expresiones regulares más
completa, incluidos los rangos de abreviatura y el operador de alternancia OR, |.
72 | Administración básica de Linux
También puede revisar la página man para dar un vistazo a las otras opciones.
Aquí hay un ejemplo sencillo de grep:
Otra utilidad muy útil es awk. Ahora, awk es una utilidad creada por los desarrolladores
Alfred Aho, Peter Weinberger y Brian Kernighan. Es un lenguaje de scripting utilizado
para archivos de texto que se usan para generar y manipular archivos de registro
o informes. awk no requiere ninguna compilación, y puede mencionar los campos
requeridos en el informe.
Veamos un ejemplo:
awk -F: '/^root/ {print "Homedir of root:", $6}' /etc/passwd
Nota
Si desea obtener información sobre vi, ejecute el comando vimtutor, un tutorial
incluido con vim. Es un excelente punto de partida para aprender todos los
aspectos básicos de la navegación, los comandos y la edición de texto en vi.
Emacs viene con una excelente función de ayuda a la que puede acceder en Emacs
mediante Ctrl + H + R.
La sintaxis del editor sed es muy similar a los comandos del editor vi y se puede hacer
un script.
El comportamiento predeterminado de sed no es editar el archivo en sí, sino volcar
los cambios en la salida estándar. Puede redirigir esta salida a otro archivo o usar el
parámetro -i, que significa in-place edit (edición en contexto). Este modo cambiará
el contenido del archivo. El siguiente comando es, por lejos, el comando sed más
conocido:
sed -i 's/string/newstring/g' filename.txt
La página info de sed es un excelente recurso para todos los comandos y, lo que es más
importante, tiene una sección de ejemplos si desea saber más.
Vuelva a usar el comando tree para mostrar la estructura del directorio en /usr:
Figura 3.23: Enumeración del tamaño del archivo y el espacio disponible con el comando findmnt -D
80 | Administración básica de Linux
Puede realizar una combinación de estas pruebas. Por ejemplo, para buscar archivos
con nombres de archivo que terminen en conf, utilice lo siguiente:
find /etc -type f -name '*conf'
Para algunas pruebas, como size y atime, se puede agregar un elemento que se
denomina comparación con un parámetro proporcionado:
• +n: mayor que n
• -n: menor que n
• n: exactamente n
En este ejemplo, se buscan directorios con contenido que supere los 100 MB.
El último parámetro es la acción que se debe ejecutar en los archivos que se
encontraron. Algunos ejemplos son:
• -ls, la salida es similar al comando ls.
• -print para imprimir los nombres de archivo.
• -printf para formatear la salida del comando -print.
• -fprintf para escribir la salida formateada en un archivo.
El parámetro -printf puede ser extremadamente útil. Por ejemplo, este comando
buscará archivos y mostrará su tamaño en bytes y el nombre de archivo. Después de
eso, puede usar el comando sort para ordenar los archivos por tamaño:
find /etc -name '*conf' -printf '%s,%p\n' | sort -rn
También hay acciones más peligrosas, como -delete para eliminar los archivos
encontrados y -exec para ejecutar un comando externo. Debe estar muy seguro del
resultado de su acción de búsqueda antes de usar estos parámetros. La mayor parte
del tiempo, en lo que respecta al rendimiento, es mejor utilizar la utilidad xargs.
Esta utilidad toma los resultados y los convierte en argumentos para un comando.
El siguiente es un ejemplo de un comando de este tipo: la utilidad grep se utiliza para
buscar el contenido del resultado:
find /etc/ -name '*' -type f| xargs grep "127.0.0.1"
82 | Administración básica de Linux
Administración de procesos
En la sección anterior, analizamos el sistema de archivos de Linux. Desde la perspectiva
de un administrador del sistema, la administración de los procesos es crucial. Habrá
situaciones en las que deberá iniciar, detener o incluso terminar procesos. Además,
para evitar limitar su máquina, debe tener cuidado con los procesos que se ejecutan
en el sistema. Analicemos con mayor detalle el proceso de administración de Linux.
El kernel de Linux ejecuta los procesos. Este es iniciado por un usuario o creado por
otros procesos. Todos los procesos son procesos secundarios de un proceso principal
y se abordarán en el siguiente capítulo. En esta sección, aprenderemos a identificar los
procesos y cómo enviar una señal a un proceso.
Es posible que vea varios PID devueltos por el shell. Si desea devolver solo un PID, use el
parámetro -s, que significa disparo único:
pidof -s sshd
Administración de procesos | 83
Puede ver todas las propiedades de este proceso. Revisemos algunas de ellas:
• cmdline: el comando que se ejecuta para crear este proceso
• environ: las variables de entorno que están disponibles para este proceso
• status: el estado del archivo, el UID (Identificador de usuario) y el GID
(Identificador de grupo) del usuario/grupo que es propietario del proceso
Si ejecuta cat environ, la salida es difícil de leer porque el carácter de final de línea es
\0 en lugar de \n. Puede solucionar esto con el comando tr para traducir \0 a \n:
cat /proc/$$/environ | tr "\0" "\n"
El directorio proc es muy interesante para solucionar problemas, pero también hay
muchas herramientas que utilizan esta información a fin de producir una salida más
fácil de usar para las personas. Una de estas utilidades es el comando ps. Hay algo
extraño en este comando, admite tres tipos diferentes de parámetros:
• Estilo Unix: precedido por un guion. Los comandos se pueden agrupar. ps -ef es
lo mismo que ps -e -f.
• Estilo BSD: no es precedido por un guion. Los comandos se pueden agrupar. ps ax
es lo mismo que ps a x.
• Estilo GNU: precedido por un guion doble y una opción con nombre largo. Los
comandos no se pueden agrupar.
84 | Administración básica de Linux
El formato de salida para los tres estilos no es el mismo, pero puede modificar el
comportamiento con opciones. A continuación, se muestra una comparación:
Otra utilidad que puede ayudarlo a buscar un proceso es pgrep. Busca en valores como
el nombre y el usuario, y muestra el PID de forma predeterminada. La salida se puede
formatear mediante parámetros como -l para mostrar el nombre del proceso o -o para
agregar el comando completo a la salida.
Una forma interactiva de supervisar los procesos utiliza el comando top:
Los valores en las columnas de un proceso visible en top son los mismos que en ps. En la
página man de top, puede encontrar una explicación apropiada de lo que significan. En
los próximos capítulos, se hablará de algunos de ellos.
El comando top o el comando htop más sofisticado, puede ayudar a identificar
rápidamente procesos que ocupan demasiada memoria o CPU, y enviar una señal al
proceso. Si desea una supervisión del proceso y solución de problemas detalladas
y avanzadas, es mejor usar las herramientas disponibles en Azure. Hablamos de esto
en el Capítulo 11, Solución de problemas y supervisión de sus cargas de trabajo.
Para enviar una señal a un proceso, puede usar el comando top (abreviado k) o kill:
kill -HUP <PID>
Hay una utilidad interesante que puede usar para buscar un proceso o grupo de
procesos con grep, esta envía una señal a la vez: pkill. Es similar a pgrep. Se puede
seleccionar en valores como name y uid.
86 | Administración básica de Linux
Administración de usuarios
Si implementa una VM en Azure, en el asistente especificará un usuario, que la
administración de usuarios del agente de Azure creará en la VM, por ejemplo,
si implementa una VM con PowerShell:
Puede utilizar esta cuenta para iniciar sesión. Es un usuario normal, también llamado
usuario sin privilegios, que no tiene privilegios administrativos. Para adquirir privilegios
administrativos, necesita el comando sudo. sudo significa acción de superusuario
(o actuar como superusuario). Sin parámetros, el comando su cambia su usuario actual
a otro usuario, raíz: la cuenta de administrador en Linux.
Nota
Si desea privilegios raíz, en algunas imágenes de Linux en Azure no puede usar el
comando su. Está desactivado de forma predeterminada. Para obtener un shell
raíz, puede usar sudo -s. De forma predeterminada, el comando sudo le pedirá su
contraseña.
Si desea obtener más información sobre esta cuenta de usuario, utilice el comando
getent para obtener una entidad de la base de datos passwd, donde se almacena la
información del usuario. Esta base de datos passwd puede ser local, estar almacenada en
un archivo /etc/passwd o ser remota, donde un servidor remoto concederá autorización
mediante la comprobación de la base de datos del usuario, Protocolo ligero de acceso
a directorios (LDAP), por ejemplo:
sudo getent passwd <username>
Nota:
El comando chfn (change finger) se refiere a una utilidad antigua, finger, que
no está instalada de forma predeterminada, pero que sigue estando disponible
en los repositorios. También está disponible un demonio finger que hace que
la información de GECOS esté disponible a través de la red, pero se considera un
riesgo para la seguridad.
Administración de grupos
Como se analizó en el capítulo anterior, un usuario formará parte de un grupo principal.
Cuando cree un usuario, si no especifica un grupo, se creará un grupo con el mismo
nombre que el nombre de usuario. Si revisa la captura de pantalla anterior, puede ver
un grupo llamado john para el usuario john.
Además de ser miembro de un grupo principal, se pueden agregar membresías grupales
adicionales. Esto es necesario para obtener acceso a un directorio/recurso compartido
de grupo o para delegar privilegios en la configuración sudo. Puede agregar grupos
adicionales existentes con el parámetro --groups del comando useradd durante la
creación de un usuario, o después con usermod o groupmems.
92 | Administración básica de Linux
Opcionalmente:
sudo usermod –aG staff student
sudo groupmems -g staff -l
sudo getent group staff
Puede cambiar su grupo principal temporalmente con switch group (sg):
su student
id -g
sg staff
Nota:
No es muy común, pero puede agregar una contraseña a una cuenta de grupo
con el comando gpasswd. De esta manera, un usuario que no es miembro de este
grupo todavía puede usar sg e ingresar la contraseña para el grupo.
También hay un parámetro terminate-user que puede ser útil si hay varios usuarios en
una sesión.
Resumen
Este capítulo fue una especie de curso intensivo sobre cómo sobrevivir en Linux si
no está familiarizado con el sistema operativo. En él no se pretendía enseñar cómo
transformarse en un administrador sénior de Linux.
En su vida cotidiana como administrador de Azure, es posible que no utilice todos los
pasos que se indican en este capítulo. Por ejemplo, puede que no cree usuarios en una
VM. Sin embargo, debe ser capaz de comprobar a los usuarios configurados en un sistema
de administración de identidades, como AD, y comprobar que pueden iniciar sesión.
En este capítulo, se abordó el uso de shells, la estructura del sistema de archivos
y la búsqueda de archivos. Analizamos el rol de los archivos de texto en Linux
y cómo procesarlos y editarlos. Trabajamos con procesos y abordamos cómo
verlos y terminarlos. Y, por último, pero no menos importante, analizamos la
administración de usuarios y grupos.
En el próximo capítulo, analizaremos la administración de recursos en Azure.
Preguntas | 95
Preguntas
En este capítulo, en lugar de responder algunas preguntas, quiero que haga un ejercicio:
1. Cree los usuarios Lisa, John, Karel y Carola.
2. Configure la contraseña welc0meITG para estos usuarios.
3. Compruebe la existencia de estos usuarios.
4. Cree los grupos finance y staff.
5. Haga que Lisa y Carola sean miembros de finance, y Karel y John miembros de staff.
6. Cree los directorios /home/staff y /home/finance y establezca la propiedad del
grupo de estos directorios en staff y home, respectivamente.
7. Otorgue al grupo “staff” acceso de lectura al directorio “finance”.
8. Asegúrese de que los archivos recién creados reciban la propiedad y los permisos
correctos del grupo.
Lectura adicional
Hay muchos libros que se publican para los usuarios que usan el sistema operativo
Linux por primera vez. Estos son algunos de mis favoritos:
Working with Linux - Quick Hacks for the Command Line (Trabajar con Linux: trucos
rápidos para la línea de comandos) (ISBN 978-1787129184) de Petru Işfan y Bogdan
Vaida es una colección curiosa de consejos y trucos interesantes y, a veces, eso es
todo lo que necesita.
Si puede leer en alemán, todos los libros de Michael Kofler (https://kofler.info) deberían
estar en su biblioteca, aunque usted sea un usuario experimentado de Linux.
El sitio web de Microsoft tiene documentación muy buena sobre las expresiones
regulares: https://docs.microsoft.com/es-xl/dotnet/standard/base-types/
regular-expressions. Y me gusta http://regexone.com si desea practicar el uso de
las expresiones regulares.
La utilidad awk tiene un gran manual (https://www.gnu.org/software/gawk/manual/
gawk.html), pero quizá no es lo más apropiado para comenzar. Shiwang Kalkhanda
realizó un trabajo muy bueno en Learning AWK Programming (Aprender programación
de AWK) (ISBN 978-1788391030), con un libro muy fácil de leer. No se asuste con
la palabra programación en este título, en especial, si no es un desarrollador. Le
recomiendo leer este libro.
Administración
4
de Azure
En el Capítulo 2, Introducción a la nube de Azure, dimos nuestros primeros pasos en
nuestro viaje al mundo de Azure. Descubrimos que hay muchas formas de administrar
un entorno de Azure y que estas incluyen Azure Portal y las interfaces de línea de
comandos. Puede usar las interfaces de línea de comandos dentro de Azure Portal para
ejecutarlas en la estación de trabajo. Más adelante en este libro, veremos que hay otras
excelentes posibilidades mediante soluciones de automatización y orquestación. Al final
del Capítulo 3, Administración básica de Linux, creamos una VM de Linux y exploramos
los aspectos básicos del entorno de Linux.
Antes de continuar nuestro viaje y abordar temas más avanzados, en este capítulo, se
tratan los componentes de la infraestructura de Azure que se necesitan para nuestras
cargas de trabajo, VM y contenedores. Analizamos el sistema de archivos en Linux, pero
¿cómo agregaremos más discos de datos a la VM? Como administrador del sistema,
es posible que deba permitir o denegar el tráfico a la VM en función de sus requisitos
empresariales, pero ¿cómo se puede hacer esto en Azure? Hay escenarios en los que
se necesitan varias interfaces de red conectadas a la VM. ¿Cómo se logrará eso? En esta
sección, se responderá a todas sus preguntas sobre cómo administrar los recursos de
Azure que están relacionados con su VM. Hablamos de componentes que ya hemos
usado en capítulos anteriores, a veces, incluso sin saber que lo hicimos.
98 | Administración de Azure
Básicamente, este capítulo se trata sobre los recursos de Azure. Recuerde que todos
forman parte de un grupo de recursos, un contenedor lógico donde se implementan
y se administran los recursos. Los siguientes son algunos de los temas principales de
este capítulo:
• Administración de recursos de almacenamiento en Azure y diferentes opciones de
almacenamiento disponibles
• Administración de recursos de red en Azure y comprensión de su rol en las VM
• Uso de comandos prácticos en PowerShell y la CLI de Azure para administrar
recursos en Azure
Nota
En este libro, tratamos de ser lo más independientes posibles con respecto a las
interfaces disponibles. Debido a que este capítulo se trata más de la teoría que de
las interfaces, usaremos PowerShell como ejemplo.
Requisitos técnicos
Para este capítulo, se requieren conocimientos básicos de almacenamiento y redes.
En la sección Lectura adicional, puede encontrar algunas sugerencias para prepararse.
No es necesario, pero se recomienda tener al menos una VM en funcionamiento.
De esta manera, no solo podrá crear nuevos recursos en este capítulo, sino también
examinar las propiedades de una VM existente. En esta sección, crearemos una VM
de Ubuntu llamada ubuntu01 en el grupo de recursos chapter4 para los ejemplos.
Defina las variables para el grupo de recursos y la ubicación:
$myRG = "chapter4"
$myLocation = "westus"
$myTestVM = "ubuntu01"
Cree el grupo de recursos:
New-AzResourceGroup -Name $myRG -Location $myLocation
Cree la VM:
New-AzVm '
-ResourceGroupName $myRG '
-Name $myTestVM '
-ImageName UbuntuLTS '
-Location $myLocation '
-VirtualNetworkName "$myTestVM-Vnet" '
-SubnetName $myTestVM-Subnet '
-SecurityGroupName "$myTestVM-NSG" '
-PublicIpAddressName $myTestVM-pip
Por ahora, los parámetros utilizados en este ejemplo no son importantes. Al final de este
capítulo, podrá comprenderlos todos.
No es un requisito real, pero es conveniente tener la utilidad Explorador de Azure
Storage, que está disponible gratis en https://azure.microsoft.com/es-xl/features/
storage-explorer. Esta es una utilidad independiente para instalar en su estación de
trabajo. Esta utilidad le ayudará a cargar, descargar y administrar blobs, archivos, colas
y tablas de Azure. También es compatible con Azure Cosmos DB y Azure Data Lake.
Otra ventaja es que puede acceder a los discos conectados a las VM. El Explorador de
Storage también está disponible como una opción en Azure Portal.
100 | Administración de Azure
Analicemos de forma más detallada cada uno de estos servicios para comprender qué son:
• Blobs de Azure: objetos optimizados para almacenar cantidades masivas de datos
no estructurados, como texto o datos binarios. Con frecuencia se usan a fin de que
los datos estén disponibles para otros recursos, por ejemplo, con el objetivo de
almacenar archivos VHD que se pueden usar para crear discos virtuales. Otro caso
de uso es utilizarlos como almacenamiento para archivos de audio y video. Incluso
es posible hacer que un blob sea de acceso público para transmitir datos.
• Azure Files: Azure Files son recursos compartidos de archivos hospedados en
Azure a los que se puede acceder a través de un Bloque de mensajes del servidor
(SMB) y que se pueden montar en su equipo local. Es posible que se pregunte de
qué forma se diferencian de los recursos compartidos de archivos normales. Aquí
la ventaja adicional es que la URL que se generará incluirá una firma de acceso
compartido (SAS) y se podrá acceder al recurso compartido de archivos desde
cualquier parte del mundo.
• Azure Queue: se utiliza para transmitir mensajes de un recurso a otro, en especial,
para servicios sin servidor, como Azure Web Apps y Functions. También se puede
utilizar a fin de crear un trabajo pendiente para procesar de forma asincrónica.
• Tabla de Azure: esta es para el servicio Azure Cosmos DB.
• Azure Disk: este servicio es para almacenamiento de disco administrado y discos
no administrados.
Administración de los recursos de almacenamiento | 101
Nota
Si tiene una cantidad enorme de datos que desea almacenar en la nube, la carga
puede tardar mucho tiempo. Microsoft tiene un servicio llamado Azure Data Box
Disk, que le permite enviar SSD cifrados a su centro de datos, copiar los datos
y enviarlos de vuelta. Para obtener más información, visite https://docs.microsoft.
com/es-xl/azure/databox/data-box-disk-overview.
Cuentas de almacenamiento
Una cuenta de almacenamiento proporciona un espacio de nombre que es único en
Azure para contener objetos de almacenamiento, como blobs, archivos, tablas y colas,
entre otros. Se necesita una cuenta para acceder al almacenamiento. También define
el tipo de almacenamiento que se está utilizando.
Hay tres tipos diferentes de cuentas de almacenamiento:
• Storage: este tipo de almacenamiento antiguo y obsoleto no admite todas las
características (por ejemplo, no hay opción de archivo). A menudo, es más costoso
que el V2 más reciente.
• StorageV2: este es un tipo más reciente de cuenta de almacenamiento. Admite
todos los tipos de almacenamiento y las características más recientes para blobs,
archivos, colas y tablas.
• BlobStorage: este aún no está obsoleto, pero no hay ninguna razón para seguir
usándolo. El mayor problema con este tipo de cuenta es que no puede almacenar
archivos, como VHD.
Nota
No es necesario crear una cuenta de almacenamiento para los discos administrados.
Sin embargo, si desea almacenar datos de diagnóstico de arranque de VM,
necesitará una. Una cuenta de diagnóstico de arranque es muy útil si las VM se
colocan en un estado en que el arranque no es posible. Los registros almacenados
en esta cuenta se pueden usar para buscar la causa principal del estado de no
arranque de la VM. En el caso de las pruebas, esta no es una opción obligatoria, pero
para las cargas de trabajo de producción, se recomienda habilitar los diagnósticos
de arranque, lo que le ayudará a entender qué salió mal durante un error.
102 | Administración de Azure
Managed Disks
Antes, cuando implementábamos una VM, necesitábamos crear una cuenta de
almacenamiento donde pudiéramos guardar el disco duro virtual (VHD) de la VM.
Más tarde, Microsoft presentó Managed Disks donde simplemente podemos crear un
disco y Microsoft se ocupa de la cuenta de almacenamiento subyacente. Además de
eso, los clientes obtienen ventajas adicionales, como un redimensionamiento fácil, más
opciones de cifrado y un mejor rendimiento.
Cuando crea una VM con un disco administrado, se conectan dos discos a la VM: un
disco del SO y un disco temporal. Todos los discos están en formato VHD. Los datos
almacenados en el disco temporal se borrarán cuando se reinicie la VM, por lo que
Microsoft no recomienda almacenar datos importantes en el disco temporal, puesto
que no es persistente.
También puede agregar discos de datos administrados adicionales. En primer lugar,
cree la configuración del disco:
New-AzDiskConfig -Location <location>'
-DiskSizeGB <size> -OsType Linux -SkuName <sku> '
-CreateOption empty
Veamos cómo crear una configuración de disco de ejemplo con un tamaño de 5 GB
y una redundancia como Standard_LRS:
$diskconfig = New-AzDiskConfig -Location $myLocation '
-DiskSizeGB 5 -OsType Linux -SkuName Standard_LRS '
-CreateOption empty
Ahora, puede crear el disco real:
New-AzDisk -ResourceGroupName <resource group name> '
-DiskName <disk name> -Disk <disk configuration>
Administración de los recursos de almacenamiento | 105
Compruebe el resultado:
$myVM.StorageProfile.DataDisks
Administración de los recursos de almacenamiento | 107
O, lo que es incluso mejor, en lugar de reutilizar las variables, solo consulte toda la
información en una sola línea:
$(Get-AzVM -Name $myTestVM '
-ResourceGroupName $myRG).StorageProfile.DataDisks
Puede ver el nombre, el tamaño y el LUN:
Azure Files
En lugar de agregar discos de datos a una VM, puede usar Azure Files. Si lo recuerda,
hablamos de Azure Files al principio de este capítulo y mencionamos que es diferente
de un recurso compartido de archivos normal. Azure Files es un recurso compartido de
archivos en la nube completamente administrado, al que se puede acceder a través del
Bloque de mensajes del servidor (SMB) y se puede montar en Linux, Windows y macOS.
Azure Files necesita una cuenta de almacenamiento y admite tipos de SKU de
Standard_LRS, Standard_ZRS, Standard_GRS y Standard_ZRS (solo en regiones
seleccionadas). No hay almacenamiento premium ni otros niveles de acceso distintos del
estándar (activo) disponible. (En el momento de escribir este libro, fuentes de Microsoft
afirman que no hay un plazo disponible para la introducción de estas características).
Tenga en cuenta que realmente requerirá el protocolo SMB 3.0 por motivos de
rendimiento. Esto significa que necesita una distribución de Linux reciente, como una
de estas que se mencionan aquí:
• Distribuciones basadas en RHEL 7.5 o superior
• Ubuntu 16.04 o superior
• Debian 9
• SUSE SLE 12 SP3/OpenSUSE LEAP 42.3 o superior
108 | Administración de Azure
Para revisar las propiedades del recurso compartido creado, ejecute el siguiente comando:
(Get-AzStorageShare -Context $mySA.Context).Uri
Administración de los recursos de almacenamiento | 109
Como puede ver en la siguiente captura de pantalla, obtendrá la misma salida con un
poco más de información, lo que no es importante en absoluto para nuestros propósitos:
Tenga en cuenta que no estamos usando el esquema de HTTPS porque CIFS no usa URI.
Azure se encargará de la asignación entre los diferentes esquemas.
Continuemos y montemos el recurso compartido de archivos. Su contraseña y recurso
compartido de archivos de almacenamiento serán diferentes del ejemplo, puesto que el
nombre es único en Azure:
mkdir /mnt/staff
mount -t cifs -o vers=3.0,username=chapter42585,password=.... \
//chapter42585.file.core.windows.net/myshare-01.staff /mnt/staff
110 | Administración de Azure
Blob de Azure
El almacenamiento en Blob de Azure es un servicio de almacenamiento que almacena
datos no estructurados (imágenes, video, audio, datos de copia de seguridad, entre
otros, que no adhieren a un modelo de datos) en la nube como objetos. Blob es un
almacenamiento basado en objetos que puede almacenar cualquier tipo de datos.
Dentro de una cuenta de almacenamiento, puede tener contenedores. Los
contenedores son muy similares a los directorios o carpetas de su equipo. Por ejemplo,
si almacena sus archivos de música favoritos en Azure, puede establecer el nombre
de la cuenta como Música y, dentro de ella, puede crear un contenedor basado en
el género o los artistas, y los archivos de música reales son los blobs. Una cuenta de
almacenamiento puede tener un número ilimitado de contenedores y un contenedor
puede tener un número ilimitado de blobs.
112 | Administración de Azure
Los recursos compartidos de archivos de Azure son una excelente forma de mantener
sus datos fuera de una VM. Pero se basan en archivos, y esa no es la opción más rápida
para cada tipo de datos. Por ejemplo, la transmisión desde Azure Files, si bien es
posible, no funciona muy bien. Cargar archivos muy grandes también puede ser muy
difícil. El almacenamiento en blob es una solución para este problema y escala mucho
mejor: 5 TB para un recurso compartido de archivos de Azure y 500 TB para un solo
contenedor de blobs.
Para poder cargar un blob, primero debe crear un contenedor:
New-AzStorageContainer -Name <container name> '
-Context <context of storage account> -Permission blob
Este es un ejemplo de cómo crear una lista de contenedores:
$myContainer = New-AzStorageContainer '
-Name container01 '
-Context $mySA.context -Permission blob
Red virtual
En Azure, el componente más importante de las redes virtuales es la red virtual o VNet
para abreviar. Una red virtual es crucial, puesto que proporciona un entorno aislado
altamente seguro para que sus VM se ejecuten.
El siguiente proceso podría parecer un poco confuso y extenso, pero la intención aquí
es hacer que entienda el proceso y los comandos. Comencemos con la creación de una
red virtual:
AzVirtualNetwork -Name <vnet name> '
-ResourceGroupName <resource group> -Location <location>'
-AddressPrefix <network>
Entonces, si quisiéramos crear una red virtual con el nombre MyVirtualNetwork y el
espacio de direcciones 10.0.0.0/16, usaríamos lo siguiente:
$myVnet = New-AzVirtualNetwork -Name MyVirtualNetwork '
-ResourceGroupName $myRG -Location $myLocation '
-AddressPrefix "10.0.0.0/16"
La ejecución de la variable que acaba de crear le mostrará todas las propiedades:
El AddressSpace o la dirección es la red que una o más subredes pueden usar. Es posible
agregar espacios de direcciones adicionales.
116 | Administración de Azure
Subredes
Como ya se indicó, una subred se crea en una red virtual. Todo el tráfico entre
diferentes subredes en la misma red se enruta en Azure para que las subredes puedan
comunicarse entre sí. Por supuesto, puede modificar ese comportamiento, por ejemplo,
cuando desee utilizar un equilibrador de carga.
Una vez más, tomaremos el comando más simple posible por la misma razón que para
las redes virtuales:
Add-AzVirtualNetworkSubnetConfig '
-AddressPrefix <subnet> -Name <subnet> '
-VirtualNetwork <vnet>
Para crear una subred con el nombre MySubnet con el grupo de direcciones 10.0.1.0/24,
ejecute el siguiente comando:
$mySubnet = Add-AzVirtualNetworkSubnetConfig '
-AddressPrefix 10.0.1.0/24 -Name MySubnet '
-VirtualNetwork $myVnet
Nota
Es posible que reciba una advertencia de que algunos objetos están obsoletos.
Puede pasarla por alto de forma segura.
Administración de recursos de red | 117
Como puede ver en la captura de pantalla anterior, no usamos la red completa, solo una
parte de ella.
Como alternativa, la comprobación se puede realizar con el siguiente comando:
Get-AzVirtualNetworkSubnetConfig '
-VirtualNetwork $myVnet -Name MySubnet
La salida será exactamente la misma que la captura de pantalla anterior.
La primera dirección IP de la subred es el gateway para el tráfico de red procedente de
la VM. Proporciona lo siguiente:
• Un gateway predeterminado, con Traducción de direcciones de red de origen
(SNAT) para obtener acceso a Internet. Para poder hacerlo, se debe configurar
una dirección IP pública. SNAT le permite enviar el tráfico generado desde su VM
(o cualquier recurso) en la red privada a Internet a través del gateway.
• El servidor DNS, si no está configurado de otro modo.
• El servidor DHCP.
118 | Administración de Azure
Es posible que reciba las mismas advertencias de obsolescencia que vio antes. Puede
pasarlas por alto de nuevo. Conecte el NSG a la red:
$NSGSubnet | Set-AzVirtualNetwork
La salida de este comando estará en JSON y es larga debido a todos los parámetros.
Si observa la salida, verá que NetworkSecurityGroup se menciona como myNSG1, que es
el NSG que creamos:
Priority (Prioridad) de 100 a 4096. Azure crea números más altos y se pueden anular.
Cuanto menor sea el número de prioridad, mayor será la prioridad de la regla.
La salida del comando anterior puede tener demasiada información, lo que es un poco
confuso de interpretar. Para confirmar si se permite el tráfico del puerto 22, filtraremos
la salida con el siguiente comando:
$myNSG | select SecurityRules
$myNSG.SecurityRules
La salida, como se muestra en la siguiente captura de pantalla, comprueba que el puerto
TCP 22 esté abierto para el tráfico entrante. Este puerto tiene una prioridad de 100,
pero dado que es la única regla, eso no importa:
Por lo tanto, es por eso que en la captura de pantalla anterior el campo IpAddress dice
Not Assigned (No asignada).
Para crear la interfaz de red, use el siguiente comando:
$nic = New-AzNetworkInterface -Name myNic '
-ResourceGroupName $myRG -Location $myLocation '
-SubnetId $myVnet.Subnets[0].Id -PublicIpAddressId $pip.Id '
-NetworkSecurityGroupId $myNSG.Id
124 | Administración de Azure
En la salida, como puede ver en la captura de pantalla anterior, se asigna una dirección
IP, que esta vez es 10.0.1.4.
Administración de recursos de proceso | 125
Nota
Azure Container Service y Azure Kubernetes Service también usan todos los
recursos que se mencionan aquí.
Ahora, espero que pueda comprender lo que significa cada uno de estos parámetros y
de qué forma son cruciales para su VM.
126 | Administración de Azure
Perfil de Azure
El perfil de Azure incluye la configuración necesaria para describir su entorno de Azure:
Grupo de recursos
El grupo de recursos se necesita para contener y administrar recursos:
Cuenta de almacenamiento
La cuenta de almacenamiento se necesita si desea almacenar datos fuera de su VM/
contenedor:
Redes virtuales
La red virtual se necesita para la comunicación entre VM/contenedores y la
comunicación con el mundo exterior:
Resumen
Con el conocimiento adquirido en este capítulo, ahora debería comprender mejor los
elementos que encontró en el Capítulo 2, Introducción a la nube de Azure.
En este capítulo, exploramos todos los componentes de Azure que se necesitan antes
de que pueda crear su carga de trabajo en Azure:
• Necesitará una cuenta de almacenamiento para la extensión de diagnóstico de
arranque de la VM.
• Se recomienda tener una cuenta de almacenamiento para almacenar datos fuera
de la VM.
• Los componentes de red son necesarios para poder comunicarse con la VM, habilitar
la comunicación entre sus máquinas y para que la VM pueda conectarse a Internet.
Los pasos que hemos analizado hasta ahora le serán muy útiles para que comprenda los
componentes relacionados con las VM y también cómo se implementa cada uno de esos
componentes en Azure. Comenzamos con las soluciones de almacenamiento de Azure
y, luego, abordamos también las redes. Esperamos que esto le haya dado una idea de
cómo estos componentes se unen para proporcionar la prestación de servicios.
En el próximo capítulo, utilizaremos el conocimiento que obtuvimos en este capítulo
para identificar y configurar los componentes de red y almacenamiento en el sistema
operativo Linux. Además de los temas de red y almacenamiento, exploraremos otras
tareas de administración del sistema, como la administración de software y servicios.
Preguntas | 129
Preguntas
1. ¿Qué recursos se requieren antes de que pueda crear la VM?
2. ¿Qué recursos se recomiendan para una VM?
3. En los ejemplos, se usó varias veces un generador de números aleatorios, ¿por qué?
4. ¿Cuál es el propósito del AddressPrefix en una red?
5. ¿Cuál es el propósito del AddressPrefix en una subred?
6. ¿Cuál es el propósito del NSG?
7. ¿Por qué se necesita la dirección IP pública para comunicarse con el mundo exterior?
8. ¿Cuál es la diferencia entre una dirección IP pública estática y una asignada
dinámicamente?
Lectura adicional
El libro Implementación de soluciones de infraestructura de Microsoft Azure de Microsoft
Press está concebido como una guía de referencia de estudio para el examen 70-533.
Aunque el examen está obsoleto, el contenido sigue siendo una excelente referencia.
Explica cada parte de la infraestructura de Azure en detalle, mediante Azure Portal y las
interfaces de línea de comandos.
Si es la primera vez que trabaja con redes, otro libro recomendado, que también está
escrito como guía de estudio para un examen, es la Comptia Network+ Certification
Guide (Guía de certificación de Comptia Network+) de Glen D. Singh y Rishi
Latchmepersad.
Mucho más antiguo y difícil de leer es el libro TCP/IP Redbook de IBM, disponible
de forma gratuita, (https://www.redbooks.ibm.com/redbooks/pdfs/gg243376.pdf).
Abarca mucho más de lo que necesita saber, pero si le interesa el tema es una lectura
obligatoria. Incluso si no le interesa rendir el examen Cisco ICND1, Neil Anderson grabó
un video en https://www.packtpub.com, que, además de la parte que trata de Cisco,
proporciona una excelente introducción a las redes.
Nota
Tenga en cuenta que el entorno de Azure está cambiando continuamente, en
especial, en lo que se refiere al almacenamiento y las redes. Es importante
validar las fuentes con la documentación disponible en el sitio web de Microsoft.
Probablemente, lo primero que debería revisar es la fecha de publicación.
Administración
5
avanzada de Linux
En el Capítulo 3, Administración básica de Linux, se analizaron algunos comandos
básicos de Linux y aprendió a hallar su camino en el entorno de Linux. Después,
en el Capítulo 4, Administración de Azure, profundizamos en la arquitectura de Azure.
Con el conocimiento obtenido a partir de ambos capítulos, estamos listos para
continuar nuestro viaje en Linux. Vamos a explorar los siguientes temas:
• Administración de software, donde veremos cómo se pueden agregar nuevos
paquetes a una máquina Linux y cómo actualizar los existentes.
• Administración del almacenamiento. En el capítulo anterior, analizamos cómo
conectar discos de datos a la máquina virtual(VM) de Azure, pero ahora
analizaremos la administración de estos discos en Linux.
• Administración de redes. Anteriormente, hablamos sobre cómo agregar una tarjeta
de interfaz de red (NIC) a una VM y cómo se administran los recursos de red en
Azure. En este capítulo, analizaremos cómo se administran estos recursos en Linux.
• Administración del sistema, donde analizaremos cómo administrar los servicios
y los elementos esenciales del sistema.
132 | Administración avanzada de Linux
Requisitos técnicos
Para el propósito de este capítulo, tendrá que implementar una VM de Linux en Azure,
con la distribución de su elección.
En términos de tamaño, necesitará al menos 2 GB de almacenamiento temporal y la
capacidad de agregar un mínimo de tres discos adicionales. Por ejemplo, el tamaño de
VM B2S es un buen punto de partida. En este capítulo, compartí los pasos para sistemas
Ubuntu, Red Hat y SUSE, por lo que puede elegir qué distribución seguir.
Administración de software
En cualquier sistema operativo, es necesario instalar algún software que nos ayude
a hacer el trabajo diario. Por ejemplo, si está escribiendo scripts, es posible que el software
o la aplicación de existencias que se incluye con el sistema operativo no sean suficientes.
En ese caso, instalar software como Visual Studio Code le facilitará el trabajo. Del mismo
modo, en un entorno corporativo, es posible que deba agregar un nuevo software o
incluso actualizar el software existente para satisfacer sus requisitos empresariales.
En los viejos tiempos, instalar software era cuestión de extraer un archivo a un sistema
de archivos. Sin embargo, hubo varios problemas asociados con este enfoque:
• Era difícil quitar el software si los archivos se copiaban en directorios que también
usaba otro software.
• Era difícil actualizar el software; tal vez los archivos todavía estaban en uso o se les
había cambiado el nombre por cualquier motivo.
• Era difícil manejar bibliotecas compartidas.
Es por eso que las distribuciones de Linux inventaron los administradores de software. Con
estos administradores de software, es posible instalar los paquetes y las aplicaciones que
necesitamos para completar nuestras tareas. Estos son algunos administradores de software:
• RPM
• YUM
• DNF
• DPKG
• APT
• ZYpp
Examinemos más de cerca cada uno de estos para entender cómo se pueden usar para
administrar el software en su sistema Linux.
Administración de software | 133
La salida del parámetro -V nos puede informar sobre los cambios que se realizan en el
software instalado. Hagamos un cambio en el archivo sshd_config:
sudo cp /etc/ssh/sshd_config /tmp
Figura 5.3: Las letras S y T indican un cambio en la marca de tiempo y en el tamaño del archivo
Administración de software | 135
En el caso de los archivos de texto, el comando diff puede ayudar a mostrar las
diferencias entre la copia de seguridad que se encuentra en el directorio /tmp y la
configuración en el directorio /etc/ssh:
sudo diff /etc/ssh/sshd_config /tmp/sshd_config
También puede instalar patrones de software; por ejemplo, el grupo o patrón Servidor
de archivo e impresión es una forma muy conveniente de instalar los servidores
de archivos Samba y el Recurso compartido de red (NFS) junto con el servidor de
impresión Cups en lugar de instalar uno a uno los paquetes:
El comando yum usa repositorios para poder realizar toda la administración de software.
Para enumerar los repositorios actualmente configurados, use el siguiente comando:
yum repolist
En la salida anterior, puede observar que en el momento de escribir este libro, solo está
disponible la versión 2.5. Se agregarán más versiones más adelante. Esta es la versión
predeterminada, pero no está habilitada ni está instalada.
Ejecute estos comandos para habilitar e instalar AppStreams:
sudo dnf module enable ruby:2.5
sudo dnf module install ruby
Si vuelve a enumerar AppStreams, se modifica la salida:
Sugerencia: Para saber qué paquetes instala AppStreams, puede usar el siguiente comando:
sudo dnf module info ruby
Nota
Para obtener más información sobre el Administrador de suscripciones, visite
https://access.redhat.com/ecosystem/ccsp/microsoft-azure.
La administración de paquetes DEB se puede hacer con la utilidad dpkg. Al igual que rpm,
la utilidad dpkg ya no se usa para instalar software, aun cuando esa funcionalidad está
disponible. En cambio, se usa el comando apt, que es más avanzado. Sin embargo, es
bueno conocer los conceptos básicos de los comandos de dpkg.
Todos los metadatos van a una base de datos que se puede consultar con dpkg o dpkg-query.
Los parámetros importantes de dpkg-query son los siguientes:
Los repositorios apt tienen el concepto de clases de versión, algunas de las cuales se
muestran aquí:
• oldstable: el software se probó en la versión anterior de una distribución, pero no
se volvió a probar con la actual.
• stable: el software se lanzó oficialmente.
• testing: el software todavía no tiene un estado stable, pero está en curso.
• unstable: el software está en desarrollo, principalmente por parte de
los desarrolladores.
Nota
YUM y DNF también están disponibles en los repositorios de software de SUSE.
Puede usarlos para administrar (limitado a la instalación y eliminación) software en
su sistema local, pero no es por eso que están disponibles. La razón es Kiwi, una
aplicación para crear instaladores e imágenes del sistema operativo.
142 | Administración avanzada de Linux
Hay una opción de búsqueda para buscar un comando, what-provides, pero es muy
limitada. Si no conoce el nombre del paquete, hay una utilidad llamada cnf en su lugar.
Antes de poder usar cnf, deberá instalar scout. De este modo, es posible buscar las
propiedades del paquete:
sudo zypper install scout
Puede agregar repositorios addrepo; por ejemplo, para agregar un repositorio comunitario
para la versión más reciente de PowerShell en LEAP 15.0, ejecute este comando:
sudo zypper addrepo \
https://download.opensuse.org/repositories\
/home:/aaptel:/powershell-stuff/openSUSE_Leap_15.0/\
home:aaptel:powershell-stuff.repo
Nota
SUSE tiene el concepto de repositorios que son o no de confianza. Si un proveedor
no es de confianza, debe agregar el parámetro --from al comando install. También
puede agregar un archivo de configuración a /etc/vendors.d, como se muestra aquí:
[main]
vendors = suse,opensuse,obs://build.suse.de
El proveedor de un paquete se puede encontrar con zypper info.
Redes
En Azure, la configuración de red, como la dirección IP y la configuración de
DNS, se proporciona a través del Protocolo de configuración dinámica de host
(DHCP). La configuración es muy similar a la configuración de máquinas físicas
o VM que se ejecutan en otra plataforma. La diferencia es que Azure proporciona
la configuración y, por lo general, no se debe cambiar.
En esta sección, aprenderá a identificar la configuración de red en Linux y cómo
hacer coincidir esa información con la configuración de Azure que se analizó en el
capítulo anterior.
Redes | 145
Figura 5.15: Uso del comando udevadm info para recuperar información de los dispositivos
En lugar de usar udevadm, también puede llegar al directorio /sys/class/net y ver el
comando cat con los archivos disponibles, pero no se trata de un método muy fácil de
usar y, por lo general, no es necesario hacerlo de esta manera, porque hay utilidades
que analizan toda la información disponible.
La utilidad más importante es el comando ip. Comencemos con la lista de las interfaces
de red disponibles y la información relacionada:
ip link show
146 | Administración avanzada de Linux
Figura 5.16: Uso de ip link show para enumerar las interfaces de red disponibles
Una vez que se enumeran las interfaces de red disponibles, puede ser más específico:
ip link show dev eth0
El significado de todas las marcas de estado, como LOWER_UP, se puede encontrar en
man 7 netdevice.
Identificación de la dirección IP
Una vez que se conoce el nombre de la interfaz de red, se puede usar la utilidad ip
para mostrar la dirección IP configurada en la interfaz de red, tal como aparece en la
siguiente captura de pantalla:
Figura 5.19: Consulta de dispositivo y gateway que se usa para una dirección IP específica
Configuración de la red
Ahora que sabemos identificar la dirección IP de la interfaz y las rutas definidas para la
interfaz, veamos cómo se configuran estas direcciones IP y rutas en el sistema Linux.
El comando ip se usa principalmente para comprobar la configuración. Por lo general,
otro demonio administra la configuración persistente. Las distintas distribuciones
tienen diferentes demonios para administrar la red:
• Las distribuciones RHEL usan NetworkManager.
• En SLE y OpenSUSE LEAP, se usa wicked.
• En Ubuntu 17.10 y versiones posteriores, se usan systemd-networkd y systemd-resolved,
y las versiones anteriores de Ubuntu se basan completamente en el cliente DHCP que
está configurado en los archivos /etc/network/interfaces.d/*cfg.
148 | Administración avanzada de Linux
En Ubuntu, el agente invitado de Linux para Azure crea dos archivos en el directorio
/run/system/network. Uno es un archivo de vínculo denominado 10-netplan-eth0.link
para conservar el nombre del dispositivo, en función de la dirección MAC:
[Match]
MACAddress=00:....
[Link]
Name=eth0
WakeOnLan=off
[Network]
DHCP=ipv4
[DHCP]
UseMTU=true
RouteMetric=100
El demonio wicked lee este archivo y lo usa para la configuración de la red. Del mismo
modo que en Ubuntu, se crean varios archivos si tiene más de una interfaz de red.
El estado de la configuración se puede ver con el comando wicked:
Figura 5.20: Comprobación del estado de la configuración con el comando wicked show
Figura 5.21: Uso del comando nmcli para mostrar la configuración del dispositivo
Nombre de host
El nombre de host actual de la VM se puede encontrar con la utilidad hostnamectl:
El servidor DHCP proporciona el nombre de host en Azure. Para ver el nombre de host
configurado en Azure, puede usar Azure Portal, la CLI de Azure o PowerShell. Como
ejemplo, en PowerShell, use el siguiente comando:
$myvm=Get-AzVM -Name CentOS-01 '
-ResourceGroupName MyResource1
$myvm.OSProfile.ComputerName
En Linux, puede cambiar el nombre de host con la utilidad hostnamectl:
sudo hostnamectl set-hostname <hostname>
sudo systemctl restart waagent #RedHat & SUSE
sudo systemctl restart walinuxagent #Ubuntu
Esto debería cambiar el nombre de host. Si no funciona, compruebe el archivo de
configuración del agente de la VM de Azure Linux, /etc/waagent.conf:
Provisioning.MonitorHostName=y
DNS
La configuración DNS también se proporciona a través del servidor DHCP de Azure.
En Azure, la configuración se conecta a la interfaz de red virtual. Puede verla en Azure
Portal, PowerShell (Get-AZNetworkInterface) o en la CLI de Azure (az vm nic show).
Por supuesto, puede configurar su propia configuración DNS. En PowerShell, declare la
VM e identifique la interfaz de red:
$myvm = Get-AzVM -Name <vm name> '
-ResourceGroupName <resource group>
$nicid = $myvm.NetworkProfile.NetworkInterfaces.Id
El último comando le dará el ID completo de la interfaz de red necesaria; la última
parte de este ID es el nombre de la interfaz. Ahora dejemos la salida y solicitemos
las propiedades de la interfaz:
$nicname = $nicid.split("/")[-1]
$nic = Get-AzNetworkInterface '
-ResourceGroupName <resource group> -Name $nicname
$nic
Si observa el valor de la variable $nic, verá que tiene toda la información necesaria:
El método que usa la CLI de Azure es similar, pero implica menos pasos. Busque el
nombre de la interfaz de red:
nicname=$(az vm nic list \
--resource-group <resource group> \
--vm-name <vm name> --query '[].id' -o tsv | cut –d "/" -f9)
Actualice la configuración DNS:
az network nic update -g MyResource1 --name $nicname \
--dns-servers 9.9.9.9
Y luego compruebe la nueva configuración DNS:
az network nic show --resource-group <resource group> \
--name $nicname --query "dnsSettings"
En la VM Linux, debe renovar la concesión DHCP para recibir la nueva configuración.
Para hacerlo, puede ejecutar systemctl restart NetworkManager en RHEL o dhclient -r
en Ubuntu. La configuración se guarda en el archivo /etc/resolv.conf.
En las distribuciones de Linux que usan la implementación de red de systemd, como
Ubuntu, el archivo /etc/resolv.conf es un vínculo simbólico a un archivo del directorio
/run/systemd/resolve/ y el comando sudo systemd-resolve --status muestra la
configuración actual:
link 2 (eth0)
Current Scopes: DNS
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
DNS Servers: 9.9.9.9
DNS Domain: reddog.microsoft.com
154 | Administración avanzada de Linux
Para probar la configuración DNS, puede usar dig, o bien la utilidad host, que es más
sencilla, como se muestra aquí:
dig www.google.com A
Almacenamiento
En el capítulo anterior, analizamos cómo crear discos y conectarlos a la VM, pero
nuestro trabajo no termina allí. Tenemos que dividir o montar el disco en la máquina
Linux. En esta sección, analizaremos la administración del almacenamiento en Linux.
Hay dos tipos de almacenamiento disponibles en Azure: discos virtuales conectados a la
VM y recursos compartidos de archivos de Azure. Este capítulo abarcará ambos tipos.
Se analizarán los siguientes temas:
• Agregar un disco virtual único a una VM.
• Trabajar con sistemas de archivos.
• Trabajar con varios discos virtuales mediante el software RAID y el Administrador
de discos lógicos (LVM).
Figura 5.24: Uso del comando lsscsi para identificar los dispositivos de bloque
Almacenamiento | 155
El primer disco disponible se denomina Disco A sda—SCSI. Este disco se crea a partir
del disco de imagen usado durante el aprovisionamiento de la VM y también se conoce
como el “disco raíz”. Puede acceder a este disco a través de /dev/sda o de /dev/disk/
azure/root.
Otra forma de identificar el almacenamiento disponible es usar el comando lsblk.
Puede proporcionar más información sobre el contenido del disco:
En este ejemplo hay dos particiones creadas en /dev/sda, sda1 y sda2 (o /dev/disk/
azure/root-part1 y root-part2). El número principal de la segunda columna, 8, significa
que se trata de un dispositivo SCSI; la parte secundaria es solo numeración. La tercera
columna nos dice que el dispositivo no es extraíble, lo que se indica con un 0 (si fuese
extraíble, aparecería un 1), y la quinta columna nos dice que los controladores y las
particiones no son de solo lectura; nuevamente, si aparece un 1 es de solo lectura
y un 0, lectura y escritura.
Hay otro disco disponible, el disco de recursos /dev/sdb (/dev/disk/azure/resource),
que es un disco temporal. Esto significa que los datos no son persistentes y que
desaparecen después de un reinicio y se utilizan para almacenar datos como una página
o un archivo de intercambio. El intercambio es como la memoria virtual en Windows,
que se utiliza cuando la RAM física está llena.
Puede agregar un disco virtual adicional a una VM mediante Azure Portal o a través de
PowerShell. Agreguemos un disco:
1. En primer lugar, declare cómo quiere nombrar el disco y dónde se debe crear:
$resourcegroup = '<resource group>'
$location = '<location>'
$diskname = '<disk name>'
Update-AzVM '
-VM $vm '
-ResourceGroupName $resourcegroup
Almacenamiento | 157
az vm disk attach \
--disk <disk name> \
--vm-name <vm name> \
--resource-group <resource group> \
--lun <lun number>
Nota
LUN es la abreviatura en inglés de “Número de unidad lógica”, un número
o identificador que se usa para etiquetar almacenamiento (en este caso,
almacenamiento virtual), lo que ayudará a los usuarios a distinguir el
almacenamiento. Puede empezar a enumerar desde cero.
Creación de particiones
Antes de poder usar el dispositivo de bloque, tendrá que particionarlo. Hay varias
herramientas disponibles para la creación de particiones y algunas distribuciones
vienen con sus propias utilidades para crear y manipular tablas de particiones.
Por ejemplo, SUSE tiene una en su herramienta de configuración YaST.
En este libro usaremos la utilidad parted. Esto se instala de manera predeterminada
en cada distribución de Linux y puede manejar todos los diseños de partición que se
conocen: msdos, gpt, sun, etc.
Puede usar parted como script en la línea de comandos pero, si no conoce parted,
resulta más sencillo usar el shell interactivo:
parted /dev/sdc
GNU Parted 3.1
Using /dev/sdc
Welcome to GNU Parted! Type 'help' to view a list of commands.
1. El primer paso es mostrar la información disponible con respecto a este
dispositivo:
(parted) print
Error: /dev/sdc: unrecognised disk label
Model: Msft Virtual Disk (scsi)
Disk /dev/sdc: 2147MB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags:
La línea importante aquí es unrecognised disk label. Esto significa que no se
creó ningún diseño de partición. Hoy en día, el diseño más común es Tabla de
particiones de GUID (GPT).
Nota
parted admite la característica de autocompletar después de un signo de
interrogación: presione Ctrl + I dos veces.
Después de la instalación, puede empezar a usar ZFS. Supongamos que agregó tres
discos a una VM. Es buena idea usar RAID 0, porque ofrece un mejor rendimiento
y desempeño que un disco único.
Como primer paso, vamos a crear un grupo con dos discos:
sudo zpool create -f mydata /dev/sdc /dev/sdd
sudo zpool list mydata
sudo zpool status mydata
Ahora, agreguemos el tercer disco para mostrar cómo extender el grupo:
sudo zpool add mydata /dev/sde
sudo zpool list mydata
sudo zpool history mydata
Puede utilizar directamente este grupo o puede crear conjuntos de datos en él para un
control más detallado de características como las cuotas:
sudo zfs create mydata/finance
sudo zfs set quota=5G mydata/finance
sudo zfs list
Por último, pero igual de importante, deberá montar este conjunto de datos para
poder usarlo:
sudo zfs set mountpoint=/home/finance mydata/finance
findmnt /home/finance
Este montaje será persistente en los reinicios.
164 | Administración avanzada de Linux
Supongamos que agregó tres discos a una VM. Es buena idea usar RAID 0 para mejorar
el rendimiento y permitir un mejor desempeño en comparación con el uso de un
disco único.
Como primer paso, cree un sistema de archivos BTRFS con dos discos subyacentes:
sudo mkfs.btrfs -d raid0 -L mydata /dev/sdc /dev/sdd
Por supuesto, puede extender el sistema de archivos con el tercer disco, pero antes de
que pueda hacerlo, tiene que montar el sistema de archivos:
sudo mkdir /srv/mydata
sudo mount LABEL=mydata /srv/mydata
sudo btrfs filesystem show /srv/mydata
Ahora, agregue el tercer disco:
sudo btrfs device add /dev/sde /srv/mydata
sudo btrfs filesystem show /srv/mydata
Almacenamiento | 165
Al igual que ZFS, BTRFS tiene el concepto de conjuntos de datos, pero en BTRFS se
denominan subvolúmenes. Para crear un subvolumen, ejecute el siguiente comando:
sudo btrfs subvolume create /srv/mydata/finance
sudo btrfs subvolume list /srv/mydata
Puede montar un subvolumen independientemente del volumen raíz:
sudo mkdir /home/finance
sudo mount -o subvol=finance LABEL=mydata /home/finance
Puede ver el ID 258 en la salida del comando findmnt:
Nota
En Linux, puede usar archivos de intercambio y particiones de intercambio. No
hay ninguna diferencia en el rendimiento. En Azure, no puede usar particiones
de intercambio. Esto hará que su sistema sea inestable, provocado por el
almacenamiento subyacente.
166 | Administración avanzada de Linux
Compruebe el resultado:
ls -lahR /mnt | grep -i swap
swapon –s
Almacenamiento | 167
Si descubre que no se crea el archivo de intercambio, reinicie la VM. Para hacerlo, use
cualquiera de estos comandos:
shutdown -r now
init 6
Ahora, puede usar este dispositivo y darle formato con un sistema de archivos, como
se muestra aquí:
mkfs.ext4 -L BIGDATA /dev/md127
Stratis
Stratis se introdujo recientemente en RHEL 8 y se usa para crear un grupo de
almacenamiento de varios discos y de varios niveles, para supervisar el grupo
y administrarlo con facilidad y con una cantidad mínima de intervención manual.
No brinda compatibilidad con RAID, pero convierte varios dispositivos de bloque en
un grupo con un sistema de archivos sobre él. Stratis utiliza la tecnología ya existente:
LVM y el sistema de archivos XFS.
Almacenamiento | 169
Supongamos que agregó dos discos de datos a su VM: /dev/sdc y /dev/sdd. Cree el grupo:
sudo stratis pool create stratis01 /dev/sdc /dev/sdd
Para obtener más detalles sobre los discos en el grupo y el uso, ejecute el siguiente comando:
sudo stratis blockdev list
Como puede ver en la siguiente captura de pantalla, obtenemos la misma salida, pero
con más detalles sobre los discos en el grupo y el uso. En la siguiente salida, puede ver
el estado y el nombre del grupo:
Aquí, el almacenamiento se utiliza para los datos, ya que también es posible tener un
disco configurado como memoria caché de lectura/escritura. Stratis forma un sistema
de archivos (que es xfs de forma predeterminada) sobre el grupo recién creado:
sudo stratis filesystem create stratis01 finance
170 | Administración avanzada de Linux
El sistema de archivos tiene la etiqueta finance y es accesible a través del nombre del
dispositivo (/stratis/stratis01/finance) o UUID.
Con esta información, puede montarlo como lo haría con cualquier otro sistema de
archivos, como con los montajes de systemd, tal como lo analizaremos más adelante
en este capítulo.
Después de crear un sistema de archivos, puede crear instantáneas, que son
básicamente copias del sistema de archivos original. Se puede agregar una instantánea
mediante la ejecución de este comando:
sudo stratis filesystem snapshot stratis01 finance finance_snap
systemd
Después de que el kernel de Linux arranca, el primer proceso de Linux comienza el
primer proceso. Este proceso se conoce como un proceso init. En los sistemas Linux
modernos, este proceso es systemd. Observe la siguiente captura de pantalla, donde
se muestra el proceso en ejecución en un formato de árbol:
Las unidades se pueden administrar con la utilidad systemctl. Si desea ver todos los
tipos disponibles, ejecute el siguiente comando:
systemctl --type help
Para enumerar todos los archivos de unidad instalados, use el siguiente comando:
sudo systemctl list-unit-files
Servicios
Las unidades de servicio están ahí para administrar scripts o demonios. Echémosle un
vistazo al servicio SSH:
Nota
Las capturas de pantalla se tomaron en Ubuntu 18.04. Los nombres de los
servicios pueden ser distintos en otras distribuciones.
Con el parámetro status de systemctl, puede ver que la unidad se carga, se habilita en
el arranque y ese es el valor predeterminado. Si no está habilitada, puede hacerlo con
este comando. Esto agregará el servicio a la cadena de inicio automático:
sudo systemctl enable <service name.service>
En la salida, puede ver que el servicio SSH está en ejecución y que se muestran las
últimas entradas del registro:
Para manejar las dependencias, hay varias directivas disponibles; las más importantes
son las siguientes:
• before: la unidad especificada se retrasa hasta que se inicia esta unidad.
• after: la unidad especificada se inicia antes de que se inicie esta unidad.
• requires: si esta unidad está activada, la unidad que aparece aquí también lo
estará. Si se produjo un error en la unidad especificada, esta también presentará
un error.
• wanted: si esta unidad está activada, la unidad que aparece aquí también lo estará.
No hay consecuencias si se produce un error en la unidad especificada.
Nota
Si no especifica before o after, la unidad o las unidades que aparecen (separadas
por comas) se iniciarán al mismo tiempo que se inicia la unidad.
systemd | 175
[Service]
EnvironmentFile=-/etc/sysconfig/ssh
ExecStartPre=/usr/sbin/sshd-gen-keys-start
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/bin/kill -HUP $MAINPID KillMode=process
Restart=always
[Install]
WantedBy=multi-user.target
La mayoría de las opciones que aparecen en la sección Servicio son muy claras; si
no es así, consulte las páginas man de systemd.unit y systemd.service. En la sección
[Install], la directiva WantedBy indica que si habilita este servicio, se volverá parte de
la colección multi-user.target, que se activa en el arranque.
Antes de entrar en los destinos, lo último de lo que hay que hablar es cómo crear
invalidaciones. Las unidades systemd pueden tener muchas directivas distintas
y son muchas las opciones predeterminadas. Para mostrar todas las directivas posibles,
ejecute el siguiente comando:
sudo systemctl show
Revise los cambios con systemctl cat sshd.service. Vuelva a iniciar sesión e intente
guardar algo en el directorio principal.
Nota
Si quiere otro editor para systemctl edit, agregue una variable, SYSTEMD_EDITOR,
al archivo /etc/environment, por ejemplo, SYSTEMD_EDITOR=/usr/bin/vim.
Destinos
Un destino es una colección de unidades. Existen dos tipos de destinos:
• No aislable: una colección normal de unidades; por ejemplo, timers.target, que
contiene todas las tareas programadas.
• Aislable: si ejecuta systemctl isolate <target name.target>, se apagarán todos
los procesos que no forman parte del destino y se iniciarán todos los que sí lo son.
Entre los ejemplos se incluyen las unidades rescue.target y graphical.target.
Tareas programadas
systemd se puede usar para programar tareas. A continuación, se muestra un ejemplo
de un archivo de unidad de temporizador:
[Unit]
Description=Scheduled backup task
[Timer]
OnCalendar=*-*-* 10:00:00
[Install]
WantedBy=timers.target
systemd | 177
[Service]
Type = oneshot
ExecStart = /usr/local/bin/mybackup.sh
Para obtener información sobre las tareas programadas, use el siguiente comando:
sudo systemctl list-timers
Nota
Lea man 7 systemd.time para obtener más información sobre la sintaxis de los
eventos de calendario. Hay una sección especial en esta página man al respecto.
Figura 5.35: Ejecución de una tarea programada al proporcionar la hora del evento
178 | Administración avanzada de Linux
[Mount]
What = /dev/sdc1
Where = /home/finance
Type = xfs
Options = defaults
[Install]
WantedBy = local-fs.target
Use systemctl start home-finance.mount para empezar el montaje y systemctl enable
home-finance.mount para hacer el montaje en el momento del arranque.
Tiene que crear dos archivos. Tomemos como ejemplo un montaje NFS en /home/
finance. En primer lugar, cree /etc/systemd/system/home-finance.mount con el
siguiente contenido:
[Unit]
Description = NFS Finance Share
[Mount]
What = 192.168.122.100:/share
Where = /home/finance
Type = nfs
Options = vers=4.2
Cree un archivo llamado /etc/systemd/system/home-finance.automount:
[Unit]
Description = Automount NFS Finance Share
[Automount]
Where = /home/finance
[Install]
WantedBy = remote-fs.target
Inicie la unidad de montaje automático y no la unidad de montaje. Por supuesto, puede
habilitarla en el arranque.
180 | Administración avanzada de Linux
Resumen
En este capítulo, profundizamos en Linux, explicando las tareas fundamentales
que tiene cada administrador de sistemas Linux: administrar software, la red, el
almacenamiento y los servicios.
Por supuesto, como administrador de sistema de Linux, esto no es algo que vaya a hacer
a diario. Lo más probable es que no lo haga manualmente, sino que lo automatice u
orqueste. Pero para poder orquestarlo, debe entender cómo funciona y tiene que poder
comprobar la configuración y solucionar los problemas relacionados. Esto se analizará
en el Capítulo 8, Exploración de la automatización de la configuración continua.
En el siguiente capítulo, exploraremos las opciones disponibles en Linux que limitan el
acceso al sistema:
• Control de acceso obligatorio
• Listas de control de acceso a la red
• Firewalls
Preguntas
1. ¿Qué es responsable del reconocimiento de hardware?
2. ¿Qué es responsable de la nomenclatura de dispositivos?
3. ¿Cuáles son los métodos para identificar las interfaces de red?
4. ¿Quién mantiene la configuración de red?
5. ¿Cuáles son los métodos para identificar el almacenamiento conectado localmente?
6. ¿Por qué se usa RAID 0 en Azure?
7. ¿Cuáles son las opciones para implementar RAID 0 en Azure?
8. Intente implementar un dispositivo RAID 0 con tres discos y dele formato con XFS.
Móntelo y asegúrese de que se monta en el momento del arranque.
Lectura adicional | 181
Lectura adicional
Por un lado, este capítulo fue una revisión en profundidad, pero hay mucho más
que aprender en relación con todos los temas que se trataron en este capítulo.
Se recomienda leer las páginas man de todos los comandos utilizados.
Para el almacenamiento, además de la documentación que se encuentra en el sitio web
de Azure, algunos sistemas de archivos tienen sus propios sitios web:
• XFS: https://xfs.org
• BTRFS: https://btrfs.wiki.kernel.org
• ZFS: http://open-zfs.org
• Stratis: https://stratis-storage.github.io
Lennart Poettering, uno de los principales desarrolladores de systemd, tiene un muy buen
blog con muchas sugerencias e información general: http://0pointer.net/blog. Y hay más
documentación disponible en https://www.freedesktop.org/wiki/Software/systemd.
Como el comando systemctl status no proporciona información suficiente,
analizaremos más sobre el registro en el Capítulo 11, Solución de problemas y supervisión
de sus cargas de trabajo.
Administración
6
de seguridad
e identidades de Linux
En el capítulo anterior, analizamos el control del almacenamiento, junto con la
administración de redes y procesos. Sin embargo, como administrador del sistema,
su objetivo principal es proteger su máquina Linux para denegar cualquier acceso no
autorizado o limitar el acceso a los usuarios. En un entorno empresarial, las infracciones
de seguridad son una gran preocupación. En este capítulo, hablaremos sobre la seguridad:
la protección de su carga de trabajo en el nivel del sistema operativo; por ejemplo, si su
organización es una institución financiera en la que tratará con cargas de trabajo que se
ocupan de los compromisos monetarios e incluso la información de identificación personal
(PII) de los clientes, resulta fundamental asegurar la carga de trabajo para evitar cualquier
infracción. Por supuesto, Azure ya le proporciona servicios para proteger sus VM de muchas
maneras y en muchos niveles. A continuación, se muestran algunos de estos servicios:
• Azure Resource Manager, que proporciona características de seguridad, auditoría
y etiquetado
• Firewall de aplicaciones web, que protege contra muchos ataques, como la
inyección de código SQL
• La característica de filtrado de paquetes con estado de los grupos de seguridad de red
• Azure Firewall, que proporciona un firewall con estado estrechamente integrado
con las funciones de supervisión de Azure
184 | Administración de seguridad e identidades de Linux
Use la creación de particiones, especialmente para directorios como /tmp, /var, /var/
tmp y /home, y móntelas con las marcas noexec, nodev y nosuid:
• En general, no es buena idea que un usuario pueda ejecutar programas desde
estas ubicaciones. Afortunadamente, si no puede establecer el propietario como
raíz, puede copiar un programa con el bit suid a su propio directorio como
usuario normal.
• Los permisos suid y sgid sobre los archivos de estos directorios son muy peligrosos.
• No permita la creación o la existencia de caracteres o dispositivos especiales en
esta partición.
Para acceder a la VM, use la autenticación basada en claves SSH, no contraseñas. Limite
el acceso a ciertas direcciones IP, mediante ACL o un firewall. Limite a los usuarios y no
permita acceso remoto para la raíz (use el parámetro PermitRootLogin no y AllowUsers
para solo permitir el acceso de una o dos cuentas). Use sudo para ejecutar comandos
como raíz. Tal vez crear usuarios especiales, o grupos de usuarios, para tareas
especiales en la configuración sudo.
No instale demasiado software en una VM, especialmente cuando se trata de servicios
de red, como servidores web y servidores de correo electrónico. Use el comando ss de
vez en cuando para revisar los puertos abiertos y compararlos con las reglas de firewall
o ACL.
Otra sugerencia es no deshabilitar SELinux en su sistema, que es un módulo de
seguridad en el kernel de Linux. No se preocupe por esto ahora, ya que tenemos
una sección dedicada a SELinux.
Mantenga actualizado su sistema; hay una razón por la que los proveedores de
Linux proporcionan actualizaciones. Hágalo manualmente o con una herramienta
de automatización/orquestación. Simplemente, hágalo.
Requisitos técnicos
Para los fines de este capítulo, tendrá que implementar RedHat/CentOS 7 y una VM
Ubuntu 18.04. Otra opción es usar SUSE SLE 12 u openSUSE LEAP en lugar de las VM
CentOS y Ubuntu. SUSE es compatible con todas las opciones que se describen en
este capítulo.
186 | Administración de seguridad e identidades de Linux
DAC
DAC también se conoce como control de acceso dictado por el usuario. Es posible que
ya esté familiarizado con los permisos clásicos en Linux y las ACL. Estos se combinan
para formar DAC. Los permisos clásicos comprueban el ID del usuario (UID) y el ID del
grupo (GID) del proceso actual. Los permisos clásicos hacen coincidir el UID y GID del
usuario que intenta acceder al archivo con el UID y el GID establecidos en el archivo.
Veamos cómo se introdujo DAC y qué nivel de permiso se tiene en Linux. Sin embargo,
no analizaremos esto en detalle, ya que la intención principal es familiarizarnos con los
permisos en Linux.
Introducción a DAC
La mayoría de los sistemas operativos, como Linux, macOS, variedades de Unix e incluso
Windows, se basan en DAC. MAC y DAC se definieron en los Trusted Computer System
Evaluation Criteria (TCSEC, Criterios de evaluación de los sistemas informáticos de
confianza), también conocidos como Orange Book, publicado por el DoD (Departamento
de Defensa) de los Estados Unidos. En la siguiente sección, analizaremos MAC. Como su
nombre indica, DAC permite a los propietarios o creadores de archivos decidir qué nivel
de acceso deben dar a otros usuarios para el mismo archivo.
Si bien vemos que DAC se implementa en todos los sistemas, también se considera
como débil. Por ejemplo, si concedemos acceso de lectura a un usuario, este será
de naturaleza transitiva. Por lo tanto, no hay nada que impida al usuario copiar el
contenido del archivo de otra persona a un objeto al que el usuario tiene acceso.
En otras palabras, la distribución de la información no se administra en DAC. En la
siguiente sección, veremos rápidamente los permisos de archivo.
• Otro: se refiere a cualquier otro usuario que no sea el propietario (creador) del
objeto o que no forme parte del grupo de usuarios que podría poseer el objeto.
En otras palabras, piense en un conjunto que contiene al creador y a todos los
usuarios del grupo que tiene el permiso; “Otro” se refiere a un usuario que no
forma parte de este conjunto.
Como se indicó anteriormente, cada objeto tiene tres tipos de propietario. Cada propietario
(usuario, grupo, propietario) tendrá tres permisos sobre un objeto. Son los siguientes:
• Lectura: el permiso de lectura le permitirá leer o abrir un archivo. El permiso de
lectura sobre un directorio significa que el usuario podrá enumerar el contenido
del directorio.
• Escritura: si se aplica a un archivo, dará permiso para modificar el contenido
del archivo. Al agregar este permiso a un directorio, se concederá la facultad de
agregar, quitar y renombrar los archivos del directorio.
• Ejecutar: este permiso es obligatorio para ejecutar un programa o script ejecutable.
Por ejemplo, si tiene un script de Bash y tiene permiso de lectura/escritura, esto
significa que podrá leer y modificar el código. Sin embargo, para ejecutar el código,
necesita este permiso.
Aquí hay una representación gráfica de los propietarios y los permisos asociados:
Sigamos adelante y veamos cómo podemos averiguar los permisos del terminal de Linux.
Para enumerar el contenido de un directorio, ejecute ls -lah.
La salida será diferente en función del contenido que tenga en el directorio desde el que
se enumera:
En primer lugar, rwx denota que el usuario o propietario tiene permisos de lectura,
escritura y ejecución.
En segundo lugar, r-x indica que el grupo tiene permisos de lectura y ejecución.
Sin embargo, no existe permiso de escritura.
En tercer lugar, r-x indica que todos los demás tienen acceso de lectura y ejecución,
pero no acceso de escritura.
Del mismo modo, puede comprender los permisos asignados a otros objetos.
DAC | 189
Estos ya están escritos en el orden read(r), write(w) y execute. Si falta una letra, significa
que el permiso no existe. Esta es una tabla que explica lo que significan estas letras:
Es posible que se pregunte quién es el propietario de este archivo y qué grupo obtiene
acceso. Esto se responde en la salida misma:
En este caso:
• El usuario tiene permiso de lectura y escritura, pero no tiene permiso de ejecución.
• El grupo tiene solo permiso de lectura y no tiene permiso de escritura ni ejecución.
• Todos los demás solo tienen permiso de lectura.
Puede cambiar los permisos de un archivo o carpeta con el comando chmod. La sintaxis
general es:
chmod permissions filename/directory
Método simbólico
En el método simbólico, utilizaremos las denotaciones de usuarios y operadores.
La siguiente es una lista de operadores:
Recordemos cuáles eran los permisos que teníamos para el archivo external.png:
Aquí verá algunos números. Analizaremos cuáles son cuando veamos el método absoluto.
A continuación, vamos a intentar escribir y ejecutar los permisos para el grupo
mediante la ejecución del siguiente comando:
chmod -v g+wx external.png
Por lo tanto, agregar wx(write, execute) a g(group) generará una salida similar a la
siguiente. Puede entender claramente el cambio de la salida:
Hasta ahora, hemos agregado permisos. Ahora, veamos cómo quitar los permisos de
lectura existentes de otros.
Ejecute lo siguiente:
chmod -v o-r external.png
Establezcamos los permisos de lectura, escritura y ejecución para todos (usuario, grupo
y otro).
Ejecute el siguiente comando:
chmod -v a=rwx external.png
Otro ejemplo implica combinar los permisos para cada propietario y pasarlos de una
sola vez, tal como se muestra aquí:
chmod -v u=rw,g=r,o=x external.png
Veamos un ejemplo. Compruebe los permisos del archivo new-file, que se encuentra en
el directorio actual. Ejecute ls -lah:
Ahora, podemos relacionar los números que obtuvimos en las salidas anteriores cuando
estábamos probando el método simbólico.
Esta es una representación gráfica del valor:
Es posible que haya notado que hay un dígito adicional antes del permiso que asignamos
(por ejemplo, 0761). Este 0 es para los permisos de archivos avanzados. Si recuerda las
sugerencias, dijimos que “Los permisos suid y sgid sobre los archivos de estos directorios
son muy peligrosos” e “Intente evitar usar el bit suid/sgid tanto como sea posible”. Estos
valores suid/sgid se pasan a través de un dígito adicional. Es mejor no usar esto y regirse
según el permiso básico, ya que estos son muy peligrosos y pueden ser complejos.
Ahora sabemos cómo cambiar el permiso, pero ¿cómo cambiaremos el usuario y el
grupo propietarios? Para esto, usaremos el comando chown. La sintaxis es la siguiente:
chown user:group filename/directory
Como se explica en el caso del comando chown, este comando tampoco es recursivo. Si
quiere hacer que el cambio se herede a la subcarpeta y a los archivos de un directorio, use
el parámetro -R (recursivo). También tiene una opción detallada (-v) como vimos en chmod.
Ahora que sabemos sobre la administración de permisos, vamos a la siguiente sección
sobre MAC. DAC se trataba de las comprobaciones de permisos mediante UID y GID.
Por otro lado, MAC es un control de acceso basado en directivas. Echemos un vistazo
más de cerca a MAC.
MAC
En MAC, un sistema limita el acceso a recursos específicos en función de la autorización
y la confidencialidad del recurso específico. Está más basado en directivas y se
implementa con los módulos de seguridad de Linux (LSM).
Las etiquetas de seguridad son la base de MAC. A cada persona se le otorga un nivel de
autorización de seguridad (por ejemplo, secreto o confidencial) y cada objeto de datos
obtiene una clasificación de seguridad. Por ejemplo, se deniega el acceso a un usuario
con un nivel de autorización de seguridad confidencial que intenta recuperar un objeto
de datos con una clasificación de seguridad ultrasecreta, porque su autorización es
menor que la clasificación del objeto.
Por lo tanto, es bastante obvio que puede usar el modelo de MAC principalmente en
aquellos entornos donde la confidencialidad es de suma importancia (instituciones
gubernamentales, etc.).
SELinux y AppArmor son ejemplos de sistemas comerciales basados en MAC.
MAC | 195
LSM
LSM es un marco para proporcionar una interfaz para agregar MAC sobre DAC. Esta
capa de seguridad adicional se puede agregar con SELinux (SUSE y distribuciones
basadas en Red Hat), AppArmor (Ubuntu y SUSE) o el menos conocido Tomoyo (SUSE).
En esta sección, analizaremos SELinux y AppArmor.
DAC es un modelo que proporciona control de acceso basado en usuarios que son
miembros de un grupo y permisos sobre archivos y dispositivos. MAC restringe el
acceso a objetos de recursos como los siguientes:
• Archivos
• Procesos
• Puertos TCP/UDP
• Usuarios y sus roles
SELinux
Como mencionamos anteriormente, SELinux es un módulo de seguridad de Linux
y, como sugerencia de seguridad, se recomienda no deshabilitarlo. SELinux lo desarrolló
la NSA y Red Hat. El lanzamiento inicial se hizo el 22 de diciembre de 2000 y, en el
momento de escribir este libro, la versión estable disponible es 2.9, que se publicó
en 2019. Se puede utilizar en SUSE y en todas las distribuciones basadas en Red Hat.
En este libro se abarcará la implementación en Red Hat. Si quiere usarla en SUSE,
visite la documentación sobre SUSE en https://doc.opensuse.org/documentation/
leap/security/html/book.security/cha-selinux.html para instalar y habilitar SELinux.
Después de eso, los procedimientos son los mismos. En el pasado, se hizo algún
esfuerzo para que funcionara en Ubuntu pero, en este momento, no hay desarrollo
activo y los paquetes se dividen.
196 | Administración de seguridad e identidades de Linux
Todo el acceso se debe conceder de manera explícita pero, en las distribuciones que
utilizan SELinux, ya hay muchas directivas vigentes. Esto cubre casi todos los objetos de
recursos. Además de la lista ya mencionada en la documentación, abarca lo siguiente:
• La pila de red completa, incluido IPsec
• Funcionalidades de Kernel
• Comunicación entre procesos (IPC)
• Protección de la memoria
• Transferencia y herencia de descriptores de archivos (canales de comunicación)
Configuración de SELinux
SELinux se configura mediante el archivo /etc/selinux/config:
# Este archivo controla el estado de SELinux en el sistema.
# SELINUX= puede tomar uno de estos tres valores:
# enforcing: se aplica la directiva de seguridad de SELinux.
# permissive: SELinux imprime advertencias en lugar de aplicar las
directivas.
# disabled: no se carga ninguna directiva de SELinux.
SELINUX=enforcing
Antes de explorar SELinux, deberá agregar los paquetes necesarios al sistema para
poder auditar SELinux. Ejecute el siguiente comando:
sudo yum install setroubleshoot
Después del reinicio, estamos listos para usar SELinux y solucionar problemas que
puedan surgir:
SELinux context on ports
198 | Administración de seguridad e identidades de Linux
Comencemos con un ejemplo fácil que implica el servicio SSH. Como se indicó
anteriormente, todos los procesos se etiquetan con una etiqueta contextual. Para que
esta etiqueta sea visible, muchas utilidades, como ls, ps y lsof, tienen el parámetro -Z.
En primer lugar, debe descubrir el ID de proceso principal de este servicio:
systemctl status sshd | grep PID
Hay varios métodos para solucionar problemas de SELinux. Puede usar el archivo de
registro, /var/log/audit/audit.log, directamente o con el comando sealert -a /var/
log/audit/audit.log, o bien puede usar el comando journalctl:
journalctl --identifier setroubleshoot
Ejecute este comando (y tal vez tenga que redirigir la salida a un archivo o canalizarla
mediante less o more), y no solo le volverá a mostrar el mismo mensaje de SELinux, sino
que también vendrá con una sugerencia sobre cómo solucionarlo:
If you want to allow /usr/sbin/sshd to bind to network port 44
Then you need to modify the port type.
Do
# semanage port -a -t PORT_TYPE -p tcp 44
where PORT_TYPE is one of the following: ssh_port_t, vnc_port_t, xserver_
port_t.
Antes de pasar a esta solución, SELinux trabaja con varias bases de datos que contienen
el objeto de recurso y la etiqueta contextual, es decir, /, se debe aplicar al objeto de
recurso. La herramienta semanage está disponible para modificar la base de datos y
agregarle entradas; en nuestro escenario, el puerto de la base de datos. La salida del
registro sugiere agregar una etiqueta contextual para el puerto TCP 44 a la base de
datos. Hay tres contextos posibles; todos ellos solucionarán su problema.
Otro aspecto importante es el hecho de que a veces hay otras soluciones posibles.
Hay una clasificación de confianza para simplificarle la elección. Pero incluso así, de
todos modos tiene que leer con cuidado. Especialmente con los archivos, a veces desea
agregar una expresión regular en lugar de hacerlo para cada archivo una y otra vez.
Puede adoptar un enfoque pragmático y decir “No estoy usando vnc ni xserver, así
es que elijo ssh_port_t”, o bien puede usar la utilidad sepolicy, parte del paquete
policycoreutils-devel. Si recibe un mensaje de error, instale policycoreutils-devel
con sudo yum install –y policycoreutils-devel:
sepolicy network -a /usr/sbin/sshd
Busque en la salida el name_bind de TCP, porque el acceso de SELinux impide que /usr/
sbin/sshd tenga acceso de name_bind a tcp_socket port 44.
200 | Administración de seguridad e identidades de Linux
Ahora que sabe de dónde proviene la sugerencia, investigue la etiqueta actual del
puerto 22:
sepolicy network -p 22
La etiqueta es ssh_port_t.
Nota
Puede usar semanage port -l y grep en el puerto 22.
Realmente tiene sentido usar la misma etiqueta. ¿No está convencido? Generemos
páginas man:
sepolicy manpage -a -p /usr/share/man/man8/
mandb
La página man ssh_selinux le indica en la sección de tipos de puerto que la etiqueta
correcta es ssh_port_t.
Por último, solucionemos el problema:
semanage port -a -t ssh_port_t -p tcp 44
Esto hace que /srv/ftp sea el directorio raíz predeterminado para el servicio vsftpd
para los usuarios anónimos. Ahora está listo para poner en marcha el servicio:
sudo systemctl start vsftpd.service
sudo systemctl status vsftpd.service
Con la utilidad ftp, intente iniciar sesión en el servidor FTP como usuario anonymous,
sin contraseña:
ftp localhost
Trying ::1...
Connected to localhost (::1).
220 (vsFTPd 3.0.2)
Name (localhost:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
229 Entering Extended Passive Mode (|||57280|).
150 Here comes the directory listing.
-rw-r--r-- 1 14 50 8 Jul 16 09:47 README
drwxr-xr-x 2 14 50 6 Jul 16 09:44 pub
226 Directory send OK.
Try to get the file:
get README
202 | Administración de seguridad e identidades de Linux
Y funciona. ¿Cómo puede ser posible? Porque ya hay una entrada en la base de datos
para /srv/ftp/README con la etiqueta correcta:
semanage fcontext -l | grep /srv
ls -dZ /srv/ftp/incoming
En primer lugar, debe agregar la directiva a la base de datos fcontext; después de eso,
puede aplicar la directiva al directorio ya existente.
Nota
Lea la página man de selinux-fcontext. Además de describir todas las opciones,
también hay algunos buenos ejemplos.
MAC | 203
SELinux Boolean
Con una sola cadena, puede cambiar el comportamiento de SELinux. Esta cadena
se denomina SELinux Boolean. Puede obtener una lista de los valores booleanos con
getsebool -a. Con boolean allow_ftpd_anon_write, cambiaremos cómo reacciona
SELinux. Vuelva a conectarse anónimamente al servidor FTP e intente cargar un
archivo otra vez:
ftp> cd /incoming
250 Directory successfully changed.
ftp> put /etc/hosts hosts
local: /etc/hosts remote: hosts
229 Entering Extended Passive Mode (|||12830|).
550 Permission denied.
¿Qué está pasando aquí entonces? A veces, las reglas sencillas para un puerto o archivo
no son suficientes, por ejemplo, si un recurso compartido NFS se tiene que exportar
también con Samba. En este escenario, es posible crear su propia directiva de SELinux
compleja o utilizar la base de datos booleana con interruptores de encendido/apagado
fáciles de usar. Para hacerlo, puede usar la utilidad setsebool anterior o semanage:
semanage boolean --list | grep "ftpd_anon_write"
semanage boolean --modify ftpd_anon_write --on
Al usar setsebool sin -P, el cambio se hace, pero no es persistente. La utilidad semanage
no tiene la opción de modificarlo de manera no permanente.
AppArmor
En las distribuciones de Debian, Ubuntu y SUSE, AppArmor está disponible para
implementar MAC. Tenga en cuenta que hay algunas pequeñas diferencias entre las
distribuciones pero, en general, una distribución puede agregar menos o más perfiles
y algunas herramientas adicionales. En esta sección, usamos Ubuntu 18.04 como ejemplo.
Además, debe asegurarse de mantener actualizada la distribución, en especial con
AppArmor; los paquetes en Debian y Ubuntu estaban plagados de errores, lo que
a veces generaba un comportamiento inesperado.
204 | Administración de seguridad e identidades de Linux
En este capítulo, trataremos el ámbito inicial: los procesos que necesitan acceso
a los archivos.
Estado de AppArmor
Lo primero que hay que hacer es comprobar si el servicio de AppArmor está
en funcionamiento:
sudo systemctl status apparmor
Después de eso, vea el estado con mayor detalle con el siguiente comando:
sudo apparmor_status
La siguiente captura de pantalla muestra el estado de AppArmor, derivado del uso del
comando apparmor_status:
Si explora el directorio /etc/apparmor.d, verá que no hay perfil para nginx. Cree
uno predeterminado:
sudo aa-autodep nginx
Para solucionar el problema, establezca el modo de notificación para este perfil. De este
modo, no aplica la directiva pero sí notifica cada infracción de la directiva de seguridad:
sudo aa-complain /usr/sbin/nginx
sudo systemctl start nginx
Haga una solicitud http con un explorador o una utilidad, por ejemplo, curl:
curl http://127.0.0.1
Para saber lo que hacen, solo tiene que consultar el archivo. Por ejemplo, el archivo /
etc/apparmor.d/abstractions/nameservice indica lo siguiente:
/usr/sbin/nginx flags=(complain) {
#include <abstractions/base>
#include <abstractions/nameservice>
#include <abstractions/openssl>
#include <abstractions/web-data>
Nota
Muchos programas quieren realizar operaciones como servicio de nombres, como
buscar usuarios por nombre o ID, grupos por nombre o ID y hosts por nombre o
dirección IP. Estas operaciones se pueden hacer a través de archivos wins, hesiod,
LDAP, NIS+, NIS y DNS. Permita aquí todas estas opciones.
firewalld y systemd | 209
La sección final son los permisos; para obtener una lista completa, consulte la sección
Modo de acceso en man 5 apparmor.d:
/var/log/nginx/error.log w,
owner /etc/nginx/modules-enabled/ r,
owner /etc/nginx/nginx.conf r,
owner /run/nginx.pid w,
owner /usr/lib/nginx/modules/ngx_http_geoip_module.so mr,
owner /usr/share/nginx/modules-available/mod-http-geoip.conf r,
owner /usr/share/nginx/modules-available/mod-http-image-filter.conf r,
owner /var/log/nginx/access.log w,
}
firewalld y systemd
En el Capítulo 5, Administración avanzada de Linux, systemd se analizó como un
administrador de sistemas y servicios. En systemd, hay varias opciones para agregar
una capa adicional de protección a sus demonios y sistema de archivos.
Sinceramente, en nuestra opinión tiene sentido usar Azure Firewall en los grupos de
seguridad de red de Azure. Es fácil de configurar, proporciona administración central
y prácticamente no requiere mantenimiento. Proporciona seguridad entre VM, redes
virtuales e incluso distintas suscripciones de Azure.
Nota
Hay un costo adicional si quiere usar este firewall. Sin embargo, un firewall de
Linux no incurre en ningún cargo, ya que es una medida de seguridad instalada en
su máquina.
210 | Administración de seguridad e identidades de Linux
Espero que después de cubrir una de las implementaciones de firewall de Linux quede
claro que un firewall de Linux no es de ninguna manera un reemplazo completo para
Azure Firewall. Solo puede proporcionar seguridad para el tráfico entrante a la VM y sí,
es posible configurar este firewall para bloquear también el tráfico saliente, pero eso es
bastante complejo. Por otro lado, si está configurado en los grupos de seguridad de red
de Azure, en muchos casos, eso es más que suficiente.
Existen distintos tipos de soluciones de firewall disponibles para Linux, como firewalld
e iptables, entre otras. En este libro, vamos a seguir a firewalld debido a las opciones
de configuración disponibles y su popularidad. Asegúrese de que el software firewalld
esté instalado y de quitar otro software de firewall del sistema para evitar conflictos.
En las distribuciones basadas en RHEL/CentOS, este ya es el caso. En Ubuntu, use los
siguientes comandos:
sudo apt remove ufw
sudo apt install firewalld
En las distribuciones basadas en SUSE, use los siguientes comandos:
sudo zypper install susefirewall2-to-firewalld
sudo susefirewall2-to-firewalld -c
Hay varias implementaciones de firewall para Linux; algunas de ellos incluso
desarrolladas para una distribución específica, como SuSEfirewall2. En este capítulo,
hablaremos de firewalld, que está disponible en cada distribución.
Firewalld consta de un demonio que administra todos los componentes del firewall:
• Zonas
• Interfaces
• Orígenes
• Reglas directas para iptables y ebtables (no aparecen en este libro)
firewalld y systemd | 211
firewalld utiliza módulos de kernel: tablas IP6/iptables para tráfico de IPv4 e IPv6
y ebtables para el filtrado del tráfico de red que pasa a través de un puente en Linux.
En las distribuciones más recientes, como RHEL 8, se usa el módulo nftables.
Para configurar las reglas de firewalld, hay disponible una utilidad de línea de
comandos: firewall-cmd. Las reglas pueden ser persistentes o solo en tiempo de
ejecución. Hay dos razones importantes para este comportamiento: de esta manera,
no es necesario volver a cargar todas las reglas, lo que implica un riesgo de seguridad
temporal. Puede agregar y quitar reglas de manera dinámica. Si se equivoca y no puede
volver a iniciar sesión por eso, una solución rápida y sencilla es reiniciar. También
podemos usar el comando systemd-run --oncalendar para crear una tarea programada
que ejecute firewall-cmd --reload, lo que es incluso una mejor solución:
sudo systemd-run --on-calendar='2018-08-20 13:00:00' \
firewall-cmd --reload
No olvide detener y deshabilitar el temporizador si las reglas del firewall eran correctas
(y no se bloqueó su acceso).
También puede configurar el demonio con herramientas de orquestación que se
comuniquen con el demonio o insertar archivos XML en el host.
Nota
Los puertos solo están abiertos para las VM conectadas a la red de la máquina
virtual, a menos que abra los puertos en el grupo de seguridad de red.
Use el comando iptables-save para ver todas las reglas activas del firewall o si la
distribución usa nftables:
sudo nft list ruleset
212 | Administración de seguridad e identidades de Linux
Zonas de firewalld
Uno de los conceptos más importantes de firewalld es la zona. Una zona consta de una
regla predeterminada, llamada destino, una interfaz de red o un origen de red, además
de servicios, puertos, protocolos y reglas enriquecidas adicionales.
Una zona solo está activa si una interfaz de red está conectada a la interfaz o a un
origen de red.
Para enumerar las zonas disponibles, use el comando siguiente:
sudo firewall-cmd --get-zones
La zona pública tiene la directiva de destino default, lo que significa que todo
el tráfico entrante se bloquea de manera predeterminada, excepto los servicios,
puertos y protocolos configurados.
El archivo /usr/lib/firewalld/zones/public.xml correspondiente a esta zona es
el siguiente:
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers
on networks to not harm your computer. Only selected incoming connections
are accepted.</description>
<service name="ssh"/>
<service name="dhcpv6-client"/>
</zone>
Según la distribución que esté utilizando, es posible que tenga nombres de servicio
adicionales. Por ejemplo, si usa RHEL 8, es posible que cockpit aparezca como servicio.
cockpit es una interfaz web que se usa para administrar máquinas RHEL.
Puede que haya notado que, en la zona pública, dice target: default. El destino es el
comportamiento predeterminado. Los posibles valores son los siguientes:
• default: no haga nada, acepte cada paquete de ICMP y rechace todo lo demás.
• %%REJECT%%: esto envía una respuesta de rechazo al cliente a través del
protocolo ICMP.
• DROP: esto envía un SYN/ACK de TCP, como en un puerto abierto, pero se descarta
todo el resto del tráfico. No hay ningún mensaje de ICMP para informar al cliente.
• ACCEPT: acepte todo.
Servicios de firewalld
Un servicio es una configuración centrada en la aplicación para permitir uno o más
puertos. Para recibir una lista de los servicios disponibles, use el siguiente comando:
sudo firewall-cmd --get-services
Si quiere agregar un servicio, por ejemplo, MySQL, ejecute los siguientes comandos:
sudo firewall-cmd --add-service=mysql --zone=public
En el archivo anterior, puede ver que se permite el puerto TCP 1723. Puede agregar
tantas reglas de puerto como quiera. Por ejemplo, si quiere agregar el puerto TCP 1724,
el elemento de línea será el siguiente:
<port protocol="tcp" port="1724" />
El propósito del área de colocación es abandonar todo el tráfico sin dejar que el cliente
sepa que el tráfico se descarta. Agregar ipset a esta zona hace que esté activa y se
abandonará todo el tráfico proveniente desde las Bermudas.
sudo firewall-cmd --get-active-zones
drop
sources: ipset:block_bermuda
public
interfaces: eth0
Ahora que sabemos cómo funciona firewalld y cómo podemos proteger nuestra
máquina mediante el uso de las zonas, pasemos a la siguiente sección.
Seguridad de systemd
Tal como se mencionó en el capítulo anterior, systemd es responsable de iniciar todos
los procesos en paralelo durante el proceso de arranque, excepto los procesos que
crea el kernel. Después de eso, es cuestión de activar los servicios, entre otras cosas,
a petición. Las unidades systemd también pueden proporcionar una capa adicional de
seguridad. Puede agregar varias opciones al archivo de unidad para que su unidad sea
más segura.
Simplemente edite el archivo de unidad con systemctl edit y agregue las medidas de
seguridad. Por ejemplo, ejecute el siguiente comando:
sudo systemctl edit sshd
Ahora, vuelva a iniciar sesión con su cliente SSH e intente guardar un archivo en
el directorio principal. Esto generará un error, porque es un sistema de archivo de
solo lectura:
Figura 6.24: Error al iniciar sesión porque el archivo de unidad cambió a de solo lectura
Figura 6.25: Uso de systemd-run y systemctl para recopilar y analizar los datos de red
Puede usar IPAddressDeny para denegar una dirección IP o un intervalo IP. Se puede
hacer una excepción con IPAddressAllow. Incluso es posible denegar todo en el sistema
y agregar cada servicio a una lista blanca:
sudo systemctl set-property sshd.service IPAddressAllow=any
sudo systemctl set-property waagent.service IPAddressAllow=10.0.0.1
Nota
Si usa Ubuntu, el nombre de servicio es walinuxagent.
Algunos comentarios:
• Por supuesto, tiene que cambiar el intervalo IP a la subred virtual y debe permitir
el acceso a la primera dirección IP de la subred para el servicio de red y el agente
de Azure, como DHCP (Protocolo de configuración dinámica de host).
• También es muy buena idea restringir el acceso SSH a la dirección IP de su
propia red.
• Consulte cuidadosamente el diario de systemd para saber si necesita abrir
más puertos.
Nota
En este libro no se habla de libwrap, porque cada vez son más las aplicaciones
que ya no usan esta opción y algunos proveedores, como SUSE, están ocupados
quitando el soporte completo para esta biblioteca.
Administración de identidades y acceso en Azure: IAM | 221
Ahora está listo para implementar el servicio. Esto tardará un poco; en mi experiencia
personal, puede tardar de 20 a 30 minutos.
Cuando termine, vaya a la sección Redes virtuales que se encuentra en la barra de la
izquierda y escriba la red virtual que recién se creó. Encontrará dos interfaces de red
recién creadas y sus direcciones IP. Anote esta información, porque la va a necesitar.
Se recomienda crear una subred en esta red virtual, pero no es necesario.
Configuración de Linux
Tiene que implementar la VM Linux en la misma red virtual o en una red emparejada
donde esté implementado Azure AD Directory Services. Como ya se indicó,
se recomienda conectarla a otra subred. Aquí, no seguimos el LDAP seguro.
Nombre de host
Cambie el nombre de host con la utilidad hostnamectl al fqdn correcto:
sudo hostnamectl set-hostname ubuntu01.frederikvoslinvirt.onmicrosoft.com
Servidores DNS
En la barra de la izquierda de Azure Portal, vaya a Redes virtuales y navegue a la subred
donde se encuentran las interfaces de red de Azure AD Domain Services. Seleccione
Servicios DNS y use las opciones personalizadas para establecer las direcciones IP de
las interfaces de red de Azure AD Domain Services. Al hacerlo, siempre que se requiera
la resolución DNS del nombre de host, apuntará a Azure AD Domain Services.
Como alternativa, si su instancia de Azure AD Domain Services es una implementación
nueva en el panel Información general de Azure Portal, se le pedirá cambiar los
servidores DNS. Simplemente haga clic en el botón Configurar si quiere cambiar los
servidores DNS de la red virtual para que apunten a Azure AD Domain Services.
Por lo general, reiniciar la red de la VM debería bastar, pero es mejor reiniciar ahora.
De vez en cuando, sobreviven tanto la configuración nueva como la antigua.
En RHEL, Ubuntu y SUSE, vea el contenido del archivo /etc/resolv.conf para
comprobar el resultado. Luego, observe la configuración de eth0.
Administración de identidades y acceso en Azure: IAM | 223
Instalación de dependencias
Hay algunos componentes y dependencias importantes que se requieren para poder
usar Azure AD Domain Services:
• Un cliente Kerberos, para la autorización
• SSSD, un back-end que es responsable de la configuración y utilización de
características como el uso y el almacenamiento en caché de credenciales
• Bibliotecas de Samba, para admitir las opciones o características de Windows
• Algunas utilidades para unirse al dominio y administrarlo, como realm, adcli
y el comando net
Use el nombre de usuario que agregó anteriormente como miembro del grupo de
administradores de Azure AD Domain Services. Si recibe un mensaje que indica
Necessary packages are not installed (Los paquetes necesarios no están instalados),
pero está seguro de que sí están instalados, agregue el parámetro --install=/ al
comando realm.
Para comprobar el resultado, ejecute el siguiente comando:
sudo realm list
Administración de identidades y acceso en Azure: IAM | 225
Nota
Si no funciona y la unión se realizó correctamente, reinicie la VM.
226 | Administración de seguridad e identidades de Linux
La mejor parte es que si faltan dependencias, YaST le pedirá que las instale, así que siga
y complete la instalación de dependencias. Inmediatamente después de la instalación,
puede escribir su nombre de dominio y, una vez que lo guarde, se le pedirá que escriba
el nombre de usuario y la contraseña, tal como se muestra en la siguiente captura
de pantalla:
Por fin terminamos de unir nuestra máquina Linux a Azure AD Domain Services.
Recientemente, Microsoft agregó compatibilidad con el inicio de sesión de Azure AD en
las VM Linux sin necesidad de unir las máquinas al dominio. Se instalará un agente en la
máquina para completar la autorización. Esto se analizará en la siguiente sección.
Por último, podrá ver que inició sesión en la VM Linux con sus credenciales de Azure AD.
Resumen
Actualmente, la seguridad es un tema muy importante. Muchos informes, libros y más
se han escrito sobre este tema. En este capítulo, analizamos varias opciones en Linux
para aumentar los niveles de seguridad. Todas se basan en la seguridad básica que ya
proporciona Azure a través de los grupos de seguridad de red. Son relativamente fáciles
de implementar y harán una gran diferencia.
La administración central de identidades no solo es una forma de facilitar a los usuarios
el acceso a la VM, sino que también es parte de la reducción de los riesgos de seguridad.
Azure AD Domain Services proporciona, a través de LDAP y Kerberos, una solución de
administración de identidades para todos los sistemas operativos y las aplicaciones que
admiten estos protocolos.
En el Capítulo 8, Exploración de la automatización de la configuración continua, se
analizarán la automatización y la orquestación. Tenga en cuenta que todas las medidas
de seguridad que se tratan en este capítulo se pueden organizar fácilmente. La
orquestación hace posible la administración de la configuración central. Una de sus
grandes ventajas es la prevención de errores y configuraciones incontrolables. De esta
manera, incluso la orquestación es parte de su plan de seguridad.
Y sería bueno si va a crear sus propias VM, especialmente si va a compilar sus propias
imágenes. En el próximo capítulo, veremos cómo compilar sus propias imágenes.
Además, consideraremos los aspectos de seguridad que implica insertar estas imágenes
e implementarlas en su entorno.
232 | Administración de seguridad e identidades de Linux
Preguntas
1. Si va a implementar firewalld, ¿cuáles son los métodos para configurar este firewall?
2. ¿Cuál es la razón para usar el parámetro --permanent de firewall-cmd?
3. ¿Qué otras opciones hay disponibles para restringir el acceso a la red?
4. Explique la diferencia entre DAC y MAC.
5. ¿Por qué es importante utilizar módulos de seguridad de Linux en una VM que se
ejecuta en Azure?
6. ¿Qué sistema MAC está disponible para qué distribución?
7. ¿Cuál es la principal diferencia entre AppArmor y SELinux?
8. ¿Cuáles son los requisitos para poder unirse a Azure AD Domain Services en lo que
se refiere a las dependencias y la configuración de Linux?
Lectura adicional
Al igual que en el capítulo anterior, se recomienda consultar el Capítulo 11, Solución de
problemas y supervisión de sus cargas de trabajo, para leer sobre el registro en Linux,
porque muchas veces el comando systemctl status no brinda suficiente información.
También mencioné ya el blog de Lennart Poettering y el sitio web de systemd.
Si quiere saber sobre la seguridad de Linux en términos generales, puede empezar
a leer el libro Mastering Linux Security and Hardening (Dominar la seguridad y el
fortalecimiento de Linux) de Donald A. Tevault. Se explican con gran detalle muchos de
los temas tratados en este capítulo, y muchos otros más.
El demonio firewalld tiene un sitio web del proyecto, https://firewalld.org, con un blog
y una excelente documentación. En el caso de las distribuciones anteriores, la wiki de
Arch Linux es un buen lugar para empezar a aprender más: https://wiki.archlinux.org/
index.php/iptables. Y como firewalld utiliza iptables, es un buen comienzo antes de
sumergirse en la página man de firewalld.richlanguage.‑
Todos los detalles sobre SELinux se describen en las guías que proporciona Red Hat :
https://access.redhat.com/documentation/es-xl/red_hat_enterprise_linux/7/html/
selinux_users_and_administrators_guide/ Y si bien está un poco obsoleto, es buena
idea que vea en YouTube este video de una Cumbre de Red Hat relacionado con
SELinux: https://www.youtube.com/watch?v=MxjenQ31b70.
Sin embargo, es más difícil encontrar buena información sobre AppArmor. Hay
documentación disponible sobre el proyecto en https://gitlab.com/apparmor/
apparmor/wikis/Documentation y la guía de Ubuntu Server es un buen comienzo.
Está disponible en https://help.ubuntu.com/lts/serverguide/apparmor.html.en.
Implementación de
7
sus máquinas virtuales
Es fácil implementar una sola máquina virtual (VM) en Azure, pero apenas desee
implementar más cargas de trabajo de una manera única y reproducible, necesitará
algún tipo de automatización.
En Azure, puede usar Azure Resource Manager (ARM) para implementar VM mediante
archivos de configuración de plantilla junto con la CLI de Azure, PowerShell, Ruby y C#.
Otras herramientas de terceros que se usan para crear imágenes para VM, como Packer
y Vagrant, se analizan más adelante en este capítulo.
Todos estos métodos de implementación o métodos de creación de imágenes usan
imágenes de Azure, pero también puede crear sus propias VM personalizadas con
imágenes personalizadas.
234 | Implementación de sus máquinas virtuales
Tendrá la respuesta a todas estas preguntas al final de este capítulo. Estos son los
aportes clave de este capítulo:
• Analizaremos las opciones de implementación automatizadas en Azure.
• Veremos cómo se puede automatizar la implementación mediante la CLI de Azure
y PowerShell.
• Cubriremos las plantillas de Azure ARM para la implementación y cómo se pueden
reutilizar para nuevas implementaciones.
• Se analizarán las herramientas de creación de imágenes de VM como Packer
y Vagrant.
• Por último, explicaremos cómo usar imágenes personalizadas y usar nuestros
propios VHD (discos duros virtuales) a Azure.
Escenarios de implementación
Las tres preguntas mencionadas en la introducción son muy importantes. Pueden
diferir por empresa, por aplicación y durante la etapa de desarrollo. Estos son algunos
ejemplos de escenarios de implementación:
• Las aplicaciones se desarrollan de forma interna, tal vez incluso en su equipo local.
Una vez terminadas, se implementan en Azure. Las actualizaciones se aplicarán
a la carga de trabajo en ejecución.
• Este es el mismo escenario, pero ahora las actualizaciones se realizarán mediante
la implementación de una nueva VM.
• Otro proveedor entrega las aplicaciones.
Estos tres ejemplos son muy comunes y pueden afectar la forma en que desea
implementar la carga de trabajo.
Escenarios de implementación | 235
¿Qué necesita?
Antes de entrar en la implementación, debe saber lo que necesita o, en otras palabras,
qué recursos se necesitan para que su aplicación funcione correctamente. Además,
todo en Azure tiene un límite y una cuota. Algunos límites son complejos y otros
pueden incrementarse mediante el Soporte técnico de Microsoft. Para ver la lista
completa de límites y cuotas de Azure, visite https://docs.microsoft.com/es-xl/azure/
azure-subscription-service-limits.
Antes de la implementación, tenemos que planificar y asegurarnos de que nuestros límites
de suscripción no bloqueen nuestro proyecto. Si hay una restricción o limitación, póngase
en contacto con el Soporte técnico de Microsoft y aumente la cuota. Sin embargo, si usa
en una prueba gratuita, las solicitudes de cuota no se aprobarán. Es posible que tenga
que migrar la implementación a una región donde tenga suficiente cuota para realizar
la implementación. Estos son los recursos clave que implementaremos:
• Un grupo de recursos
• Una cuenta de almacenamiento (no administrada) o un disco administrado
• Un grupo de seguridad de red
• Una red virtual
• Una subred para la red virtual
• Una interfaz de red conectada a la VM
No hay nada de malo en decidir hacer esto; podría ser la mejor solución para usted. Sin
embargo, de todas formas, hay dependencias:
• Implementa su sistema operativo en función de una imagen. Un publicador ha
puesto a disposición esta imagen. ¿Qué sucede si la imagen se actualiza a una
versión que no es compatible con su aplicación?
• ¿Cuánta configuración inicial ya se ha hecho en esta imagen? ¿Cuánto se necesita
y quién controla la imagen?
• ¿Esta imagen cumple con sus directivas de seguridad?
• Si desea dejar Azure por cualquier motivo, ¿puede trasladar su aplicación a otro lugar?
Creación de scripts
La automatización se puede llevar a cabo con scripts. En Azure, Microsoft cuenta con
muchas opciones compatibles:
• Bash con la CLI de Azure
• PowerShell con el módulo Az
• Python, con el SDK completo disponible en https://docs.microsoft.com/es-xl/
azure/python/python-sdk-azure-install
• Ruby, con un SDK de vista previa disponible en https://azure.microsoft.com/
es-xl/develop/ruby
• Go, con un SDK completo disponible en https://github.com/Azure/azure-sdk-for-go
• Además, hay bibliotecas disponibles para Node.js
Además, puede usar lenguajes de programación, como Java y C#. También hay
proyectos comunitarios; por ejemplo, https://github.com/capside/azure-sdk-perl
es un intento de crear un SDK completo de Azure para Perl.
Todos los lenguajes son opciones válidas; elija un lenguaje con el que ya esté familiarizado.
Tenga en cuenta que el SDK de Ruby estaba en versión preliminar en el momento en que
se escribió este libro. Durante el estado de vista previa, la sintaxis puede cambiar.
La creación de scripts es especialmente buena para preparar un entorno de Azure.
También puede usar la creación de scripts para implementar las VM e incluso puede
incluir la configuración inicial mediante extensiones de VM. La pregunta de si es una
buena idea depende de sus capacidades para la creación de scripts, la imagen base del
sistema operativo y las versiones de software instaladas en él.
238 | Implementación de sus máquinas virtuales
El argumento más grande contra el uso de scripts es que tarda mucho tiempo escribirlos.
Estos son algunos consejos que pueden ayudarlo a escribir scripts de manera eficiente:
• Use tantas variables como sea posible. De esta manera, si tiene que hacer cambios
en el script, todo lo que tiene que hacer es cambiar los valores de las variables.
• Use nombres de variables reconocibles en bucles, no algo como for i in.
• En especial, para scripts más grandes, declare las funciones que puede reutilizar.
• A veces, tiene sentido colocar las variables (como la que proporciona
autenticación) y las funciones en archivos independientes. Suele ser una buena
idea colocar una tarea por script.
• Incluya la marca de tiempo de la modificación en su código o, incluso mejor, use
un sistema de control de versiones como, Git.
• Incluya pruebas. Por ejemplo, solo cree este recurso si aún no existe. Use códigos
de salida legibles para personas. Si el script no pudo implementar un recurso, use
algo como not able to create $resource, para que quienquiera que ejecute el script
entienda que el script no pudo crear el recurso.
• Incluya comentarios suficientes. Si necesita depurar o reutilizar el script después
de algún tiempo, aún sabrá lo que hace. No olvide incluir también una descripción
en el encabezado.
• Dedique un tiempo al diseño; use la sangría para mantener el código legible. Use
dos espacios para la sangría, no tabuladores.
Ahora es momento de ver un breve ejemplo. Este ejemplo le dará una idea de cómo crear
scripts para proporcionar las cosas necesarias en Azure antes de implementar una VM.
En primer lugar, declare las variables. También puede agregar las variables a un archivo
y hacer que PowerShell las cargue. Se recomienda almacenarlas en el mismo script para
que siempre pueda volver y actualizarlas cuando sea necesario:
#Declare Variables
$myResourceGroup = "LinuxOnAzure"
$myLocation = "West Europe"
$myNSG = "NSG_LinuxOnAzure"
$mySubnet = "10.0.0.0/24"
$myVnet= "VNET_LinuxOnAzure"
Opciones de implementación automatizada en Azure | 239
Cuando crea una VM a través de Azure Portal, puede descargar esa VM como una
plantilla incluso antes de crearla. Si hace referencia a la siguiente captura de pantalla,
puede ver que incluso antes de crear la VM, tenemos una opción para descargar la
plantilla para la automatización:
Si hace clic en Descargar una plantilla para la automatización, verá la siguiente pantalla:
Como ve, puede agregar el script a su biblioteca en Azure o puede descargar este
archivo en su equipo local. También verá la opción Implementar, con la que puede
cambiar los parámetros e implementarlos directamente en Azure.
En el panel Scripts, Azure le ofrece vínculos sobre cómo realizar la implementación
mediante PowerShell y la CLI.
Puede cambiar fácilmente los parámetros e implementar una nueva VM o volver
a implementar exactamente la misma VM. No es tan distinto de usar sus propios
scripts, pero consume menos tiempo en términos de desarrollo.
Esto no es lo único que se puede hacer con ARM; puede configurar todos los aspectos
de los recursos de Azure. Por ejemplo, si va a implementar un Grupo de seguridad
de red a través de una plantilla de ARM, defina todo, como la regla, el intervalo de
puertos y la prioridad de la regla, de la misma manera que lo crearía desde Azure Portal
o a través de la CLI. No es tan difícil crear su propia plantilla de ARM. Necesitará la guía
de referencia de ARM, que puede encontrar en https://docs.microsoft.com/es-xl/
azure/templates. Junto con estos ejemplos, es un gran recurso para comenzar.
244 | Implementación de sus máquinas virtuales
Otra forma de empezar es mediante el uso de Visual Studio Code Editor, que está
disponible para Windows, Linux y macOS en https://code.visualstudio.com. La
extensión de Herramientas de Azure Resource Manager es imprescindible si va
a iniciar el uso de ARM, junto con algunas otras extensiones, como Azure Account and
Sign-In, Azure Resource Manager snippets y Azure CLI Tools. Puede empezar a usar
las plantillas existentes e incluso cargarlas en Cloud Shell, ejecutarlas y depurarlas.
Para instalar la extensión de Herramientas de Azure Resource Manager, siga estos pasos:
1. Abra Visual Studio Code.
2. Seleccione Extensions (Extensiones) en el menú de la izquierda. O bien, en el menú
View (Ver), seleccione Extensions (Extensiones) para abrir el panel Extensions.
3. Busque Resource Manager (Administrador de recursos).
4. Seleccione Install (Instalar) en Herramientas de Azure Resource Manager.
Como se ve en este panel, puede navegar fácilmente en Azure Portal mediante Todos
los recursos en la barra de navegación izquierda y buscar plantillas:
Aquí todavía puede editar su plantilla. Otra característica interesante es que puede
compartir su plantilla con otros usuarios de su inquilino. Esto puede ser muy útil, ya que
puede crear un usuario al que solo se le permite usar esta plantilla para la implementación.
Ahora que sabemos cómo implementar una plantilla desde Azure Portal, veamos cómo
podemos implementar plantillas de ARM mediante PowerShell y Bash.
Opciones de implementación automatizada en Azure | 247
Si prefiere realizar la misma tarea a través de la CLI de Azure o PowerShell, ejecute los
comandos que usamos anteriormente y la VM estará lista con la misma configuración
que se mencionó en la plantilla de ARM.
Configuración inicial
Después de la implementación de la carga de trabajo, se necesita una configuración
posterior a la implementación. Si desea hacer esto como parte de su solución de
automatización, tiene dos opciones:
• La extensión de script personalizado, que se puede usar en cualquier momento
después de la implementación.
• cloud-init está disponible durante el arranque.
Esta extensión funcionará en todos los sistemas operativos Linux respaldados por
Microsoft, excepto CoreOS y OpenSUSE LEAP. Cambie el comando apt-get en el script
por el administrador de software compatible con su distribución si no es Debian o Ubuntu.
Puede usar PowerShell para configurar la extensión:
$myResourceGroup = "<resource group name>"
$myLocation = "<location>"
$myVM = "<vm name>"
$Settings = @{ "commandToExecute" = "apt-get -y install nginx";};
Nota
En algunas versiones de base64, tiene que agregar el parámetro -w0 para
deshabilitar el ajuste de palabras. Solo asegúrese de que sea una línea.
Como ya hemos instalado nginx con el primer script, puede eliminar ngnix mediante apt
purge nginx o puede crear una nueva VM por completo. Como hicimos antes, podemos
revisar el registro del historial:
La entrada de registro muestra claramente que apt install –y nginx firewalld se ejecutó.
Dado que estamos observando el historial de apt, no podremos confirmar si se agregó la
regla firewalld HTTP. Para confirmarlo, puede ejecutar firewall-cmd –list-services:
Nota
El archivo JSON se puede incluir en una plantilla de ARM.
cloud-init usa YAML; tenga en cuenta que la sangría es importante. El objetivo del script
es instalar los paquetes npm, nodejs y nginx packages, luego configurar nginx y, finalmente,
mostrar un mensaje, Hello World from host $hostname, donde $hostname es el nombre de
la VM. Para partir, crearemos un archivo YAML con el siguiente contenido y el nombre
cloudinit.yml:
#cloud-config
groups: users
users:
- default
- name: azureuser
- groups: users
- shell: /bin/bash
package_upgrade: true
packages:
- nginx
- nodejs
- npm
write_files:
- owner: www-data:www-data
- path: /etc/nginx/sites-available/default
content: |
server {
listen 80;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
254 | Implementación de sus máquinas virtuales
Si observa este archivo de configuración, puede usar algunos de los siguientes módulos
en acción:
• users y groups: administración de usuarios
• packages y package_upgrade: administración de software
• write_files: creación de archivos
• runcmd: ejecutar comandos que no son posibles con los módulos
Después de la implementación, tomará algo de tiempo antes de que todo esté listo.
El registro se realiza en la VM en los archivos /var/log/cloud-init.log y /var/log/
cloud-init-output.log.
Cambie las reglas del grupo de seguridad de red para permitir tráfico en el puerto 80.
Después de eso, abra su navegador en la dirección IP de la VM. Si todo está bien, verá
lo siguiente: Hello World from host ubuntu-web!
Nota
No hay compatibilidad con cloud-init en los cmdlets Az.
Vagrant
Hasta ahora, hemos usado las soluciones de Microsoft; tal vez deberíamos llamarlas
soluciones nativas. Esa no es la única forma de implementar la carga de trabajo en Azure.
Muchos proveedores han creado soluciones para automatizar las implementaciones en
Azure. En esta sección, queremos abarcar una solución de una empresa llamada HashiCorp
(https://www.hashicorp.com). Más adelante en este capítulo, veremos otro producto de
esta empresa: Packer. Hay varias razones por las que hemos elegido estos productos:
• Los productos son muy populares y conocidos.
• Hay una excelente relación entre Microsoft y HashiCorp; trabajan muy duro juntos
para implementar más y más características.
• Y la razón más importante es que HashiCorp tiene diferentes productos que puede
usar para distintos escenarios de implementación. Esto le hará pensar nuevamente
en el método que desea elegir en diferentes casos de uso.
wget \ https://releases.hashicorp.com/vagrant/2.1.2/vagrant_2.1.2_x86_64.
deb
sudo dpkg -i vagrant_2.1.2_x86_64.deb
En RHEL/CentOS, use el siguiente comando:
sudo yum install \
https://releases.hashicorp.com/vagrant/2.1.2/ \
vagrant_2.1.2_x86_64.rpm
Si lo implementa en una VM o estación de trabajo independiente, asegúrese de
instalar también la CLI de Azure.
Inicie sesión en Azure:
az login
Cree una cuenta de entidad de servicio que Vagrant pueda usar para autenticar:
az ad sp create-for-rbac --name vagrant
De la salida, necesita el appID, también conocido como ID de cliente, y la
contraseña, que es lo mismo que el Secreto de cliente.
2. Ejecute el siguiente comando para obtener su ID de inquilino y su ID de suscripción:
az account show
En la salida de este comando, puede ver su ID de inquilino y su ID de suscripción.
Vagrant | 257
Además de usar imágenes estándares, es posible utilizar archivos de disco duro virtual
(VHD) personalizados con estas directivas:
• vm_vhd_uri
• vm_operating_system
• vm_vhd_storage_account_id
Vagrant | 259
Más adelante en este capítulo, analizaremos estos archivos de VHD personalizados con
más detalle.
Otro valor importante es el nombre de la VM; también se usa como prefijo de DNS.
Debe ser único. De lo contrario, obtendrá este error: DNS record <name>.<location>.
cloudapp.azure.com is already used by another public IP.
Implemente el cuadro de Vagrant, la VM:
vagrant up
Cuando la máquina esté lista para usarse, puede iniciar sesión con este comando:
vagrant ssh
El contenido del directorio de trabajo se copia en /vagrant en la VM. Esta es una manera
muy cómoda de tener sus archivos disponibles en la VM.
Limpie su trabajo con este comando:
vagrant destroy
Nota
También es posible crear cuadros de varias máquinas.
260 | Implementación de sus máquinas virtuales
Aprovisionadores de Vagrant
Ofrecer una forma sencilla de implementar una VM no es la característica
más importante de Vagrant. La razón principal para usar Vagrant es tener un
entorno completo en funcionamiento. Después de implementarse, las VM deben
configurarse. Hay aprovisionadores para hacer el trabajo posterior. El propósito de
los aprovisionadores es hacer cambios en la configuración, instalar automáticamente
paquetes y mucho más. Puede utilizar el aprovisionador de shell, que ayuda a cargar
y ejecutar scripts en la VM invitada, y el aprovisionador de archivo para ejecutar
comandos y copiar archivos en la VM.
Otra posibilidad es usar aprovisionadores de Vagrant para las herramientas de
orquestación, como Ansible y Salt. Analizaremos estas herramientas en el capítulo
siguiente. En este capítulo, junto con la documentación de los aprovisionadores en el
sitio web de Vagrant (https://www.vagrantup.com/docs/provisioning/), configuraremos
los aprovisionadores de shell y el aprovisionador de archivos. Sigamos configurando los
aprovisionadores al agregar el siguiente bloque de código al Vagrantfile.
Agréguelo al final del Vagrantfile:
# Configure the Shell Provisioner
config.vm.provision "shell", path: "provision.sh"
end # Vagrant.config
Hemos hecho referencia a un archivo, provision.sh, en el aprovisionador de shell. Así
que vamos a crear un breve script de provision.sh con algunos comandos simples:
#!/bin/sh
touch /tmp/done
touch /var/lib/cloud/instance/locale-check.skip
Implemente la VM de nuevo, y verá que Vagrant ha tomado la clave SSH que creamos
y ha comenzado el aprovisionamiento:
Ejecute este código para comprobar si el directorio /tmp/done se creó en la VM tal como
se indicó en el archivo provision.sh:
vagrant ssh -c "ls -al /tmp/done"
Packer | 261
Packer
Para un desarrollador, especialmente si hay muchas personas que trabajan en la
misma aplicación, es importante tener un entorno estandarizado. Si no está usando la
tecnología de contenedores (consulte el Capítulo 9, Virtualización de contenedores en
Azure y el Capítulo 10, Cómo trabajar con Azure Kubernetes Service, para obtener más
información sobre esta tecnología), Vagrant es una herramienta excelente que ayuda
a los desarrolladores con esta tarea y administra el ciclo de vida de una VM para que
todo se ejecute rápidamente de una manera reproducible. Aprovisiona la configuración
en función de las ofertas de imágenes o de un VHD personalizado. Es todo lo que
necesita si desea desarrollar su aplicación en la nube.
Pero si desea entornos más complejos, crear sus propias imágenes, implementar varias
máquinas, entornos en diferentes nubes y mucho más, no es imposible del todo, pero tan
pronto como lo haya intentado, notará que Vagrant no está hecho para esos escenarios.
Aquí es donde otro producto de HashiCorp es útil: Packer. En esta sección, vamos a usar
Packer con una configuración muy similar a la que usamos antes con Vagrant.
Cierre la sesión y vuelva a iniciarla. Casi todas las distribuciones agregan el directorio
~/bin a la variable PATH tan pronto como está disponible, pero debe cerrar la sesión
y volver a iniciarla.
Compruebe la variable PATH mediante la ejecución de $PATH. Si no puede ver la carpeta
bin en el directorio principal agregado a la ruta de acceso, ejecute lo siguiente:
export PATH=~/bin:$PATH
Compruebe la instalación:
packer version
Valide la sintaxis:
packer validate ubuntu.json
264 | Implementación de sus máquinas virtuales
Packer tarda unos minutos en compilar la VM, ejecutar los aprovisionadores y limpiar
la implementación.
Una vez completada la compilación, Packer le dará un resumen de lo que se creó,
como el grupo de recursos, el lugar donde se implementó la VM, el nombre de la
imagen y la ubicación:
La compilación creará una imagen, pero no una VM en ejecución. Desde la imagen que
creó Packer, puede implementar una máquina con este comando:
az vm create \
--resource-group LinuxOnAzure \
--name mypackerVM \
--image myPackerImage \
--admin-username azureuser \
--generate-ssh-keys
Para limpiar el entorno y eliminar la imagen que creó Packer, ejecute el siguiente
comando:
az resource delete --resource-group LinuxOnAzure --resource-type images \
--namespace Microsoft.Compute --name myPackerImage
El archivo JSON que proporcioné anteriormente en este capítulo es suficiente para
crear una imagen. Es muy similar a lo que hicimos con Vagrant, pero para convertirlo en
una imagen que pueda implementarse, tenemos que generalizar la VM, lo que significa
permitir que se use la imagen para varias implementaciones. Agregar /usr/sbin/waagent
-force -deprovision+user & export HISTSIZE=0 && sync al código generalizará la VM.
No se preocupe por este código: lo volverá a ver cuando generalicemos la VM a través
de la CLI de Azure en la siguiente sección.
266 | Implementación de sus máquinas virtuales
execute_command es un comando que se usa para ejecutar el script como el usuario correcto.
Valide la plantilla con el comando packer validate, como lo hicimos antes, para evitar
errores y volver a compilar la imagen.
Hasta ahora, hemos creado la imagen con Packer, pero esto también se puede hacer con
la CLI de Azure y PowerShell. De esto se trata la siguiente sección.
VHD y máquinas virtuales personalizadas | 267
Por lo tanto, necesitamos imágenes personalizadas con las que podemos personalizar
la imagen y mitigar los problemas o inconvenientes. No estamos sugiriendo que las
ofertas nativas no sean seguras o no puedan cumplir el objetivo, pero en un entorno
empresarial, hay escenarios como “Traiga su propia suscripción” para VM de RHEL/
SLES y software de terceros de fabricantes de software independientes (ISV)
empaquetado como imágenes con las que debe usar las imágenes personalizadas.
Continuemos para ver cómo puede usar imágenes personalizadas en Azure.
268 | Implementación de sus máquinas virtuales
4. Desasigne la VM:
az vm deallocate --resource-group $myRG --name $myVM
5. Márquela como generalizada. Esto significa permitir que se cree una imagen para
varias implementaciones:
az vm generalize --resource-group $myRG --name $myVM
6. Cree una imagen a partir de la VM en este grupo de recursos:
destIMG=customUbuntu
#Create VM
New-AzVm '
-ResourceGroupName $myRG '
-Name $myVM '
-ImageName $AZimage '
-Location $myLocation '
-VirtualNetworkName "$myVM-Vnet" '
-SubnetName "$myVM-Subnet" '
-SecurityGroupName "$myVM-NSG" '
-PublicIpAddressName "$myVM-pip"
PowerShell puede solicitarle que escriba las credenciales. Ingrese las credenciales para
acceder a la VM. Después, procederemos a la desasignación de la VM:
Stop-AzureRmVM -ResourceGroupName <resource group>'
-Name <vm name>
Como hicimos antes, ahora tenemos que marcar la VM como generalizada:
Set-AzVm -ResourceGroupName <resource group> -Name <vm name> '
-Generalized
Vamos a capturar la información de la VM y guardarla en una variable porque la
necesitaremos para crear la configuración de la imagen:
$vm = Get-AzVM –Name <vm name> -ResourceGroupName <resource group name>
VHD y máquinas virtuales personalizadas | 271
Dado que tenemos la configuración almacenada en $image, úsela para crear la imagen:
New-AzImage -Image $image -ImageName <image name> '
-ResourceGroupName <resource group name>
Compruebe que se haya creado la imagen:
Get-AzImage –ImageName <Image Name>
Ejecutar el comando anterior le dará una salida similar al siguiente, con los detalles de
la imagen que creó:
Si desea crear una VM con la imagen que acabamos de generar, ejecute el siguiente comando:
New-AzVm '
-ResourceGroupName "<resource group name>" '
-Name "<VM Name>" '
-ImageName "<Image Name>" '
-Location "<location>" '
-VirtualNetworkName "<vnet name>" '
-SubnetName "<subnet name>" '
-SecurityGroupName "<nsg name>" '
-PublicIpAddressName "<public IP name>"
272 | Implementación de sus máquinas virtuales
Para resumir lo que hicimos, creamos una VM, la generalizamos y creamos una
imagen que se puede utilizar aún más para implementar varias VM. También hay un
método alternativo para crear varias VM a partir de una imagen de referencia, que
usa “instantáneas”. Esto se tratará en la siguiente sección.
New-AzSnapshot '
-Snapshot $snapshot -SnapshotName <snapshot name> '
-ResourceGroupName <resource group>
2. A medida que necesitemos el ID de la instantánea para un paso posterior,
reinicializaremos la variable de la instantánea:
$snapshot = Get-AzSnapshot –SnapshotName <Snapshot Name>
3. El siguiente paso consiste en crear la configuración de la imagen a partir de
la instantánea.
$imageConfig = New-AzImageConfig -Location <location>
VHD personalizados
Puede crear completamente su propia imagen desde cero. En este escenario, tiene que
compilar su propio archivo VHD. Existen varias maneras de hacerlo:
• Cree una VM en Hyper-V o en VirtualBox, que es un hipervisor gratuito disponible
para Windows, Linux y macOS. Ambos productos admiten VHD de forma nativa.
• Cree su VM en VMware Workstation o KVM, y úselo en Linux qemu-img para
convertir la imagen. Para Windows, Microsoft Virtual Machine Converter está
disponible en https://www.microsoft.com/es-xl/download/details.aspx?id=42497.
Esto incluye un cmdlet de PowerShell, ConvertTo-MvmcVirtualHardDisk, para
realizar la conversión.
Nota
Azure solo admite archivos VHD Tipo 1 y debe tener un tamaño virtual
alineado a 1 MB. En el momento de escribir este libro, el Tipo estaba disponible
en versión preliminar (https://docs.microsoft.com/es-xl/azure/virtual-machines/
windows/generation-2).
274 | Implementación de sus máquinas virtuales
Azure se ejecuta en Hyper-V. Linux requiere que ciertos módulos del kernel se ejecuten
en Azure. Si la VM se creó fuera de Hyper-V, es posible que los instaladores de Linux no
incluyan los controladores para Hyper-V en el disco RAM inicial (initrd o initramfs),
a menos que la VM detecte que se está ejecutando en un entorno de Hyper-V.
Cuando se usa un sistema de virtualización diferente (como VirtualBox o KVM) para
preparar la imagen de Linux, es posible que deba volver a compilar la imagen de initrd
para que, al menos, los módulos de kernel hv_vmbus y hv_storvsc estén disponibles
en el disco RAM inicial. Este problema conocido es para los sistemas basados en la
distribución de Red Hat ascendente y, posiblemente, para otros.
El mecanismo para volver a compilar la imagen de initrd o initramfs puede
variar según la distribución. Consulte la documentación o el soporte técnico de
su distribución para conocer el procedimiento adecuado. Este es un ejemplo de
recompilación de initrd mediante el uso de la utilidad mkinitrd:
1. Realice una copia de seguridad de la imagen existente de initrd:
cd /boot
sudo cp initrd-'uname -r'.img initrd-'uname -r'.img.bak
2. Recompile initrd con los módulos de kernel hv_vmbus y hv_storvsc kernel:
sudo mkinitrd --preload=hv_storvsc --preload=hv_vmbus -v -f initrd-'uname
-r'.img 'uname -r'
Es casi imposible describir todas las opciones disponibles para cada distribución
de Linux y cada hipervisor. En general, lo que debe hacer se enumera aquí. Es
muy importante que sigamos los pasos con precisión, de lo contrario, esta tarea
no se puede cumplir. Recomendamos seguir la documentación de Microsoft para
esto (https://docs.microsoft.com/es-xl/azure/virtual-machines/linux/create-
upload-generic).
3. Modifique la línea de arranque del kernel en GRUB o GRUB2 para incluir los
siguientes parámetros, de modo que todos los mensajes de la consola se envíen
al primer puerto serie. Estos mensajes pueden ayudar al Soporte técnico de Azure
para depurar cualquier problema:
console=ttyS0,115200n8 earlyprintk=ttyS0,115200 rootdelay=300
4. Microsoft también recomienda eliminar los siguientes parámetros, si existen:
rhgb quiet crashkernel=auto
5. Instale el agente para Linux de Azure porque es necesario para aprovisionar
imágenes de Linux en Azure. Puede instalarlo con el archivo rpm o deb, o puede
instalarlo manualmente mediante los pasos disponibles en la Guía del agente para Linux
(https://docs.microsoft.com/es-xl/azure/virtual-machines/extensions/agent-linux).
VHD y máquinas virtuales personalizadas | 275
Para simplificar, vamos a omitir los pasos anteriores y descargar la imagen oficial del
repositorio de imágenes en la nube de Ubuntu porque lo más importante es la carga
de la imagen en Azure. Descargue la imagen de la nube desde https://cloud-images.
ubuntu.com/bionic/. Esta página web contiene todas las versiones de Bionic, y puede
navegar por los directorios y descargar el archivo tar.gz para Azure. El nombre del
archivo será similar a bionic-server-cloudimg-amd64-azure.vhd.tar.gz; sin embargo,
este nombre puede variar un poco según la versión que esté usando.
Ahora tenemos que cargar el VHD en Azure:
1. Para empezar, es bueno tener una cuenta de almacenamiento independiente para
las imágenes, así que vamos a crear una nueva cuenta de almacenamiento. Aquí
usaremos Premium_LRS, pero si lo desea, puede usar Standard_LRS también para
ahorrar algunos costos:
az storage account create --location <location> \
--resource-group <resource group> --sku Premium_LRS \
--name <account name> --access-tier Cool --kind StorageV2
2. Guarde la salida para su uso posterior. Enumere las claves de acceso:
az storage account keys list --account-name <storage account name>\
--resource-group <resource group>
3. Vuelva a guardar la salida. Lo siguiente que necesitamos es un contenedor para
almacenar los archivos:
az storage container create \
--account-name <storage account>\
--account-key <storage account key 1>
--name <container name>
276 | Implementación de sus máquinas virtuales
Nota
También puede cargar el archivo con Azure Portal o PowerShell. Otros métodos
son el Explorador de Azure Storage (https://azure.microsoft.com/es-xl/features/
storage-explorer/) o utilidades de Azure VHD (https://github.com/Microsoft/azure-
vhd-utils). El último método es increíblemente rápido.
Nota
Puede hacer que las imágenes de VHD sean públicas; un buen ejemplo de esto
es una distribución de Linux menos conocida llamada NixOS. En su sitio web,
https://nixos.org/nixos/download.html, describen una forma de implementar
su sistema operativo en Azure.
Concluyamos lo que hemos hecho. Aquí aplicamos dos enfoques. Creamos y cargamos
un VHD de Linux desde una VM existente y, luego, descargamos manualmente un
VHD de Ubuntu y lo usamos. De cualquier manera, lo subiremos a una cuenta de
almacenamiento y crearemos una imagen usándolo. Esta imagen es reutilizable
y puede implementar todas las VM que desee.
El proceso de automatización y las herramientas disponibles son muchísimas. En el
siguiente capítulo, continuaremos con el proceso de automatización y analizaremos
las herramientas más utilizadas, que son Ansible y Terraform.
Resumen
Al principio de este capítulo, preguntamos por qué y cuándo debemos usar la
automatización en Azure. Más adelante, agregamos preguntas sobre el uso de las
imágenes que ofrece Azure.
Con estas preguntas en mente, exploramos las opciones para automatizar nuestras
implementaciones:
• Creación de scripts
• Plantillas de ARM
• Vagrant
• Packer
• Creación y uso de sus propias imágenes
278 | Implementación de sus máquinas virtuales
Vagrant y Packer son ejemplos de soluciones de terceros que son herramientas muy
populares para crear y recrear fácilmente los entornos como una parte importante de
su proceso de desarrollo.
Es importante saber que todas las técnicas descritas en este capítulo se pueden
combinar en una solución completa. Por ejemplo, puede usar cloud-init junto con ARM,
pero también con Vagrant.
La orquestación y automatización están muy relacionadas. En este capítulo, vimos
la automatización, especialmente como parte de los entornos de desarrollo, para
automatizar la implementación de VM. La automatización suele ser una solución difícil
para mantener su carga de trabajo después del desarrollo y la implementación. Aquí es
donde entra la orquestación, como se abarca en el siguiente capítulo.
Preguntas
1. ¿Cuáles son las principales razones para usar las implementaciones automatizadas
en Azure?
2. ¿Cuál es el objetivo de la automatización en los entornos de desarrollo?
3. ¿Puede describir las diferencias entre creación de scripts y automatización?
4. ¿Puede nombrar algunas de las opciones de implementación automatizadas
disponibles en Azure?
5. ¿Cuál es la diferencia entre Vagrant y Packer?
6. ¿Por qué debería usar su propia imagen en lugar de una imagen de Azure?
7. ¿Qué opciones hay disponibles para crear su propia imagen?
Tal vez pueda hallar tiempo para terminar el script de ejemplo de la sección Creación de
scripts, en el lenguaje de su elección.
Lectura adicional | 279
Lectura adicional
Especialmente con respecto a la CLI de Azure, PowerShell y ARM, la documentación
de Azure contiene una gran cantidad de información valiosa, con muchos ejemplos.
Además, todo lo que escribimos en la sección Lectura adicional del Capítulo 2,
Introducción a la nube de Azure, también es importante para este capítulo.
Otro recurso que ofrece Microsoft son sus blogs. Si visita https://blogs.msdn.microsoft.
com/wriju/category/azure/, encontrará muchas publicaciones interesantes sobre la
automatización, incluidos ejemplos más detallados.
En su blog en https://michaelcollier.wordpress.com, Michael S. Collier proporciona
mucha información con respecto a Azure. Casi todas las publicaciones incluyen
posibilidades de creación de scripts y automatización.
No existen muchos libros recientes sobre Vagrant. Estamos seguros de que realmente
disfrutará Infrastructure as Code (IAC) Cookbook de Stephane Jourdan y Pierre Pomes,
publicado hace un año. Este libro no solo se refiere a Vagrant; también abarca otras
soluciones, como cloud-init y Terraform. Los autores crearon un libro que no solo
es una gran introducción, sino que también lograron que se pueda usar como guía
de referencia.
¿Le podemos sugerir un libro que se publicó hace poco? Hands-On DevOps with
Vagrant: Implement End-to-End DevOps and Infrastructure Management Using Vagrant,
de Alex Braunton. También vale la pena ver sus publicaciones en YouTube con respecto
a este tema.
Exploración de la
8
automatización de la
configuración continua
Hasta ahora, hemos trabajado con máquinas virtuales únicas, que implementamos
y configuramos de forma manual. Esto es bueno para los laboratorios y entornos muy
pequeños, pero si tiene que administrar entornos más grandes, es un trabajo que lleva
mucho tiempo e incluso es aburrido. También es muy fácil cometer errores y olvidar
cosas, como las leves diferencias entre las VM, por no mencionar los riesgos para la
estabilidad y seguridad asociados. Por ejemplo, elegir la versión incorrecta durante
la implementación dará lugar a problemas de coherencia y realizar una actualización
después es un proceso tedioso.
282 | Exploración de la automatización de la configuración continua
Requisitos técnicos
En la práctica, necesitará al menos una VM como máquina de control, o puede usar su
estación de trabajo que ejecuta Linux o Subsistema de Windows para Linux ((WSL).
Junto con esto, necesitamos un nodo, que debe ser una VM de Azure. Sin embargo, para
ofrecer una mejor explicación, hemos implementado tres nodos. Si tiene restricciones
presupuestarias para su suscripción de Azure, no dude en continuar con un nodo. No
importa qué distribución de Linux esté usando. Los ejemplos de esta sección para orquestar
el nodo son para un nodo Ubuntu, pero es fácil traspasarlos a otras distribuciones.
En este capítulo, se exploran varias herramientas de orquestación. Para cada
herramienta, necesitará un entorno limpio. Por lo tanto, cuando haya terminado con la
sección de Ansible en este capítulo, elimine las VM e implemente otras nuevas antes de
empezar con Terraform.
Este ejemplo es para un servidor web muy simple. Piense en un escenario complejo donde
tiene un servidor web de front-end y bases de datos backend, por lo que la configuración
involucrada es muy alta. Hasta ahora, hemos hablado de una sola VM. ¿Qué pasa si desea
varias VM con la misma configuración? Volvemos al principio, donde hay que repetir la
configuración varias veces, una tarea lenta y aburrida. Aquí entra el rol de la orquestación,
como analizamos en la introducción. Podemos hacer uso de herramientas de orquestación
para implementar la VM con el estado que queramos. Las herramientas se ocuparán de la
configuración. Además, en Azure tenemos la configuración de invitado de Azure Policy,
que se puede usar para auditar la configuración. Con esta directiva, podemos definir una
condición que deba cumplir la VM. Si se produce un error en la evaluación o no se cumple
la condición, Azure marcará esta máquina como no compatible.
Gran parte de este capítulo se trata de Ansible, pero también trataremos la DSC de
PowerShell y Terraform como ejemplos de implementaciones declarativas. En este
capítulo, el enfoque es comprender la orquestación y aprender lo suficiente para
empezar. Y, por supuesto, analizaremos la integración con Azure.
Uso de Ansible | 285
Uso de Ansible
Ansible tiene una naturaleza mínima, casi no tiene dependencias y no implementa
agentes en los nodos. Solo se requieren OpenSSH y Python para ansible. También
es muy confiable: los cambios se pueden aplicar varias veces sin cambiar el resultado
más allá de la aplicación inicial y no debería haber efectos secundarios en el resto del
sistema (a menos que escriba código realmente incorrecto). Hay un gran enfoque en la
reutilización del código, lo que hace que sea aún más confiable.
Ansible no tiene una curva de aprendizaje muy pronunciada. Puede empezar con
solo unas líneas de código y escalar verticalmente después sin provocar problemas.
En nuestra opinión, si desea probar una herramienta de orquestación, empiece con
Ansible y, si desea probar otra, la curva de aprendizaje será mucho menos pronunciada.
Instalación de Ansible
En Azure Marketplace, hay una VM lista para usar disponible para Ansible. Actualmente,
hay tres versiones de Ansible disponibles en Azure Marketplace: Ansible Instance,
Ansible Tower y AWX, que es una edición comunitaria de Ansible Tower. En este libro,
nos centraremos en el proyecto comunitario que está disponible gratis; es más que
suficiente para aprender y comenzar a usar Ansible. Después de eso, puede ir al sitio
web de Ansible para explorar las diferencias, descargar la versión de prueba de la
edición empresarial de Ansible y decidir si la necesita.
Existen varias maneras de instalar Ansible:
• Usar el repositorio de su distribución
• Usar la versión más reciente disponible en https://releases.ansible.com/ansible
• Usar GitHub: https://github.com/ansible
• Usar el instalador de Python, el método preferido, que funciona en todos los
sistemas operativos:
pip install ansible[azure]
En los repositorios estándar de Red Hat y CentOS, pip de Python no está disponible
para la instalación. Tiene que usar el repositorio adicional de EPEL:
sudo yum install epel-release
sudo yum install python-pip
Después de instalar Ansible, compruebe la versión:
ansible --version
286 | Exploración de la automatización de la configuración continua
No tiene que instalar Ansible si no lo desea: Ansible está preinstalado en Azure Cloud
Shell. En el momento de escribir este libro, Cloud Shell es compatible con la versión
2.9.0 de Ansible. Sin embargo, para que tenga un tutorial de la instalación, vamos a ver
la instalación local de Ansible en la VM. Para la integración con Azure, también debe
instalar la CLI de Azure para obtener la información que deberá proporcionar a Ansible.
Configuración de SSH
La máquina en la que instaló Ansible ahora se denomina Ansible maestra o, en
otras palabras, es solo una VM con Ansible, el archivo de configuración de Ansible
y las instrucciones para la orquestación. La comunicación con los nodos se realiza
mediante protocolos de comunicación. Para Linux, se usa SSH como un protocolo de
comunicación. Para que Ansible pueda comunicarse de forma segura con los nodos,
use la autenticación basada en claves. Si no lo ha hecho, genere un par de claves SSH
y copie la clave en la VM que desea orquestar.
Para generar la clave SSH, use este comando:
ssh-keygen
Una vez que genere la clave, se guarda en el directorio de inicio del usuario en el
directorio .ssh de forma predeterminada. Para mostrar la clave, use este comando:
cat ~/.ssh/id_rsa.pub
Una vez que tenemos la clave, tenemos que copiar este valor en el servidor del nodo.
Siga estos pasos para copiar la clave:
1. Copie el contenido del archivo id_rsa.pub.
2. SSH al servidor del nodo.
3. Cambie a superusuario con el comando sudo.
4. Edite el archivo authorized_keys en ~/.ssh/.
5. Pegue la clave que copiamos del servidor de Ansible.
6. Guarde y cierre el archivo.
Ansible procesará la lista anterior y usará el primer archivo que encuentre; todos los
demás se omitirán.
Cree el directorio ansible en /etc si no está disponible y agregue un archivo llamado
ansible.cfg. Aquí es donde vamos a guardar nuestra configuración:
[defaults]
inventory = /etc/ansible/hosts
Probemos lo siguiente:
ansible all -a "systemctl status sshd"
Este comando, denominado comando ad hoc, ejecuta systemctl status sshd en todos
los hosts definidos en /etc/ansiblehosts. Si tiene varios nombres de usuario para cada
host, también puede especificar el nombre de usuario para estos nodos en el formato
que se muestra en el siguiente archivo de hosts de Ansible:
<ip address> ansible_ssh_user='<ansible user>'
Por lo tanto, puede agregar el usuario a los elementos de línea del archivo de inventario
como se muestra en la siguiente captura de pantalla, si es necesario. El archivo se verá
así para tres nodos:
Figura 8.1: Adición del usuario a los elementos de línea de archivo de inventario
Archivo de inventario
El archivo de inventario de Ansible define los hosts y grupos de hosts. En función de
esto, puede llamar al host o al grupo (grupo de hosts) y ejecutar un manual específico
o ejecutar un comando.
Aquí, vamos a llamar a nuestro grupo nodepool y agregaremos direcciones IP de
nuestros nodos. Dado que todas nuestras VM están en la misma red virtual de Azure,
estamos usando la IP privada. Si están en diferentes redes, puede agregar la IP pública.
Aquí estamos usando tres VM para explicar. Si solo tiene un nodo, solo ingrese uno.
Además, puede usar el nombre de DNS de las VM, pero deben agregarse a su archivo
/etc/hosts para su resolución:
[nodepool]
10.0.0.5
10.0.0.6
10.0.0.7
Otro parámetro que será útil es ansible_ssh_user. Puede usarlo para especificar el
nombre de usuario que se utiliza para iniciar sesión en el nodo. Este escenario entra
en juego si usa varios nombres de usuario en sus VM.
En lugar de usar all en nuestro ejemplo, puede usar un nombre de grupo que sea
ansible-nodes. También es posible usar variables genéricas que sean válidas para
cada host y reemplazarlas por servidor; por ejemplo:
[all:vars]
ansible_ssh_user='student'
[nodepool]
<ip address> ansible_ssh_user='other user'
A veces, necesitará privilegios para ejecutar un comando:
ansible nodepool-a "systemctl restart sshd"
Nota
Es posible que reciba advertencias de obsolescencia al ejecutar el comando
ansible all. Para eliminar esto, use deprecation_warnings=False en ansible.cfg.
- hosts: all
tasks:
generate_ssh_key: yes
group: users
groups:
- sudo
- adm
shell: /bin/bash
skeleton: /etc/skel
En la salida, puede ver que todos los hosts están OK y se creó el usuario:
Solo para asegurarse de que el usuario esté creado, revisaremos el archivo /etc/passwd
en todos los hosts. En la salida, podemos ver que se ha creado el usuario:
Asegúrese de que la sangría sea correcta porque YAML es un lenguaje muy estricto
cuando se trata de la sangría y el espacio en blanco. El uso de un editor, como vi,
Emacs o Visual Studio Code, con compatibilidad de YAML realmente ayuda.
Si está obligado a ejecutar una escalada de privilegios de comandos, puede usar become
y become_method o –b.
Para comprobar la sintaxis de Ansible, use el siguiente comando:
ansible-playbook --syntax-check Ansible/example1.yaml
Grupo de recursos
Vamos a comprobar que todo funciona según lo esperado. Cree un nuevo manual
llamado resourcegroup.yaml con el siguiente contenido:
---
- hosts: localhost
tasks:
Tenga en cuenta que la directiva para hosts es localhost. Ejecute el manual y compruebe
si se creó el grupo de recursos:
az group show --name Ansible-Group
Máquina virtual
Vamos a crear una VM en Azure con Ansible. Para ello, cree un archivo virtualmachine.
yaml con el siguiente contenido. Examine el campo name de cada bloque para entender
lo que hace el código:
- hosts: localhost
tasks:
- name: Create Storage Account
azure_rm_storageaccount:
resource_group: Ansible-Group
name: ansiblegroupsa
account_type: Standard_LRS
.
.
.
- name: Create a CentOS VM
azure_rm_virtualmachine:
resource_group: Ansible-Group
Uso de Ansible | 295
name: ansible-vm
vm_size: Standard_DS1_v2
admin_username: student
admin_password:welk0mITG!
image:
offer: CentOS
publisher: OpenLogic
sku: '7.5'
version: latest
Debido a la longitud del código, solo mostramos algunas líneas aquí. Puede descargar
todo el archivo virtualmachine.yaml desde la carpeta chapter 8 en el repositorio de
GitHub de este libro.
En la siguiente captura de pantalla, puede ver que Ansible crea todos los recursos
necesarios para la VM:
Figura 8.6: Creación de todos los recursos necesarios para la VM con Ansible
En esta sección, vamos un paso más allá. En lugar de usar un inventario estático,
le preguntamos a Azure qué se está ejecutando en su entorno mediante scripts de
inventario dinámicos.
El primer paso es descargar el script de inventario dinámico para Azure. Ejecútelo con
sudo si no es un usuario raíz:
cd /etc/ansible
wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/
inventory/azure_rm.py
chmod +x /etc/ansible/azure_rm.py
Si tiene un inicio de sesión diferente para diferentes VM, siempre puede usar la
directiva de usuario por tarea. Aquí estamos usando azure, que significa todas las VM.
Siempre puede consultar una máquina con el nombre de la VM. Por ejemplo, puede
hacer ping a la VM ansible-node3 con una credencial de usuario:
Idealmente, Ansible espera que use claves SSH en lugar de contraseñas. Si desea usar
una contraseña, puede usar –extra-vars y pasar la contraseña. Tenga en cuenta que
para esto es necesario instalar una aplicación llamada sshpass. Para hacer ping a una
VM en Azure que use una contraseña a través de Ansible, ejecute el siguiente comando:
ansible -i azure_rm.py ansible-vm -m ping \
--extra-vars "ansible_user=<username> ansible_password=<password>"
Tomemos la instancia de la VM que creamos con Ansible en el ejemplo anterior, donde
el nombre de usuario era student y la contraseña era welk0mITG.. En la captura de
pantalla, puede ver que el ping tiene éxito. Es posible que vea algunas advertencias,
pero pueden omitirse de forma segura. Sin embargo, se necesita una investigación
más detallada si se produce un error con el ping:
Funciona de manera muy similar al archivo hosts. La sección [azure] significa todas las
VM. También puede proporcionar secciones para lo siguiente:
• Nombre de la ubicación
• Nombre del grupo de recursos
• Nombre del grupo de seguridad
• Clave de la etiqueta
• Valor de la clave de la etiqueta
Otro método para seleccionar una o más VM es usar etiquetas. Para poder etiquetar una
VM, necesitará el ID:
az vm list --output tsv
Haga clic en cambiar y agregue una etiqueta, con o sin un valor (puede usar el valor
para filtrar el valor también). Para comprobar, use el host del nombre de la etiqueta:
ansible -i /etc/ansible/azure_rm.py webserver -m ping
300 | Exploración de la automatización de la configuración continua
- hosts: webserver
tasks:
Una vez que se ha ejecutado el manual, si revisa la VM, puede ver que Apache
está instalado.
Como se mencionó anteriormente, Ansible no es la única herramienta. Existe
otra herramienta popular llamada Terraform. En la próxima sección, analizaremos
Terraform en Azure.
Uso de Terraform | 301
Uso de Terraform
Terraform es otra herramienta de Infraestructura como código (IaC) que desarrolló
HashiCorp. Es posible que se pregunte por qué se llama herramienta de IaC. La razón
es que puede definir cómo su infraestructura debe usar el código, y Terraform lo
ayuda a implementarlo. Terraform usa el Lenguaje de Configuración HashiCorp (HCl);
sin embargo, también puede usar JSON. Terraform es compatible con macOS,
Linux y Windows.
Terraform es compatible con una amplia gama de recursos de Azure, como redes,
subredes, almacenamiento, etiquetas y VM. Si recuerda, analizamos las formas
imperativas y declarativas para escribir código. Terraform es declarativa por naturaleza,
y puede mantener el estado de la infraestructura. Una vez implementada, Terraform
recuerda el estado actual de la infraestructura.
Como en todas las secciones, la primera parte del proceso implica la instalación de
Terraform. Procedamos con la instalación en Linux de Terraform.
Instalación
El archivo ejecutable principal de Terraform se puede descargar en https://www.terraform.
io/downloads.html y puede copiarse en uno de los directorios agregados a su variable
$PATH. También puede usar el comando wget para descargar el archivo ejecutable principal.
Para ello, primero debe descubrir la versión más reciente de Terraform en el vínculo
mencionado anteriormente. En el momento de la escritura, la última versión disponible
era 0.12.16.
Ahora que tenemos la versión, descargaremos el archivo ejecutable mediante wget con
el siguiente comando:
wget https://releases.hashicorp.com/terraform/0.12.17/terraform_0.12.17_
linux_amd64.zip
Nota
Es posible que unzip no esté instalado de forma predeterminada. Si se produce un
error, instale unzip con apt o yum según la distribución que esté utilizando.
302 | Exploración de la automatización de la configuración continua
Autenticación en Azure
Existen varias formas en las que puede autenticar en Azure. Puede usar la CLI de
Azure, la entidad de servicio con un certificado de cliente, la entidad de servicio y el
secreto de cliente, y muchos más métodos. Para fines de prueba, la CLI de Azure que
usa el comando de inicio de sesión az es la opción correcta. Sin embargo, si queremos
automatizar la implementación, este no es el método ideal. Deberíamos ir a la entidad
de servicio y el secreto de cliente, lo mismo que hicimos en Ansible.
Comencemos por crear una entidad de servicio para Terraform. Si ya tiene una entidad
de servicio creada para la sección anterior, úsela. Para crear una entidad de servicio
nueva en la CLI de Azure, use este comando:
az ad sp create-for-rbac -n terraform
En este punto, es posible que ya esté familiarizado con la salida, que contiene el appID,
la contraseña y el ID de inquilino.
Anote los valores en la salida. Crearemos variables para almacenar este valor:
export ARM_CLIENT_ID="<appID>"
export ARM_CLIENT_SECRET="<password>"
export ARM_SUBSCRIPTION_ID="<subscription ID>"
export ARM_TENANT_ID="<tenant ID>"
Por lo tanto, hemos almacenado todos los valores en variables que Terraform usará para
la autenticación. Dado que hemos tratado la autenticación, escribamos código en HCL
con el que podemos implementar recursos en Azure.
Uso de Terraform | 303
Implementación en Azure
Puede usar cualquier editor de código para este propósito. Dado que ya estamos
en una máquina Linux, puede usar vi o nano. Si lo desea, también puede usar Visual
Studio Code, que tiene extensiones para Terraform y Azure, lo que le proporcionará
IntelliSense y resaltado de sintaxis.
Crearemos un directorio terraform para almacenar todo nuestro código y, en el
directorio terraform, crearemos más directorios según lo que vamos a implementar.
En nuestro primer ejemplo, vamos a usar Terraform para crear un grupo de recursos en
Azure. Más adelante, analizaremos cómo implementar una VM en este grupo de recursos.
Por lo tanto, para crear un directorio terraform y una subcarpeta resource-group dentro
de este directorio, ejecute el siguiente comando:
mkdir terraform
cd terraform && mkdir resource-group
cd resource-group
A continuación, cree un archivo main.tf con el siguiente contenido:
provider "azurerm" {
version = "~>1.33"
}
La directiva resource indica que vamos a implementar un recurso de Azure del tipo
azurerm_resource_group con dos parámetros, name y location.
rg significa configuración del recurso. Los nombres de recursos deben ser únicos por
tipo en cada módulo. Por ejemplo, si desea crear otro grupo de recursos en la misma
plantilla, no puede volver a usar rg porque ya lo usó. En su lugar, puede usar cualquier
otro que no sea rg, como rg2.
Antes de iniciar la implementación con la plantilla, primero tenemos que inicializar
el directorio de proyecto, que es nuestra carpeta resource-group. Para inicializar
Terraform, ejecute lo siguiente:
terraform init
Una vez que haya ingresado los datos, Terraform iniciará la creación de recursos.
Después de la creación, Terraform le mostrará un resumen de todo lo que se creó
y cuántos recursos se agregaron y destruyeron, como se muestra aquí:
resource "azurerm_virtual_machine" "myterraformvm" {
name = "tf-VM"
location = "eastus"
resource_group_name = azurerm_resource_group.rg.name
network_interface_ids = [azurerm_network_interface.nic.id]
vm_size = "Standard_DS1_v2"
storage_os_disk {
name = "tfOsDisk"
caching = "ReadWrite"
create_option = "FromImage"
managed_disk_type = "Standard_LRS"
}
storage_image_reference {
publisher = "Canonical"
offer = "UbuntuServer"
sku = "16.04.0-LTS"
version = "latest"
}
os_profile {
computer_name = "tfvm"
admin_username = "adminuser"
admin_password = "Pa55w0rD!@1234"
}
os_profile_linux_config {
disable_password_authentication = false
}
}
308 | Exploración de la automatización de la configuración continua
También hay otro comando: el comando show. Esto mostrará el estado completo de la
implementación, como se muestra en la siguiente captura de pantalla:
Como estas plantillas son un poco avanzadas, usarán variables en lugar de los valores
que se repiten. Sin embargo, una vez que se acostumbre, entenderá lo eficaz que
es Terraform.
Por último, puede destruir toda la implementación o el proyecto mediante la ejecución
de lo siguiente:
terraform destroy
Esto eliminará todos los recursos que mencionamos en el archivo main.tf del proyecto.
Si tiene varios proyectos, debe navegar al directorio del proyecto y ejecutar el comando
destroy. Al ejecutar este comando, se le pedirá que confirme la eliminación; una vez que
diga yes, los recursos se eliminarán:
Figura 8.18: Eliminación de todos los recursos con el comando destroy de Terraform
312 | Exploración de la automatización de la configuración continua
Otra nota importante es que, por alguna razón, los scripts de Python que vienen
con DSC no funcionan. De vez en cuando, obtendrá un error 401 o incluso un error
indefinido. En primer lugar, asegúrese de tener la versión más reciente del servidor
OMI y DSC, e inténtelo de nuevo. A veces, hay que intentarlo dos o tres veces.
Para Ubuntu, puede descargar el archivo deb desde el repositorio de GitHub mediante
wget e instalarlo con dpkg:
dpkg –i ./omi-1.6.0-0.ssl_110.ulinux.x64.deb
Nota
Asegúrese de descargar el archivo que coincide con su versión de SSL. La versión
de SSL se puede comprobar mediante el comando openssl version.
Node "ubuntu01"{
nxPackage apache2
{
Name = "apache2"
Ensure = "Present"
PackageManager = "apt"
}
}
}
webserver
Investiguemos esta configuración. Como se indicó, es muy similar a una declaración
de función. La configuración obtiene una etiqueta y se ejecuta al final del script.
Se importan los módulos necesarios, se declara el nombre de host de la VM y se inicia
la configuración.
Uso de DSC de PowerShell | 317
También puede escribir sus propios recursos en el lenguaje MOF, C#, Python o C/C++.
Puede usar la documentación oficial que se encuentra en https://docs.microsoft.com/
es-xl/powershell/dsc/lnxbuiltinresources.
Guarde el script y ejecútelo de la siguiente manera:
pwsh -file example1.ps
Como resultado del script, se crea un directorio con el mismo nombre que el nombre
de la configuración. En él, hay un archivo localhost en formato MOF. Este es el lenguaje
que se usa para describir las clases de CIM (CIM significa Common Information Model
o Modelo de información común). CIM es un estándar abierto para la administración de
un entorno completo, incluido el hardware.
Creemos que esta descripción por sí sola es suficiente para entender por qué Microsoft
elige este modelo y el archivo de idioma correspondiente para la orquestación.
También puede cargar el archivo de configuración en Azure, en Configuraciones de DSC.
Presione el botón Compilar para generar el archivo MOF en Azure.
318 | Exploración de la automatización de la configuración continua
Hasta ahora, hemos analizado cómo se puede usar Azure Policy para auditar los
recursos de Azure, pero también se puede usar para auditar la configuración dentro
de una VM. Azure Policy logra esta tarea con el cliente y la extensión de configuración
de invitado. La extensión y el cliente trabajan mano a mano para confirmar la
configuración del SO invitado, la presencia de una aplicación, su estado y también la
configuración del entorno del SO invitado.
La configuración de invitado de Azure Policy solo puede ayudarlo a auditar la VM
invitada. Por ahora, no está disponible la aplicación de configuraciones.
Comandos
La extensión de configuración de invitado es compatible con los comandos install,
uninstall, enable, disable y update. Para ejecutar estos comandos, debe cambiar
el directorio de trabajo actual a /var/lib/waagent/Microsoft.GuestConfiguration.
ConfigurationForLinux-1.9.0/bin. Después de eso, puede encadenar los comandos
disponibles con el script guest-configuration-shim.
Nota
Compruebe si la ejecución está habilitada para el archivo. Si no es así, use chmod
+x guest-configuration-shim para establecer el permiso de ejecución.
Azure Policy se escribe como un manifiesto JSON. Como las directivas de redacción
no forman parte de este libro, puede consultar la directiva de ejemplo compartida
por Microsoft (https://github.com/Azure/azurepolicy/tree/master/samples/
GuestConfiguration/installed-application-linux). Este ejemplo es para auditar si se
instalan aplicaciones específicas dentro de las VM de Linux.
Si investiga el ejemplo, aprenderá cuáles son los componentes y cómo puede usar los
parámetros en su contexto.
322 | Exploración de la automatización de la configuración continua
Otras soluciones
Otra gran opción en el mercado de la orquestación es Puppet. Hasta hace muy poco,
el soporte para Azure en Puppet era muy limitado, pero eso está cambiando muy
rápido. El módulo de Puppet, puppetlabs/azure_arm, aún está en sus primeras etapas,
pero puppetlabs/azure le ofrece todo lo que necesita. Ambos módulos necesitan que
la CLI de Azure funcione. La integración de la CLI de Azure en el producto comercial
de Puppet Enterprise es increíblemente buena. Azure tiene una extensión de VM
disponible para las VM que se convierten en nodos de Puppet.
Puede obtener más información en https://puppet.com/products/managed-
technology/microsoft-windows-azure.
También puede usar el software Chef, que proporciona una plataforma de
automatización y orquestación que ha existido durante mucho tiempo. Su desarrollo
comenzó en 2009. El usuario escribe “recetas” que describen cómo Chef administra la
“cocina” con herramientas, como un cuchillo. En Chef, gran parte de su terminología
proviene de la cocina. Chef se integra muy bien con Azure, especialmente si usa Chef
Automate de Azure Marketplace. También hay una extensión de VM disponible. Chef
está diseñado para entornos grandes y tiene una curva de aprendizaje relativamente
pronunciada, pero vale la pena, al menos, intentarlo.
Puede obtener más información en https://www.chef.io/partners/azure/.
Resumen
Comenzamos este capítulo con una breve introducción a la orquestación, las razones
para usarla y los diferentes enfoques: imperativo en comparación a declarativo.
Después de eso, abarcamos las plataformas de Ansible, Terraform y DSC de PowerShell.
Se cubrieron muchos detalles sobre lo siguiente:
• Cómo instalar las plataformas
• Trabajar con recursos en el nivel de SO
• Integración con Azure
Preguntas | 323
Ansible es, por lejos, la solución más completa y, tal vez, la que tiene la curva de
aprendizaje menos pronunciada. Sin embargo, todas las soluciones son muy eficaces
y siempre hay formas de solucionar sus limitaciones. Y para todas las plataformas de
orquestación, el futuro es prometedor en términos de que existan más características
y capacidades.
La creación de VM de Linux no es la única forma de crear una carga de trabajo en
Azure; también puede usar la virtualización de contenedores para implementar una
plataforma para su aplicación. En el próximo capítulo, abarcaremos las tecnologías
de contenedores.
Preguntas
Para este capítulo, omitamos las preguntas normales. Active algunas VM y elija la
plataforma de orquestación que prefiera. Configure los grupos de seguridad de red
para permitir el tráfico HTTP.
Intente configurar los siguientes recursos con Ansible, Terraform o DSC de PowerShell:
1. Cree un usuario y haga que sea miembro de wheel (distribuciones basadas en RH)
o sudo (Ubuntu) del grupo.
2. Instale un servidor web Apache, entregue contenido de /wwwdata, asegúrelo con
AppArmor (Ubuntu) o SELinux (distribuciones basadas en RHEL) y entregue una
página index.html buena en este servidor web.
3. Restrinja SSH a su dirección IP. Los puertos HTTP deben estar abiertos a todo
el mundo. Puede usar los métodos de systemd al proporcionarles archivos de
reemplazo o FirewallD.
4. Implemente una nueva VM con la distribución y la versión que prefiera.
5. Cree un nuevo archivo /etc/hosts mediante variables. Si usa DSC de PowerShell,
también necesitará PowerShell para esta tarea. Para expertos: use los nombres de
host y las direcciones IP de otras máquinas de su grupo de recursos.
324 | Exploración de la automatización de la configuración continua
Lectura adicional
Realmente esperamos que haya disfrutado esta introducción a las plataformas de
orquestación. Fue solo una breve introducción para que despertar su curiosidad por
obtener más información. Todos los sitios web de las herramientas de orquestación
mencionadas en este capítulo son excelentes recursos y fáciles de leer.
Algunos recursos adicionales que vale la pena mencionar son:
• Learning PowerShell DSC: segunda edición de James Pogran.
• Ansible: Creemos que Learn Ansible de Russ McKendrick, y otros títulos del mismo
autor sobre Ansible merecen mucho crédito. Si no desea leer el libro, puede
consultar la documentación de Ansible para comenzar. Si desea algunos tutoriales
prácticos, puede usar este repositorio de GitHub: https://github.com/leucos/
ansible-tuto.
• Terraform: Terraform on Microsoft Azure - Part 1: Introduction es una serie de
blogs que escribió Julien Corioland, ingeniero sénior de software de Microsoft.
El blog incluye una serie de temas que analizan Terraform en Azure. Vale la pena
leer y probar las tareas. El blog está disponible en https://blog.jcorioland.io/
archives/2019/09/04/terraform-microsoft-azure-introduction.html.
• Mastering Chef de Mayank Joshi
• Learning Puppet de Jussi Heinonen
Virtualización de
9
contenedores en Azure
En el Capítulo 2, Introducción a la nube de Azure, iniciamos nuestro viaje en Azure con
la creación de nuestra primera carga de trabajo en Azure: la implementación de una VM
de Linux. Después de eso, cubrimos muchos aspectos del sistema operativo Linux.
En el Capítulo 7, Implementación de sus máquinas virtuales, exploramos varias opciones
para implementar sus VM, y en el Capítulo 8, Exploración de la automatización de la
configuración continua, se trató de qué hacer después en términos de administración
de la configuración mediante herramientas de orquestación.
La orquestación es una parte cada vez más importante de un movimiento llamado
DevOps. DevOps se trata de eliminar los silos clásicos de las organizaciones. Los
diferentes equipos involucrados en el desarrollo, la prueba y la implementación de
productos deben comunicarse y trabajar en conjunto. DevOps es una combinación
de filosofías, prácticas y herramientas culturales. Además, es una forma de hacer que
las implementaciones sean eventos graduales, frecuentes y rutinarios, a la vez que
restringe el impacto de los errores.
326 | Virtualización de contenedores en Azure
SO host SO host
Infraestructura Infraestructura
Al igual que las VM, los contenedores le permiten empaquetar su aplicación junto
con todas las dependencias y bibliotecas. Son entornos aislados, como las VM, y se
pueden usar para probar y ejecutar aplicaciones sin necesidad de crear varias VM.
Los contenedores también son ligeros.
En lugar de virtualizar cada componente de hardware, como con las VM, los
contenedores virtualizan en el nivel de SO. Esto significa que los contenedores tienen
una huella más pequeña que las VM. Por ejemplo, una imagen ISO de Ubuntu tendrá
un tamaño cercano a 2,4 GB; por otro lado, una imagen de contenedor de Ubuntu pesa
menos de 200 MB. Consideremos el ejemplo anterior, donde tuvimos problemas de
dependencia con Python 2.2 y terminamos creando dos VM. Con los contenedores,
podemos tener dos contenedores con una huella mucho más pequeña que dos VM.
Además, el costo y el uso de recursos del SO host es mucho menor que el de dos VM.
Los contenedores se implementan mediante un tiempo de ejecución de contenedor,
y existen diferentes tiempos de ejecución disponibles. En este capítulo, observaremos
los tiempos de ejecución de contenedores populares.
328 | Virtualización de contenedores en Azure
Otra pequeño detalle: si tiene muchos tipos diferentes de aplicaciones y casi no hay
código compartido entre esas aplicaciones, la tecnología de contenedores sigue siendo
una opción, pero es posible que las VM sean una mejor solución en este escenario.
Cubriremos un poco la historia de la tecnología de contenedores para que pueda
comprender mejor de dónde proviene. Exploraremos algunas de las soluciones
disponibles en la actualidad: systemd-nspawn y Docker. Hay más implementaciones
de virtualización de contenedores disponibles, incluso algunas de las primeras
implementaciones, como LXC. De hecho, no importa qué herramienta de contenedores
use: si entiende las ideas y los conceptos que son la base de los contenedores, es fácil
implementar las mismas ideas y conceptos con otras herramientas. Lo único que cambia
es el comando; los conceptos subyacentes para todas estas herramientas son los mismos.
El entorno chroot
En Linux, hay un sistema de archivos raíz, como se explica en el Capítulo 5, Administración
avanzada de Linux, y todo se monta en ese sistema de archivos, que será visible para los
procesos en ejecución y sus hijos.
Un proceso que se ejecuta en chroot tiene su propio sistema de archivos raíz,
completamente separado de la raíz del sistema completo, conocida como chroot jail.
En chroot jail, hay un sistema de archivos llamado fs.chroot. A menudo se usa en
desarrollo, ya que el programa que se ejecuta en chroot no puede acceder a archivos
o comandos fuera de su sistema de archivos raíz. Para poner en marcha un chroot jail
desde un directorio, ejecute lo siguiente:
chroot /<directory>
OpenVZ
En 2005, casi al mismo tiempo que Solaris comenzó su tecnología de contenedores, una
empresa llamada Virtuozzo inició el proyecto OpenVZ.
Tomaron el principio del entorno de chroot y lo aplicaron a otros recursos. Un proceso
de chroot tendrá lo siguiente:
• Un sistema de archivos raíz
• Usuarios y grupos
• Dispositivos
• Un árbol de procesos
• Una red
• Objetos de comunicación entre procesos
LXC
En 2006, los ingenieros de Google empezaron a trabajar en una característica en
el kernel de Linux llamada cgroups (grupos de control) para permitir el control de
recursos en recursos como la CPU, la memoria, E/S de disco y la red de colecciones
de procesos (grupos de recursos).
Una característica relacionada del kernel de Linux es el concepto de aislamiento de
espacios de nombres: la posibilidad de aislar los grupos de recursos para que no puedan
ver los recursos en otros grupos. Entonces, cgroups se convirtió en un espacio de nombre.
En 2008, cgroups se fusionó en el kernel de Linux y se introdujo un nuevo espacio de
nombres, el espacio de nombres usuario. Ambas tecnologías se habilitaron para dar
un nuevo paso para los contenedores: LXC.
Otros espacios de nombres disponibles son pid, mount, network, uts (nuestro nombre
de dominio) e ipc.
Ya no es necesario mantenerse al día con el desarrollo del kernel de Linux: cada componente
que se necesita está disponible, y hay una administración de recursos mucho mejor.
Recientemente, Canonical desarrolló un nuevo administrador de contenedores llamado
LXD, con LXC en su backend y como objetivo busca proporcionar una experiencia de
usuario mejorada para la administración de contenedores. Técnicamente, LXD usa LXC
a través de liblxc y su enlace Go para lograr este objetivo. Algunas de las ventajas de
LXD se indican aquí:
• Seguro
• Altamente escalable
• Simplifica el uso compartido de recursos
systemd-nspawn
systemd incluye una solución de contenedores. Comenzó como un experimento y
luego Lennart Poettering lo consideró listo para la producción. De hecho, es la base
de otra solución, Rkt. En el momento de escribir este libro, el desarrollo de Rkt había
terminado. Sin embargo, aún puede acceder al repositorio de Rkt de GitHub
(https://github.com/rkt/rkt).
systemd-nspawn no es muy conocido, pero es una solución eficaz que está disponible
en todos los sistemas Linux modernos. Se crea sobre los espacios de nombre del kernel
y systemd para la administración. Es una especie de chroot con esteroides.
Si desea obtener más información sobre las tecnologías subyacentes de los
contenedores, systemd-nspawn es un buen punto de partida. Aquí, cada componente
es visible y se puede configurar manualmente, si lo desea. La desventaja de systemd-
nspawn es que tiene que hacer todo por su cuenta, desde crear la imagen y la
orquestación hasta la alta disponibilidad: todo es posible, pero tiene que compilarlo.
systemd-nspawn | 331
systemd-firstboot
systemd-firstboot es una buena forma de configurar algunas cosas si inicia el
contenedor por primera vez. Puede configurar los siguientes parámetros:
• Configuración regional del sistema (--locale=)
• Mapa del teclado del sistema (--keymap=)
• Zona horaria del sistema (--timezone=)
• Nombre de host del sistema (--hostname=)
• ID de máquina del sistema (--machine-id=)
• Contraseña del usuario raíz (--root-password=)
systemd-nspawn | 333
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/systemd-firstboot --locale=en_US-utf8 --root-
password=welk0mITG! --timezone=Europe/Amsterdam
StandardOutput=tty
StandardInput=tty
StandardError=tty
334 | Virtualización de contenedores en Azure
Habilite el servicio:
systemctl enable systemd-firstboot
Limpie la configuración:
rm /etc/\
{machine-id,localtime,hostname,shadow,locale.conf,securetty}
Salga del entorno de chroot con Ctrl + D.
Hay muchos otros parámetros de machinectl que vale la pena investigar. Si recibe un
mensaje de denegación de permiso, piense en la solución de problemas de SELinux.
Además, journalctl tiene un parámetro -M para ver el inicio de sesión dentro del
contenedor, o use lo siguiente:
journalctl _PID=<pid of container> -a
systemd-nspawn | 335
[Network]
Zone=web
Port=tcp:80
[Files]
PrivateUsersChown=yes
336 | Virtualización de contenedores en Azure
Docker
En marzo de 2010, Solomon Hykes comenzó el desarrollo de Docker. Empezó en
Francia como una nube dotCloud interna. Gracias al lanzamiento público en una gran
conferencia de Python en 2013 y al interés de Red Hat, Docker realmente prosperó. En
el último trimestre de ese mismo año, se cambió el nombre de la empresa a Docker Inc.
Docker se creó originalmente sobre LXC, pero después de un tiempo, se reemplazó LXC
con su propia biblioteca libcontainer.
La arquitectura de Docker es bastante compleja: está conformada por un cliente, Docker
y un demonio, dockerd. Otro demonio, containerd, es una capa de abstracción para
el SO y el tipo de tecnología de contenedor que se está utilizando. Puede interactuar
con containerd mediante la utilidad docker- containerd-ctr. El demonio containerd es
responsable de lo siguiente:
• El registro (donde puede almacenar imágenes)
• La imagen (compilación, metadatos, etcétera)
• Las redes
• Los volúmenes (para almacenar datos persistentes)
• Las firmas (confianza en el contenido)
Hay dos ediciones de Docker disponibles: Docker Community Edition (CE) y Docker
Enterprise Edition (EE). Docker Inc vendió Docker EE a Mirantis en noviembre de 2019;
sin embargo, Docker Inc todavía administra Docker CE. Docker EE agrega el soporte
técnico de Docker, pero también un marco de seguridad integrado, complementos
certificados, compatibilidad con Docker Swarm (que es una solución de orquestación de
contenedores, como Kubernetes) y compatibilidad con RBAC/AD/LDAP. No obstante,
todo esto tiene un precio. Si cree que su entorno necesita estas ventajas añadidas, vale
la pena pagarlo. Por otro lado, Docker CE es un software de código abierto que está
disponible de forma gratuita.
Instalación de Docker
Existen varias formas de instalar y usar Docker CE en Azure. Puede instalar la distribución
de Linux que prefiera e instalar Docker sobre ella. Hay varias VM disponibles en Azure
Marketplace, como RancherOS, que es una distribución de Linux muy mínima que se
creó especialmente para ejecutar Docker. Por último, pero no menos importante, está la
plantilla Docker para Azure, que Docker proporciona a https://docs.docker.com/docker-
for-azure.
Para alcanzar el objetivo de este capítulo, la VM de Docker en Ubuntu Server no es mala
idea; permite ahorrar mucho trabajo. Pero existen varios motivos por los cuales no usar
esta VM:
• Realmente puede ayudarle a entender mejor las cosas si usted configura todo.
• El software usado es relativamente antiguo.
• La extensión de Docker VM que se usa para crear la VM está obsoleta y ya no está
en desarrollo activo.
La plantilla Docker para Azure también instala y configura Docker Swarm, un sistema de
agrupación en clúster nativo de Docker.
El sitio web de Docker proporciona una excelente documentación sobre cómo instalar
Docker manualmente. Si desea realizar la instalación mediante apt o yum sin seguir el
script, puede seguir la documentación oficial de Docker (https://docs.docker.com/v17.09/
engine/installation/#supported-platforms). Si la sigue, puede omitir el script cloud-init.
Aquí seguiremos la instalación con nuestro script. Tenga en cuenta que este script es
adecuado para entornos de laboratorio, pero no para entornos de producción.
Instala la versión más reciente de Docker desde el canal perimetral, no desde el canal
estable. En teoría, esto podría ser un poco inestable.
Sin embargo, para los fines de este capítulo, es una buena manera de comenzar. Para
poner las cosas en marcha rápido, usemos la técnica de cloud-init que aprendimos en
el Capítulo 7, Implementación de sus máquinas virtuales.
338 | Virtualización de contenedores en Azure
Nota
Si recibe un mensaje que dice “Warning: docker.service changed on disk, run
systemctl daemon-reload to reload docker.service”, sea paciente pues cloud-init
aún está ocupado. Además, si observa que no se encuentra docker.service, espere
un momento para que cloud-init finalice la instalación. Siempre puede comprobar
si Docker CE está instalado mediante la ejecución de dpkg -l | grep docker.
3. Ejecute lo siguiente para recibir aún más información sobre el demonio de Docker:
docker info
4. Es momento de descargar nuestro primer contenedor y ejecutarlo:
docker run hello-world
En la siguiente captura de pantalla, puede ver que el contenedor se ejecutó
correctamente y recibió el mensaje Hello from Docker!:
Si desea un shell interactivo para el contenedor de Ubuntu (como aplicar SSH a una
VM), puede agregar el parámetro -i:
docker run -it ubuntu
Por ejemplo, puede ejecutar el siguiente comando para ver la versión del sistema
operativo de la imagen del contenedor:
docker exec <id/name> cat /etc/os-release
Docker | 341
Y sepárelo mediante Ctrl + P y Ctrl + Q, lo que significa que saldrá del shell interactivo
y el contenedor comenzará a ejecutarse en segundo plano.
Para concluir, si ha seguido las indicaciones, ya podrá ejecutar contenedores,
ejecutarlos en modo independiente, ejecutar comandos en el contenedor desde la
máquina host y también obtener un shell interactivo en el contenedor. Hasta ahora,
hemos usado imágenes que ya están disponibles en Docker Hub. En la siguiente sección,
aprenderemos a crear nuestras propias imágenes de Docker con configuraciones
personalizadas a partir de una imagen base.
Tomemos Debian como la imagen base aquí. Esto le ayudará a entender el comando
docker import. Descargue y extraiga Debian Stretch:
debootstrap --arch amd64 stretch stretch \
http://ftp.us.debian.org/debian
Cree un archivo comprimido e impórtelo directamente en Docker:
tar -C stretch -c . | docker import - stretch
Docker también ofrece una imagen base muy mínima llamada scratch.
Una imagen de Docker se crea a partir de un Dockerfile. Vamos a crear un directorio de
trabajo para guardar el Dockerfile:
mkdir ~/my-image && cd ~/my-image
342 | Virtualización de contenedores en Azure
Como la imagen stretch ya está disponible en Docker Hub, es una buena idea etiquetar
la imagen con un nuevo nombre para que Docker no intente extraer la imagen, sino ir
a la imagen local. Para etiquetar la imagen, use el siguiente comando:
docker tag stretch:latest apache_custom:v1
Agregue la capa más reciente y ejecute Apache en esta capa de lectura/escritura. CMD
se usa para especificar los valores predeterminados para la ejecución del contenedor:
CMD /usr/sbin/apachectl -e info -DFOREGROUND
Guarde el archivo. Sus entradas del archivo se verán como la siguiente captura de
pantalla. Agregar comentarios es un procedimiento recomendado, pero opcional:
Compile el contenedor:
docker build -t apache_image .
Ejecute docker ps para obtener el ID del contenedor y úselo para recopilar información
sobre el contenedor:
docker inspect <ID/name> | grep IPAddress
Podrá ver la famosa página “It works” en HTML, como se muestra aquí:
Figura 9.9: Uso del comando curl para probar el servidor web
Esto hace que el sitio web esté disponible en el puerto localhost 8080.
También puede usar acbuild para crear contenedores de Docker.
Docker Machine
Existe otra manera de crear contenedores de Docker: Docker Machine. Es una
herramienta que crea VM que hospedarán Docker. Es algo que debe ejecutar en una
máquina de desarrollo, física o no, y debe ejecutar todo de forma remota.
Tenga en cuenta que Docker Machine se puede instalar en máquinas macOS, Linux
y Windows. Consulte la documentación de Docker Machine (https://docs.docker.com/
machine/install-machine/) para la instalación en macOS y Windows, ya que solo estamos
siguiendo la instalación en Linux.
Vuelva a la máquina Ubuntu donde instalamos Docker. Instale la siguiente dependencia:
sudo apt install sshfs
Docker | 345
Compruebe la versión:
docker-machine version
Hay otras opciones, como la IP pública y el nombre del grupo de recursos, que se
pueden traspasar durante la implementación. Puede ver la lista completa y los valores
predeterminados para estas opciones en la documentación de Docker (https://docs.
docker.com/machine/drivers/azure/). Si no especificamos un valor para una opción
específica, Docker tomará el valor predeterminado. Otra cosa que debe tener en cuenta
es que el nombre de la VM solo debe incluir caracteres alfanuméricos en minúsculas
o guiones, si es necesario. De lo contrario, recibirá un error.
En la siguiente captura de pantalla, puede ver que la implementación de una VM llamada
docker-machine-2 del tamaño Standard_A2 se realizó correctamente y que Docker se
ejecuta en la máquina. Para simplificar, hemos guardado nuestro ID de suscripción en
una variable, $SUB_ID, para que no tengamos que revisarlo todas las veces. Puede hacer
lo mismo si es necesario. Dado que ya hemos autenticado antes, el controlador no
nos pide iniciar sesión de nuevo. El controlador recuerda sus credenciales por hasta
dos semanas, lo que significa que no tiene que iniciar sesión cada vez que realiza una
implementación. También puede ver qué recursos se implementaron:
Para indicarle a Docker que use el entorno remoto en lugar de ejecutar contenedores
localmente, ejecute lo siguiente:
docker-machine env <vm name>
eval $(docker-machine env <vm name>)
Para comprobar que se está usando el entorno remoto, use el comando info:
docker info
Docker | 347
Entre otra información, la salida muestra que está usando una VM específica que se
ejecuta en Azure:
Vamos a crear un contenedor nginx con el puerto 80 de host asignado al puerto 80 del
contenedor. Esto significa que todo el tráfico que llega al puerto 80 de la VM host se
dirigirá al puerto 80 del contenedor. Esto se debe al parámetro –p. Ejecute el siguiente
comando para crear un contenedor nginx:
docker run -d -p 80:80 --restart=always nginx
Use esa dirección IP en un explorador para comprobar que nginx se esté ejecutando.
Docker Machine también nos permite copiar archivos en la VM con el parámetro scp,
o incluso montar los archivos localmente:
mkdir -m 777 /mnt/test
docker-machine mount <vm name>:/home/<username> /mnt/test
348 | Virtualización de contenedores en Azure
Use docker ps para buscar las instancias en ejecución, detenerlas y eliminarlas, para que
estén listas para la siguiente utilidad.
Docker Compose
Docker Compose es una herramienta para crear una aplicación de varios contenedores,
por ejemplo, una aplicación web que necesita un servidor web y una base de datos.
Puede comprobar la versión más reciente o estable de Docker Compose en
https://github.com/docker/compose/releases e instalarlo, reemplazando el
número de versión en el comando con la última versión:
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/
docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Nota
Después de la instalación, si se produce un error en el comando anterior,
compruebe la ruta o cree un vínculo simbólico a /usr/bin o a cualquier otro
directorio de la ruta. Para saber qué directorios están en su PATH, ejecute $PATH
en el shell. Para crear un vínculo simbólico, ejecute sudo ln -s /usr/local/bin/
docker-compose /usr/bin/docker-compose.
Docker | 349
db:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: <password>
Reemplace <password> con la contraseña de su elección. Mientras sigue conectado
al entorno de Azure, con Docker Machine, ejecute lo siguiente:
docker-compose up -d
Registro de Docker
Cada vez que ejecutamos docker run o docker pull (solo descarga), las imágenes se
obtienen de Internet. ¿De dónde provienen? Ejecute este comando:
docker info | grep Registry
Compile la imagen:
docker build -t <accountname>/<image>:versiontag .
Para el control de versiones, es una buena idea usar una cadena como v1.11.1.2019,
que significa que la primera versión se publicó el 1 de noviembre de 2019. Si no agrega la
versión, se etiqueta como la versión más reciente.
Docker | 351
No puede ver las etiquetas con el comando docker search. Necesitará la interfaz web
o consultar la API de Docker con curl (una herramienta para transferir datos desde
y hacia un servidor) y jq (una herramienta similar a sed, pero específicamente para
los datos JSON):
wget -q https://registry.hub.docker.com/v1/repositories/<image>/tags -O - |
jq
Nota
jq no está instalada de forma predeterminada. Tiene que instalarla con apt
install jq.
Esta salida estará en formato JSON. Puede realizar consultas adicionales con jq y definir
mejor la salida si es necesario. Si no desea usar jq para formatear JSON, puede usar los
comandos nativos sed, try cut para asignar formato a la salida y obtener algo más limpio:
wget -q https://registry.hub.docker.com/v1/repositories/<image name>/tags -O
- | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n' | cut -d ":"
-f3
Si desea obtener todas las etiquetas de nginx, puede reemplazar <image name> con nginx.
Hemos analizado Docker Hub y cómo comprobar las imágenes disponibles. Del mismo
modo, Azure ofrece Azure Container Registry, donde puede almacenar sus imágenes
privadas y extraerlas cuando lo necesite. Antes de empezar a usar Azure Container
Registry, necesitamos entender Azure Container Instances, con el que puede ejecutar
contenedores sin la molestia de administrar las máquinas host. Sigamos y aprendamos más.
352 | Virtualización de contenedores en Azure
Puede crear un grupo de recursos o usar uno existente. Establezca el nombre del
contenedor en nginx y establezca el Tipo de imagen en Public porque vamos a extraer
una imagen pública. Establezca el nombre de la imagen en nginx:latest, establezca
el Tipo de SO en Linux y elija el requisito de recursos deseado para el contenedor.
Presione Siguiente y en la sección Redes, expondremos el puerto 80 para el tráfico
HTTP, como se muestra en la siguiente captura de pantalla. Además, puede agregar
una etiqueta DNS y optar por una dirección IP pública si es necesario:
Debe poder acceder al servidor web en un FQDN y una dirección IP. Como se muestra
en la captura de pantalla, puede apuntar su navegador a la etiqueta DNS o a la dirección
IP, y puede ver la página Welcome to nginx!:
Figura 9.19: Salida del servidor web cuando el navegador apunta a la etiqueta DNS
Hasta ahora, hemos usado el Registro de Docker para guardar, extraer e insertar
imágenes. Azure ofrece un registro de imágenes privadas donde puede almacenar
sus imágenes para que puedan usarse cuando sea necesario. Este servicio se denomina
Azure Container Registry. Veamos de qué se trata.
Si el registro está listo, habrá una ventana emergente que dice que el trabajo está
terminado y podrá ver el recurso. Si navega a la hoja Claves de acceso, encontrará el
servidor de inicio de sesión y su nombre de usuario, que es el mismo que el nombre
del registro y el conjunto de contraseñas:
Use esta información para iniciar sesión en el repositorio, de la misma manera que lo
hizo con Docker Hub.
Después de insertar una imagen, estará disponible en el repositorio. Desde allí, puede
implementarla en el servicio de Azure Container Instances y ejecutarla.
Una vez que reciba el mensaje de éxito, siga con la creación del registro de
contenedores mediante lo siguiente:
az acr create --resource-group az-acr-cli --name azacrcliregistry --sku
Basic --admin-enabled true
Aquí estamos creando el registro de contenedores con la SKU básica. Hay otras
SKU disponibles que ofrecen más opciones de almacenamiento y rendimiento. Las
SKU apuntan a diferentes niveles de precios del registro de contenedores. Visite la
página de precios de Microsoft Azure (https://azure.microsoft.com/es-xl/pricing/
details/container-registry/) para ver el precio de cada SKU. Dado que se trata de una
demostración y para mantener el costo al mínimo, usaremos la opción básica.
Después de implementar la instancia de Azure Container Registry, iniciaremos sesión
en el registro. Pero para iniciar sesión, necesitamos la contraseña. Ya sabemos el
nombre de usuario, que es el del registro, así que vamos a ver la contraseña del registro:
az acr credential show --name azacrcliregistry --resource-group az-acr-cli
Sigamos e insertemos una imagen en el registro. Para insertar una imagen, primero
necesitamos tener una imagen. Si usa la misma VM que se usó en los ejemplos
anteriores, es posible que tenga algunas imágenes. Si las imágenes no están allí, puede
usar docker pull <image name> para obtener la imagen. Puede comprobar la lista de
imágenes disponibles con el comando docker images. Dado que ya tenemos una imagen
nginx, no la extraeremos de Docker Hub.
Azure Container Registry | 359
Insertemos la imagen etiquetada en Azure Container Registry con el comando docker push:
docker push azacrcliregistry.azurecr.io/ngnix:v1
Puede usar el comando docker run para ejecutar el contenedor. Pero siempre asegúrese
de que el nombre de la imagen esté en el formato <AcrLoginName>/<image>. La era de
Docker terminará y, finalmente, se reemplazará con herramientas de última generación
sin demonios.
La siguiente sección se trata de estas herramientas y cómo puede crear una analogía
con Docker para una transición sin problemas.
360 | Virtualización de contenedores en Azure
Historia
Puede que se pregunte cuándo sucedió todo esto. En 2015, Docker Inc. y CoreOS,
junto con algunas otras organizaciones, tuvieron la idea de crear Open Container
Initiative (OCI). La intención detrás de esto era estandarizar el tiempo de ejecución
del contenedor y las especificaciones de formato de imagen. El formato de imagen
OCI es compatible con la mayoría de los registros de imágenes de contenedores, como
Docker Hub y Azure Container Registry. La mayoría de los tiempos de ejecución de
contenedores que están disponibles ahora son compatibles con OCI o tienen OCI en la
canalización. Esto fue solo el comienzo.
Antes Docker era el único tiempo de ejecución de contenedores disponible para
Kubernetes. Obviamente, otros proveedores querían tener soporte para sus tiempos
de ejecución específicos en Kubernetes. Debido a este dilema y la falta de soporte
para otros proveedores, Kubernetes creó CRI en 2017. CRI significa Container Runtime
Interface. Se pueden usar otros tiempos de ejecución, como CRI-O, containerd o frakti.
Como Kubernetes estaba en auge y debido a su compatibilidad con varios tiempos de
ejecución, el monopolio de Docker comenzó a desmoronarse. En muy poco tiempo,
el estado de monopolio de Docker cambió y se convirtió en uno de los tiempos de
ejecución admitidos en Kubernetes. Las ondas que generó este cambio en realidad
dieron origen a la idea de herramientas sin demonios y a la idea de derribar el enfoque
de usar el demonio del monolito, que requiere acceso de superusuario.
En lugar de usar términos genéricos, intentemos entender los términos populares.
Buildah se usa para la creación de contenedores, Podman se usa para la ejecución
de contenedores y Skopeo le permite realizar varias operaciones en imágenes
y repositorios donde se almacenan las imágenes. Observaremos detalladamente cada
una de estas herramientas. Algunas personas sugieren eliminar Docker antes de usar
estas herramientas, pero recomendamos mantener Docker para que pueda compararlo
constantemente con estas herramientas. Si ha seguido las secciones anteriores sobre
Docker, podrá crear una analogía.
Buildah, Podman y Skopeo | 361
Instalación
Instalar estas herramientas es muy sencillo. Puede usar apt en Ubuntu o yum en RHEL
para instalarlas. Dado que estamos usando la misma VM, vamos a seguir la instalación
de Ubuntu de estos paquetes. Para instalar Buildah, ejecute lo siguiente:
sudo apt update
sudo apt install -y software-properties-common
sudo add-apt-repository -y ppa:projectatomic/ppa
sudo apt update
sudo apt install -y buildah
Dado que ya tenemos el repositorio de PPA agregado durante la instalación de Buildah,
podemos implementar Podman inmediatamente con apt install. Para instalar Podman,
ejecute lo siguiente:
sudo apt -y install podman
Nota
Si recibe un mensaje de error que indica revision is not meant production,
puede usar el parámetro –devmode para instalarlo. Así evitará este error
y completará la instalación.
Buildah
En la sección anterior, analizamos Dockerfiles. Aquí está lo interesante: Buildah tiene
soporte completo para Dockerfiles. Todo lo que tiene que hacer es escribir el Dockerfile
y usar el comando bud, que significa “build-using-docker” (crear con docker). Tomemos
el mismo ejemplo que usamos en la sección de Dockerfile. Cree un Dockerfile mediante
la ejecución de vi Dockerfile (puede usar cualquier editor de texto) y agregue las
siguientes líneas:
FROM nginx
RUN apt-get --yes update
RUN apt-get --yes install apache2
CMD /usr/sbin/apachectl -e info -DFOREGROUND
EXPOSE 80
Guarde el archivo.
Antes de compilar, hay algo más que debemos realizar. Buildah busca la lista de
registros en el archivo /etc/containers/registries.conf. Si este archivo no existe,
necesitamos crear uno, agregar el siguiente código y guardar el archivo:
[registries.search]
registries = ['docker.io']
Al hacerlo, estamos dando la instrucción de buscar la imagen en Docker Hub. También
puede agregar su instancia de Azure Container Registry a la lista si es necesario.
Compilemos la imagen. Asegúrese de estar en el directorio donde está el Dockerfile.
Comience el proceso de compilación mediante:
buildah bud -t ngnix-buildah .
Hemos creado una imagen llamada nginx-buildah. Para ver la lista de imágenes, puede
usar el comando buildah images. Sí, sabemos que se ve muy similar a la forma en que se
enumeran las imágenes en Docker. Tenemos que tener en cuenta esta analogía que le
ayudará a aprender.
La salida será similar a esto:
Puede ver que Buildah enumera la imagen que extrajo de Docker Hub y también la
imagen que creamos que se almacena en el repositorio de localhost.
Para crear un contenedor a partir de una imagen, podemos usar lo siguiente:
buildah from <image>
Al igual que cuando usa docker ps para enumerar todos los contenedores, ejecutaremos
buildah ps y podremos ver el nginx-working-container que acabamos de crear:
Al igual que Docker, Buildah tiene soporte para comandos, como push, pull, tag e inspect.
Podman
Las imágenes que compilamos a través de Buildah siguen el cumplimiento de OCI y se
pueden usar con Podman. En Podman, la analogía continúa. Todo lo que tenemos que
hacer es reemplazar todos los comandos de Docker con los comandos de Podman. Uno
de los aspectos clave que tenemos que tener en cuenta es que en Podman, no podemos
hacer el enlace de puertos para un contenedor como usuario no raíz. Si su contenedor
necesita una asignación de puertos, entonces tiene que ejecutar Podman como raíz. Como
ya hablamos de Docker y está familiarizado con sus comandos, intentaremos ejecutar un
contenedor y comprobarlo. Vamos a crear un contenedor nginx con el puerto asignado
a 8080. Dado que necesitamos asignar un puerto, ejecutaremos el comando como sudo:
sudo podman run -d -p 8080:80 --name webserver nginx
Dado que hemos creado el contenedor mediante el comando sudo, será propiedad del
usuario raíz. Si se crea un contenedor con sudo, asegúrese de encadenar sudo para
todas las acciones relacionadas con ese contenedor.
Para enumerar los contenedores, use podman ps. Podemos ver que el contenedor está
escuchando en 0.0.0.0:8080 del host, que se asigna al puerto del contenedor:
Skopeo
Si recuerda, anteriormente intentamos obtener las etiquetas de una imagen mediante
Docker. Con Skopeo, puede inspeccionar un repositorio, copiar imágenes y eliminar
imágenes. Para empezar, usaremos el comando skopeo inspect para obtener las
etiquetas de una imagen en Docker Hub sin extraerla:
skopeo inspect docker://nginx:latest
No nos referiremos a todo esto. Sin embargo, puede visitar los repositorios de GitHub
de estas herramientas:
• Buildah: https://github.com/containers/buildah
• Podman: https://github.com/containers/libpod
• Skopeo: https://github.com/containers/skopeo
Contenedores y almacenamiento
Esta sección tiene como objetivo brindarle una idea básica de los contenedores y el
almacenamiento. Cada herramienta de compilación que puede crear imágenes ofrece
la opción de agregar datos a su contenedor.
Debe utilizar esta característica solo para proporcionar archivos de configuración.
Los datos de las aplicaciones deben estar hospedados, tanto como sea posible, fuera
del contenedor. Si desea actualizar/eliminar/reemplazar o escalar rápidamente su
contenedor, es casi imposible si los datos están dentro del contenedor.
Cuando creamos un contenedor, el almacenamiento se conecta al contenedor. Sin
embargo, los contenedores son efímeros, lo que significa que el almacenamiento
también se destruye cuando se destruye el contenedor. Supongamos que creó un
contenedor de Ubuntu para las pruebas y guardó algunos scripts que se probaron en
el contenedor con la esperanza de que los pudiese usar más adelante. Ahora, si eliminó
accidentalmente este contenedor, todos los scripts que probó y guardó para más
adelante habrán desaparecido.
Los datos de la aplicación son importantes y le recomendamos retenerlos incluso después
de que se completa el ciclo de vida del contenedor. Por lo tanto, queremos separar los
datos del ciclo de vida del contenedor. Al hacerlo, sus datos no se destruyen y se pueden
reutilizar si es necesario. En Docker, esto se logra mediante el uso de volúmenes.
Docker admite una amplia gama de opciones para volúmenes persistentes, incluidos
Archivos de Azure. En otras palabras, puede vincular el recurso compartido de su
archivo de Azure a un contenedor de Docker como un volumen persistente. Para
demostrarlo, usaremos el volumen del host, donde se montará una ubicación como
un volumen en el contenedor. El propósito de estos pasos es mostrar cómo se pueden
guardar los datos incluso después de que el contenedor se elimina del host.
La información de volumen se traspasa al comando docker run mediante el parámetro
-v al crear el contenedor. La sintaxis general es la siguiente:
docker run -v /some-directory/on host:/some-directory/in container
Supongamos que tiene una aplicación que creará un archivo en un directorio /var/log
en el contenedor y necesitamos lograr que sea persistente. En el siguiente comando,
asignamos un directorio en el host al directorio /var/log del contenedor.
Contenedores y almacenamiento | 367
Para completar este ejercicio, necesita una VM de Linux con Docker ejecutándose
en ella. Vamos a crear un directorio ~/myfiles en la máquina host que se asignará
al contenedor:
mkdir ~/myfiles
Enumerar el contenido del directorio mostrará los 10 archivos que acabamos de crear:
Salga del shell interactivo con Ctrl + D, y ahora volveremos a la máquina host. Ahora
eliminaremos el contenedor:
docker rm <id/name of the container>
368 | Virtualización de contenedores en Azure
Ahora sabemos cómo hacer que nuestro volumen sea persistente. En el caso de Docker,
hay soluciones, como https://github.com/ContainX/docker-volume-netshare.
Si está usando Docker y desea usar Archivos de Azure, puede usar Cloudstor, un
complemento disponible en https://docs.docker.com/docker-for-azure/persistent-
data-volumes.
El uso de Azure File Storage quizás no sea la solución más económica, pero de esta
manera obtendrá todas las opciones de disponibilidad y copia de seguridad que necesita.
Si va a usar Kubernetes, la historia cambia. En el próximo capítulo, trataremos ese tema.
Resumen | 369
Resumen
En este capítulo, se analizó otra forma de implementar la carga de trabajo en Azure.
Después de una introducción a la historia, las ideas y los conceptos de la virtualización de
contenedores, vimos algunas de las opciones disponibles. Junto con las implementaciones
más antiguas, como LXC, analizamos otras implementaciones eficaces y sólidas para
hospedar contenedores: systemd-nspawn y Docker.
No solo vimos cómo ejecutar imágenes existentes extraídas de los repositorios, sino
también cómo crear nuestra propia imagen. Tal vez la mejor noticia es que hay una
herramienta llamada Buildah que es capaz de crear una imagen usando el estándar
OCI de Open Container Initiative y se puede utilizar para Docker.
La mayor parte de este capítulo se trató de Docker. Esta es, por lejos, la solución de
contenedor más implementada en la actualidad. Y, hablando de implementaciones,
hay muchas formas de implementar Docker:
• Impleméntelo manualmente en una VM
• Implemente una VM lista para llevar desde Marketplace
• Docker Machine
• Azure Container Instances
Preguntas
1. ¿Cuáles son las razones para usar los contenedores?
2. ¿Cuándo los contenedores no son la solución que necesita?
3. Si necesita algo como un servidor privado virtual, ¿se recomienda una VM o hay
una solución de virtualización de contenedores disponible que puede ser una
buena idea?
4. ¿Por qué no debería ser difícil migrar de una solución, como Docker, a otra, por
ejemplo, Buildah?
5. ¿Para qué se usa una máquina de desarrollo?
6. ¿Por qué usar Buildah es una buena idea, incluso si está bajo un gran desarrollo?
7. ¿Por qué no debería almacenar los datos de la aplicación en un contenedor?
Lectura adicional
Llevar a cabo lecturas adicionales no es muy fácil en el área de la virtualización de
contenedores. Para systemd-nspawn, es relativamente fácil: las páginas principales
son fáciles de leer. Hagamos una sugerencia que sea relevante para systemd-nspawn
e incluso Docker: Red Hat proporciona un documento en su sitio web llamado Guía de
administración de recursos (https://access.redhat.com/documentation/es-xl/red_
hat_enterprise_linux/7/html/resource_management_guide/) con buena información
sobre cgroups.
Aquí se enumeran un par de referencias sobre Docker:
• Orchestrating Docker, de Shrikrishna Holla, donde puede entender cómo
administrar e implementar los servicios de Docker
• Mastering Docker Enterprise: A companion guide for agile container adoption, de
Mark Panthofer, donde puede explorar los servicios complementarios de Docker
EE y cómo se pueden usar
Cómo trabajar
10
con Azure
Kubernetes Service
En el capítulo anterior, exploramos el mundo de la virtualización de contenedores y, en
particular, de los contenedores Docker. Este capítulo se trata sobre la administración de
cargas de trabajo en contenedores con Azure Kubernetes Service (AKS).
Este capítulo es diferente de todos los demás capítulos de este libro. Hasta ahora, cada
capítulo se ha tratado sobre la infraestructura y cómo proporcionar una plataforma:
el administrador de sistema clásico que trabaja en la nube. Incluso el Capítulo 9,
Virtualización de contenedores en Azure, contenía preguntas como “¿Cómo instalamos
Docker?” y “¿Cómo hacemos funcionar el contenedor?”. Las preguntas que
responderemos en este capítulo son las siguientes:
• ¿Cómo implementamos y administramos nuestra carga de trabajo durante la fase
de desarrollo y después de ella?
• ¿Cómo podemos escalar o reducir verticalmente?
• ¿Cuáles son las opciones de disponibilidad?
372 | Cómo trabajar con Azure Kubernetes Service
Kubernetes brinda una respuesta importante a todas estas preguntas. Es una solución
que se utiliza para automatizar las tareas importantes, como la implementación,
la administración, el escalado, las redes y la administración de la disponibilidad de
aplicaciones basadas en contenedores.
Google diseñó originalmente Kubernetes y ahora lo mantiene la fundación Cloud Native
Computing Foundation (https://www.cncf.io). Microsoft es un gran socio de esta
fundación y es un importante colaborador con los proyectos de Kubernetes en términos
de dinero y código. En realidad, uno de los cofundadores de Kubernetes, Brendan
Burns, trabaja para Microsoft y lidera los equipos que se dedican a la orquestación de
contenedores dentro de Microsoft. Además, Microsoft ha iniciado varios proyectos
open source con herramientas adicionales para Kubernetes.
Debido a que Microsoft está muy involucrado en Kubernetes, puede implementar
una versión de Kubernetes en Azure completamente compatible con el nivel superior.
Esto también es importante para los desarrolladores, de modo que puedan usar
una instalación local de Kubernetes para desarrollar software y, una vez que esté
desarrollado, publicarlo en la nube de Azure.
AKS ofrece una solución de contenedores como servicio totalmente administrada para
Kubernetes. Esto significa que no necesita pensar en la configuración, la administración
y la actualización del software de Kubernetes. Es Azure el que administra el plano
de control.
AKS facilita la implementación y administración de Kubernetes en Azure: puede manejar
todo el proceso de mantenimiento, desde el aprovisionamiento hasta la actualización
y el escalado de las aplicaciones según sus necesidades.
Con AKS incluso se puede llevar a cabo el proceso de actualización del clúster de
Kubernetes sin ningún tiempo de inactividad.
Y por último, pero no menos importante, la supervisión está disponible para cada parte
de su clúster de Kubernetes.
Al final de este capítulo, podrá:
• Explicar qué es Kubernetes y AKS.
• Usar AKS para implementar y administrar sus clústeres.
• Mantener el ciclo de vida completo de las aplicaciones en AKS.
Así es que empecemos y veamos cuáles son los requisitos técnicos antes de que
realmente comencemos a usar AKS.
Requisitos técnicos | 373
Requisitos técnicos
Como se indica en la introducción de este capítulo, este es diferente de todos los demás
capítulos, lo que afecta los requisitos técnicos. Hasta ahora, los requisitos técnicos eran
sencillos: solo necesitaba un montón de máquinas virtuales.
Este capítulo necesita un entorno de DevOps en el que los desarrolladores y operadores
estén en el mismo equipo, trabajando en estrecha colaboración, y donde también haya
alguien que realice las tareas relacionadas con el desarrollo y las operaciones.
Es necesario tomar otra decisión: ¿dónde vamos a llevar a cabo el desarrollo? ¿En el
entorno local o en la nube de Azure? Ambas opciones son posibles y no debería haber
ninguna diferencia. En cuanto a los costos, puede que sea mejor hacerlo en una estación
de trabajo. En este capítulo, se supone que lo está haciendo en el entorno local. Por lo
tanto, necesitará una estación de trabajo (o máquina virtual). Necesitamos lo siguiente:
• La CLI de Azure.
• Herramientas de compilación y Docker.
• Kubernetes.
• Algunas herramientas esenciales para desarrolladores, como Git.
• Algunas otras herramientas, como Helm, se analizarán más adelante.
• Un entorno de desarrollo integrado (IDE) adecuado. Preferimos Microsoft
Visual Studio (VS) Code con las extensiones de Microsoft para Docker y Kubernetes
(solo si hay disponible una interfaz gráfica. De lo contrario, use el editor Nano).
• Opcionalmente, una herramienta de orquestación como Ansible. Consulte los
módulos azure_rm_aks y 8ks_raw de Ansible.
374 | Cómo trabajar con Azure Kubernetes Service
Instalación de dependencias
Usaremos Ubuntu 18.04 LTS Desktop Edition, pero también puede usar un servidor
Ubuntu 18.04 LTS en una máquina virtual de Azure. Con todo el conocimiento que
adquirió en los otros capítulos, le resultará fácil trasladar lo que haremos a otras
distribuciones de Linux, macOS e incluso Windows:
1. En primer lugar, actualice Ubuntu:
sudo apt update &&sudo apt upgrade
2. Instale las herramientas para desarrolladores, incluidas algunas otras
dependencias y openssh:
sudo apt install build-essential git curl openssh-server \
ebtablesethtoolsocat
Requisitos técnicos | 375
sudo apt-add-repository \
https://packages.microsoft.com/repos/azure-cli
curl -L https://packages.microsoft.com/keys/microsoft.asc \
| sudo apt-key add -
También puede usar los siguientes comandos para instalar PowerShell Core:
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add
-
Instalación de kubectl
Kubectl es una interfaz de la línea de comandos que se puede utilizar para administrar
los clústeres de Kubernetes. Se puede utilizar para muchas operaciones. Por ejemplo,
use kubectl create para crear uno o más archivos y use kubectl delete para eliminar
recursos de un archivo. Vamos a usar la CLI de Azure para instalar kubectl y ejecutar
los siguientes comandos como raíz para conceder los permisos necesarios:
sudo -i
az login
az aks install-cli
378 | Cómo trabajar con Azure Kubernetes Service
En primer lugar, debe descargar la versión más reciente con el siguiente comando:
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.16.3/
bin/linux/amd64/kubectl
Habilite el autocompletado, con lo que podría ahorrarse escribir mucho. Para Bash
y Zsh en kubectl, ejecute lo siguiente:
kubectl completion bash > ~/.kube/completion.bash.inc
printf"
# Kubectl shell completion
source '$HOME/.kube/completion.bash.inc'
">> $HOME/.bash_profile
source $HOME/.bash_profile
Para Zsh, ejecute lo siguiente:
sudo -i
exit
Hasta ahora, hemos instalado la versión más reciente del binario kubectl con un
comando curl en Linux y habilitado el autocompletado del shell para kubectl.
Ahora estamos listos para usar AKS.
Nota
Si usa kubectl y recibe mensajes de error similares a Error from server
(NotAcceptable): unknown (get nodes) [Error del servidor (NotAcceptable):
desconocido (obtener nodos)], cambie a una versión anterior del cliente con
https://dl.k8s.io/v1.10.6/kubernetes-client-linux-amd64.tar.gz.
Aunque esto está completamente fuera del alcance de este libro, personalmente nos
gusta usar el shell Zsh con una personalización genial, Spaceship. La notificación le
ofrece más información sobre dónde está y lo que hace mientras trabaja con AKS.
Así puede realizar la instalación rápida:
sudo apt install zshnpm fonts-powerline
zsh # and create a .zshrc file with option 0
npm install spaceship-prompt
chsh -s /bin/zsh
Hay una interfaz web disponible llamada Panel de Kubernetes que puede utilizar para
acceder al clúster. Para que esté disponible, ejecute lo siguiente:
az aks browse --name Cluster01 --resource-group MyKubernetes
La utilidad az tuneliza el portal al localhost. Presione Ctrl + C para salir del túnel.
Para poder usar la utilidad kubectl, tenemos que combinar la configuración con el
archivo de configuración local:
az aks get-credentials --resource-group MyKubernetes \
--name Cluster01
La salida del comando anterior es la siguiente:
Con nuestro sofisticado símbolo del sistema, puede ver que cambiamos del clúster
local de Kubernetes al clúster en Azure. Para ver los clústeres disponibles, ejecute
lo siguiente:
kubectl config get-contexts
La salida del comando anterior devuelve la lista de nombres del pod, los estados del pod
(en ejecución, pendientes, correcto, con errores o desconocido), el número de reinicios
y el tiempo de actividad, de la siguiente manera:
Vuelva a ejecutar kubectl get pods; debería ver que hay disponible un nuevo pod.
Creación de servicios
Pero en realidad, no debe preocuparse por el pod: lo más importante es el servicio.
Un servicio es un objeto que hace que la aplicación sea accesible para el mundo
exterior. Detrás del servicio, hay uno o más pods. El servicio mantiene un seguimiento
de los pods y sus direcciones IP y es una abstracción de un conjunto lógico de pods
y sus directivas. Puede usar el siguiente comando para enumerar todos los servicios
en un espacio de nombres:
kubectl get services
Tenga en cuenta que no expusimos los puertos. Para enumerar los pods, use
kubectl get pods. Para que el recurso sea accesible, agregamos un servicio del
tipo LoadBalancer:
kubectl expose pod <pod name> --port=80 --target-port=80 \
--type=LoadBalancer
La salida debe ser similar a lo siguiente:
Figura 10.15: Enumeración de los pods y adición de un servicio del tipo LoadBalancer
Sin embargo, hay casos de uso que se basan en el hecho de que un pod proporciona
recursos compartidos para los contenedores dentro del pod, como:
• Contenedores con aplicaciones auxiliares, como el registro y la supervisión
• Servidores proxy inversos
Hasta ahora, usamos el parámetro —image para crear un pod sencillo. Para un pod más
complejo, necesitamos hacer una especificación en formato YAML. Cree un archivo
llamado myweb.yaml con el siguiente contenido:
apiVersion: v1
kind: Pod
metadata:
name: myweb
spec:
restartPolicy: Never
volumes:
- name: logger
emptyDir: {}
containers:
- name: nginx
image: nginx
volumeMounts:
- name: logger
mountPath: /var/log/nginx
readOnly: false
- name: logmachine
image: ubuntu
volumeMounts:
- name: logger
mountPath: /var/log/nginxmachine
388 | Cómo trabajar con Azure Kubernetes Service
Nota
La opción anterior no se puede usar como solución de clúster y probablemente
sea necesario montar uno de los sistemas de archivos de los contenedores como
de solo lectura con la marca mountOptions.
Instalación de Helm
Si está en un sistema Ubuntu, tiene dos opciones: puede instalar Helm con un paquete
snap o simplemente descargar el archivo binario en https://github.com/kubernetes/
helm/releases. Usar el archivo binario funciona en todas las distribuciones de Linux
y el repositorio snap no siempre tiene la versión más reciente de Helm. Por lo tanto,
vamos a usar https://github.com/helm/helm/releases para buscar la versión más
reciente de Helm y cambiar la x en el nombre de archivo helm-vx.x.x-linux-amd64.
taz.gz, según corresponda:
cd /tmp
wget https://storage.googleapis.com/kubernetes-helm/\
helm-v2.9.1-linux-amd64.tar.gz
El cliente está instalado y, con este cliente, podemos implementar la parte del servidor,
Tiller, en nuestro clúster de Kubernetes:
helm init
Para permitir que Helm obtenga acceso al clúster de Kubernetes, se debe crear una
cuenta de servicio con un rol correspondiente:
kubectl create serviceaccount \
--namespace kube-system tiller
Como se muestra en la siguiente captura de pantalla, creamos una cuenta de servicio
de Tiller en el espacio de nombres kube-system con el comando kubectl create:
Figura 10.19: Creación de una cuenta de servicio de Tiller en el espacio de nombres kube-system
Conceda acceso de administrador del clúster a los recursos de Kubernetes para realizar
tareas administrativas:
kubectl create clusterrolebinding tiller-cluster-rule \
--clusterrole=cluster-admin \
--serviceaccount=kube-system:tiller
Como se muestra en la siguiente captura de pantalla, puede crear un rol personalizado
basado en sus requisitos:
Helm es el cliente instalado en su máquina local y Tiller es el servidor que está instalado
en su Kubernetes. Para volver a configurar Helm, es decir, para asegurarse de que la
versión de Tiller coincida con su instancia de Helm local, ejecute:
helm init --service-account tiller --upgrade
Si desea información sobre el gráfico, cómo usarlo, los parámetros disponibles, etc.,
puede usar el comando helm inspect. Por ahora, solo vamos a implementarlo:
helm install stable/wordpress
La siguiente captura de pantalla muestra la salida del comando kubectl get service:
wordpressUsername: linuxstar01
wordpressEmail: linuxstar01@example.com
wordpressFirstName: Kamesh
wordpressLastName: Ganesan
wordpressBlogName: Linux on Azure – 2nd Edition!
Para comprobar los resultados, use el comando kubectl. En primer lugar, obtenga
el nombre del pod:
kubectl get pod
No se preocupe por los conjuntos con estado (sts): esta aplicación los crea para tener
una implementación ordenada y un almacenamiento persistente compartido.
396 | Cómo trabajar con Azure Kubernetes Service
cd myhelm
El comando anterior debería tener una salida similar a esta:
El archivo se explica casi solo: los mantenedores son opcionales. En este ejemplo,
appVersion hace referencia a la versión de nginx.
Compruebe la configuración con lo siguiente:
helm lint
Tómese un tiempo para investigar los archivos del directorio templates y el archivo
value.yaml. Por supuesto, hay un motivo por el que usamos nginx como ejemplo,
porque los archivos que crea helm create también usan nginx como ejemplo.
En primer lugar, ejecute un simulacro:
helm install --dry-run --debug ../myhelm
De esta manera, puede ver el manifiesto que se usará para implementar la aplicación.
Después de eso, está listo para instalarla:
helm install ../myhelm
398 | Cómo trabajar con Azure Kubernetes Service
Para saber qué lenguajes de programación son compatibles con Draft, puede ejecutar
los siguientes comandos después de la instalación:
draft pack list
Available Packs:
github.com/Azure/draft/clojure
github.com/Azure/draft/csharp
github.com/Azure/draft/erlang
github.com/Azure/draft/go
github.com/Azure/draft/gradle
github.com/Azure/draft/java
github.com/Azure/draft/javascript
github.com/Azure/draft/php
github.com/Azure/draft/python
github.com/Azure/draft/ruby
github.com/Azure/draft/rust
github.com/Azure/draft/swift
Instalación de Draft
Para poder usar Draft, se debe instalar y configurar Helm.
Obtenga su copia de https://github.com/Azure/draft/releases:
cd /tmp
wget https://azuredraft.blob.core.windows.net/draft/\
draft-v0.15.0-linux-amd64.tar.gz
Puede ver que los desarrolladores que trabajan en Helm también participan en
el desarrollo de Draft. En ambos casos, muchos de ellos son desarrolladores de
Microsoft. Al igual que lo que ocurre con Helm, después de instalar el cliente,
tiene que inicializar Draft:
draft init
Configure el repositorio:
draft config set registry LinuxStarACR
Uso de Draft
Vamos a desarrollar un código de Draft sencillo. Para esto, crearemos un directorio y le
pondremos mynode. En este directorio, crearemos un archivo denominado mynode.js con
el código siguiente:
var http = require('http');
Este es un servidor web sencillo que presenta una página al decir Hello World!. Estamos
en una etapa muy temprana del proceso de desarrollo. Para crear un archivo package.
json, ejecute lo siguiente:
npminit
Complete la información:
name: (mynode)
version: (1.0.0) 0.0.1
description: My first Node App
entry point: (mynode.js)
test command: node mynode.js
git repository:
keywords: webapp
author: Kamesh Ganesan
license: (ISC)
Todo parece estar en orden, pero kubectl get pod nos indica lo contrario:
El comando draft logs no muestra ningún error, así es que veamos qué opina Kubernetes:
kubectl logs <Pod Name>
Indica npm ERR! missing script: start. Cometimos un error a propósito en el archivo
package.json. Cambie el contenido, modificando los valores según el siguiente ejemplo:
{
"name": "mynode",
"version": "0.0.2",
"description": "My first Node App",
"main": "mynode.js",
"scripts": {
"start": "node mynode.js",
"test": "echo \"Error: no test specified\"& exit 1"
},
"keywords": [
"webapp"
],
"author": "Kamesh Ganesan",
"license": "ISC"
}
Conéctese a la aplicación:
draft connect
Revise los recursos del clúster con kubectl get all y límpielo, si es necesario.
Administración de Kubernetes
Creamos un clúster de Kubernetes y aprendimos sobre la utilidad kubectl y sobre
algunas de las herramientas que están disponibles para desarrollar y mantener sus
aplicaciones en un clúster de Kubernetes.
Entonces, si recordamos las tres preguntas que hicimos en la introducción de este
capítulo, ya respondimos la primera pregunta. En esta sección, vamos a responder
las otras dos preguntas y también trataremos de actualizar la versión de Kubernetes.
Actualización de aplicaciones
Anteriormente, usábamos Helm y Draft para administrar la aplicación, lo que significaba
que todo el trabajo duro se hacía por nosotros. Pero también puede actualizar la carga
de trabajo con la ayuda de kubectl.
Normalmente, el clúster estará vacío ahora, así es que volvamos a implementar
rápidamente el pod nginx:
kubectl run nginx --image=nginx
En realidad, esto nos indica que queríamos una instancia, que hay una en ejecución,
que está actualizada (el número de instancias que se actualizaron para coincidir con la
capacidad deseada) y que está disponible. La versión de la ejecución de nginx no es la
más reciente, por lo que queremos actualizarla a la versión 1.17.5. Ejecute lo siguiente:
kubectl edit deployment/nginx
406 | Cómo trabajar con Azure Kubernetes Service
Como puede ver en la captura de pantalla anterior, la imagen del contenedor nginx se
actualizó correctamente a la versión 1.17.5.
Administración de Kubernetes | 407
Escalado de aplicaciones
Por el momento, hay un pod en ejecución, pero para manejar toda la carga que entra,
es posible que necesite más instancias y equilibrar la carga del tráfico entrante. Para
hacerlo, necesitará réplicas para definir un número especificado de réplicas de pod que
se ejecutan en un momento determinado.
Volvamos a kubectl y obtengamos la implementación actual:
Vuelva a ejecutar kubectl get deployments; después de eso, observe los pods disponibles:
kubectl get pods -o wide
Figura 10.46: Comprobación de los pods disponibles después del escalado vertical
Por supuesto, en este escenario, tiene sentido tener al menos dos nodos disponibles en
su clúster:
azaks scale --name Cluster01 \
--resource-group MyKubernetes \
--node-count 2
Actualización de Kubernetes
Al igual que con cualquier software o aplicación, debe mantener actualizados los
clústeres de Kubernetes. La actualización es muy importante para obtener las
correcciones de errores más recientes y todas las características de seguridad críticas
junto con las características más recientes de Kubernetes. También es necesario tener
varios nodos disponibles si desea actualizar el plano de control de Kubernetes sin
tiempo de inactividad. Los siguientes pasos le mostrarán cómo actualizar rápidamente
sus clústeres de Kubernetes.
Administración de Kubernetes | 409
Almacenamiento persistente
En el capítulo anterior, dijimos que hay varias formas de usar el almacenamiento
persistente en nuestro contenedor y también hablamos de esto en este capítulo.
Kubernetes puede configurar el almacenamiento persistente, pero debe proporcionarlo,
por ejemplo, a través de un contenedor NFS o mediante la implementación de una
matriz virtual de StorSimple iSCSI (que resulta especialmente útil si necesita acceso de
lectura/escritura desde varios contenedores). Incluso si usa Azure Storage, hay muchas
decisiones que tiene que tomar. ¿Quiere usar discos o Azure Storage? ¿Quiere crearlos
sobre la marcha (dinámicamente) o usar los existentes (estáticamente)? La mayoría de
estas preguntas se responden en función del costo y la necesidad de servicios como la
replicación, la copia de seguridad y las instantáneas.
En esta sección, queremos abarcar las opciones dinámicas; en cuanto a la orquestación,
es una mejor opción, ya que puede hacer todo dentro de Kubernetes (o usar las
herramientas que lo rodean).
Ya sea que use discos o Azure Storage, necesitará una cuenta de almacenamiento en el
mismo grupo de recursos que Kubernetes:
az storage account create --resource-group MyKubernetes \
--name mystorageest1 –sku Standard_LRS
Vuelva a consultar el Capítulo 2, Introducción a la nube de Azure, para conocer la sintaxis
del comando anterior. Recuerde que el nombre debe ser exclusivo.
mountOptions:
- dir_mode=0888
- file_mode=0888
- uid=1000
- gid=1000
- mfsymlinks
- nobrl
- cache=none
parameters:
skuName: Standard_LRS
Figura 10.52: Uso de la solicitud de volumen persistente para crear un archivo de Azure
414 | Cómo trabajar con Azure Kubernetes Service
Como puede ver, la especificación en el pod sigue siendo la misma. Con estas
implementaciones paso a paso, creamos correctamente los discos de Azure y los
archivos de Azure para nuestros requisitos de almacenamiento persistente.
Resumen
Este capítulo se trató de Kubernetes. Comenzamos este capítulo describiendo un
posible entorno de trabajo para un desarrollador: una buena estación de trabajo
con herramientas para iniciar el desarrollo local, incluso con Kubernetes instalado
localmente. Usamos Ubuntu Desktop como ejemplo pero, de hecho, realmente no
importa, siempre y cuando esté satisfecho con su entorno de desarrollo.
Con todo implementado en el entorno local, cubrimos la configuración de los clústeres
de Kubernetes en Azure mediante la CLI de Azure y PowerShell.
La implementación de cargas de trabajo en Azure puede ser tan simple como ejecutar
kubectl run, pero también exploramos escenarios más complejo, como las aplicaciones
de múltiples contenedores.
Como desarrollador, tiene dos herramientas disponibles que le ayudarán a agilizar su
proceso de desarrollo: Draft and Helm. Draft se usa para la fase de desarrollo inicial
y Helm se usa posteriormente para instalar y mantener la aplicación.
Kubernetes es una herramienta para administrar los contenedores, lo que facilita
la implementación, el mantenimiento y la actualización de las cargas de trabajo.
La escalabilidad es una de las ventajas de usar Kubernetes; incluso es posible escalar
automáticamente en función de los recursos de CPU y memoria requeridos.
Preguntas | 415
Preguntas
1. ¿Qué es un pod?
2. ¿Cuál sería una buena razón para crear un pod de múltiples contenedores?
3. ¿Qué métodos puede utilizar para implementar la aplicación en Kubernetes?
4. ¿Qué métodos puede utilizar para actualizar la aplicación en Kubernetes?
5. ¿Necesita crear nodos adicionales en Kubernetes si quiere actualizar el plano
de control?
6. ¿Puede pensar en alguna razón por la que querría una solución iSCSI?
7. Como ejercicio, vuelva a crear el pod de varios contenedores con almacenamiento
persistente.
Lectura adicional
El objetivo de este capítulo era proporcionar un enfoque práctico para que su carga de
trabajo se ejecutara en la nube de Azure. Esperamos que sea el comienzo de su viaje al
mundo de Kubernetes. ¡Hay mucho más por descubrir!
Nigel Poulton, autor que ya escribió un excelente libro sobre Docker, también escribió
un libro sobre Kubernetes, The Kubernetes Book (El libro de Kubernetes). Es un buen
punto de partida si realmente es nuevo en Kubernetes. Gigi Sayfan escribió Mastering
Kubernetes (Dominar Kubernetes). Asegúrese de comprar la segunda edición, no solo
porque la primera edición no fue tan buena, sino simplemente porque es una necesidad
y proporciona mucha más información que la primera edición.
416 | Cómo trabajar con Azure Kubernetes Service
Como desarrollador, debería tratar de leer Kubernetes for Developers (Kubernetes para
desarrolladores): Joseph Heck puede contarle mucho sobre el ciclo de vida del desarrollo
mediante Kubernetes, con ejemplos en Node.js y Python. En el último capítulo de su
libro, menciona proyectos emergentes como Helm y Brigade. Esperamos que esto se
explore con más detalle en una edición posterior, o quizás, incluso en otro libro.
A propósito de Brigade, https://brigade.sh se describe en su propio sitio web como
“una herramienta para ejecutar tareas automatizadas y con scripts en la nube, como
parte de su clúster de Kubernetes”. Va mucho más allá del alcance de este libro y está más
o menos en las primeras etapas de desarrollo. Como desarrollador, debe invertir algo de
tiempo en leer más sobre Brigade y probarlo.
Por último, pero no menos importante, otro origen importante que vale la pena
mencionar es Open Service Broker for Azure (OSBA: https://osba.sh). No aparece
en este capítulo porque, en el momento en que se escribe este libro, no está
completamente listo para producción. OSBA es un estándar abierto para comunicarse
con servicios externos, como bases de datos y almacenamiento. Es otra solución para
proporcionar datos y almacenarlos desde el contenedor.
Solución de problemas
11
y supervisión de sus
cargas de trabajo
La solución de problemas y el registro están muy relacionados; debe empezar a analizar
los registros de Evento, Servicio y Sistema cuando experimente problemas.
La solución y corrección de los problemas encontrados en un entorno de nube pueden
ser diferentes de la solución de problemas en implementaciones más clásicas. En este
capítulo se explican las diferencias, los desafíos y las nuevas posibilidades de la solución
de problemas de las cargas de trabajo de Linux en el entorno de Azure.
418 | Solución de problemas y supervisión de sus cargas de trabajo
Requisitos técnicos
Para este capítulo, necesitará una o dos VM que ejecuten una distribución de Linux.
Puede usar el tamaño más pequeño si lo desea. Se debe instalar el demonio audit
y, con el fin de tener registros del sistema de auditoría para analizarlos y entenderlos,
se recomienda instalar Apache y un servidor MySQL/MariaDB.
El siguiente es un ejemplo en CentOS:
sudo yum groups install ''Basic Web Server''
sudo yum install mariadbmariadb-server
sudo yum install setroubleshoot
sudosystemctl enable --now apache2
sudosystemctl enable --now mariadb
auditd proporciona detalles minuciosos sobre el rendimiento y la actividad del servidor
mediante reglas de auditoría que se pueden modificar en función de sus necesidades.
Para instalar el demonio audit, use lo siguiente:
sudo yum list audit audit-libs
Después de instalar correctamente auditd, tiene que iniciar el servicio auditd para
empezar a recopilar registros de auditoría y, luego, almacenar los registros:
sudo systemctl start auditd
Si quiere iniciar auditd en el momento del arranque, debe usar el siguiente comando:
sudo systemctl enable auditd
Nota
En términos generales, Operations Management Suite (OMS) se retiró y se
pasó a Azure y el nombre “OMS” ya no se usa en ningún lado, excepto en algunos
nombres de variables. Ahora se conoce como Azure Monitor. Para obtener
más información sobre los cambios de nomenclatura y terminología, consulte
https://docs.microsoft.com/es-xl/azure/azure-monitor/terminology o también
puede obtener información detallada sobre la transición en https://docs.microsoft.
com/es-xl/azure/azure-monitor/platform/oms-portal-transition.
420 | Solución de problemas y supervisión de sus cargas de trabajo
Acceso al sistema
Aprender a solucionar problemas de las cargas de trabajo lo ayudará en su trabajo diario.
La solución de problemas en Azure no es diferente de hacerlo en otros entornos. En esta
sección, vamos a ver algunas sugerencias y trucos que lo ayudarán en su trabajo diario.
El comando az vm run se puede usar para ejecutar scripts de shell en la VM para una
administración general de la máquina o de las aplicaciones y para diagnosticar problemas.
Acceso al sistema | 421
Nota
Puede obtener el repositorio de Microsoft Azure PowerShell en https://github.com/
Azure/azure-powershell, que tiene los pasos de instalación y su uso. az reemplaza
a AzureRM y todas las características nuevas de Azure PowerShell estarán
disponible solo de az en adelante.
En el sitio de Azure, se deben comprobar la red y los grupos de seguridad de red, como
se indica en el Capítulo 3, Administración básica de Linux. En la VM, puede usar el
comando ss, como ip, que forma parte del paquete iproute2 para mostrar los puertos
UPD (-u) y TCP (p) que tengan un estado de escucha, junto con el ID del proceso (-p)
que abrió el puerto:
Figura 11.4: Uso del comando ss -tulpn para comprobar los puertos
Puede hacer una comprobación rápida de las reglas de firewall con firewall-cmd --list-
all --zone=public; si tiene varias zonas e interfaces, necesita ejecutarlo para cada zona.
Para incluir las reglas creadas por Azure Service Fabric, iptables-save puede ayudar:
Figura 11.5: Inclusión de las reglas creadas por Azure Service Fabric
Acceso al sistema | 423
Lamentablemente, no hay ningún comentario disponible para ver todas las reglas de
acceso configuradas en el nivel de unidad systemd. Recuerde comprobarlas, como se
indicó en el Capítulo 6, Administración de seguridad e identidades de Linux.
Uso de nftables
nftables es más fácil de usar que iptables y combina todo el marco iptables con
una sintaxis simple. nftables se basa en un subsistema netfilter que se puede usar
para crear reglas de filtrado complejas y agrupadas. nftables tiene muchas ventajas
sobre iptables. Por ejemplo, le permite realizar varias acciones con una sola regla.
Usa la herramienta de la línea de comandos nft, que también se puede usar en modo
interactivo con el comando nft -i:
1. Instale nftables con el siguiente comando:
sudo apt install nftables
2. Luego instale compat, lo que carga la compatibilidad con el subsistema de kernel
nftables:
apt install iptables-nftables-compat
3. Por último, habilite el servicio nftables con el siguiente comando:
sudo systemctl enable nftables.service
4. Puede ver la configuración actual de nft con esto:
nft list ruleset
5. Además, puede iniciar sesión en el modo interactivo de nft con el siguiente
comando:
nft –i
6. Ahora puede mostrar el conjunto de reglas existente con el comando list:
nft> list ruleset
7. Vamos a crear una tabla nueva, rule_table1:
nft>add table inet rule_table1
8. Ahora tendremos que agregar el comando chain para aceptar el tráfico entrante/
saliente de la siguiente manera:
nft>add chain inet rule_table1 input { type filter hook input priority 0 ;
policy accept; }
nft>add chain inet rule_table1 output { type filter hook input priority 0 ;
policy accept; }
424 | Solución de problemas y supervisión de sus cargas de trabajo
9. Puede usar el siguiente comando para agregar reglas para aceptar los puertos TCP
(Protocolo de control de transmisión):
nft>add rule inet rule_table1 input tcpdport { ssh, telnet, https, http }
accept
chain output {
type filter hook input priority 0; policy accept;
tcpdport { http, https } accept
}
}
Diagnóstico de arranque
Supongamos que creó su VM, quizás orquestada y probablemente su propia VM, pero
no arranca.
Antes de habilitar el diagnóstico de arranque en las VM, necesitará una cuenta
de almacenamiento para poder almacenar los datos. Puede enumerar las cuentas
de almacenamiento que ya están disponibles con el comando az storage account
list y, si es necesario, puede crear una con el comando az storage account create.
Ahora habilitaremos el diagnóstico de arranque con el siguiente comando en la CLI
de Azure:
az vm boot-diagnostics enable --name <vm name>\
--resource-group <resource group> \
--storage <url>
Acceso al sistema | 425
Figura 11.7: Uso del comando journalctl para obtener las entradas de registro de los procesos
Examinemos la salida:
• La primera columna es la marca de tiempo. En la base de datos, se define en tiempo
de EPOCH, por lo que si cambia la zona horaria, no hay problema: se traducirá.
• La segunda columna es el nombre de host, como muestra el comando hostnamectl.
• La tercera columna contiene un identificador y el ID del proceso.
• La cuarta columna es el mensaje.
Filtros
Por supuesto, puede usar grep en la salida estándar, pero journalctl tiene algunos
parámetros que realmente ayudan a filtrar la información que quiere:
• --priority: filtre según alert, crit, debug, emerg, err, info, notice y warning.
La clasificación de estas prioridades es la misma que en la especificación del
protocolo syslog.
• --since y --until: filtre según la marca de tiempo. Consulte man systemd.time
para ver todas las posibilidades.
• --lines: el número de líneas, similar a tail.
• --follow: comportamiento similar a tail -f.
• --reverse: pone primero la última línea.
• --output: cambia el formato de salida a formatos como JSON o agrega más detalles
a la salida.
• --catalog: agrega una explicación del mensaje si encuentra una disponible.
Figura 11.8: Filtro de las entradas de registro mediante el uso de varios filtros con journalctl
428 | Solución de problemas y supervisión de sus cargas de trabajo
Ahora presione Ctrl + I dos veces; verá todos los campos disponibles. El mismo principio
se aplica a estos filtros; es decir, puede combinarlos:
sudo journalctl _UID=1000 _PID=1850
Protocolo Syslog
Se habilitó el inicio de sesión en Linux y otros miembros de la familia Unix durante
la implementación del protocolo syslog. Todavía se usa para enviar registros
a servicios remotos.
Es importante entender que este protocolo usa las estructuras y la gravedad. Ambas
están estandarizadas en RFC 5424 (https://tools.ietf.org/html/rfc5424). Aquí, una
estructura especifica el tipo de programa que está registrando el mensaje; por ejemplo,
el kernel o cron. La etiqueta de gravedad está allí para describir el impacto, como
informativo o crítico.
La página man de los programadores para (man 3 syslog) también ofrece una buena
visión de estas estructuras y gravedades, y muestra cómo un programa puede usar este
protocolo. Las malas noticias sobre syslog es que solo funciona si la aplicación lo admite
y la aplicación se ejecuta lo suficiente para proporcionar esta funcionalidad. journald
es capaz de obtener todo lo relacionado con la salida de un programa.
Agregar entradas de registro
Puede agregar manualmente entradas a un registro. Para syslog, está disponible
el comando logger:
logger -p <facility.severity> "Message"
Veamos un ejemplo:
systemd-cat --identifier CHANGE --priority info \
echo "Start Configuration Change"
Como identificador, puede usar cadenas libres o estructuras de syslog. Tanto logger
como systemd-cat se pueden usar para generar entradas en el registro. Puede usarlo si
la aplicación no tiene compatibilidad con syslog; por ejemplo, puede usar esta directiva
en una configuración de Apache:
errorlog "tee -a /var/log/www/error/log | logger -p local6.info"
module(load="imjournal")
Después de la modificación, reinicie RSYSLOG:
sudo systemctl restart rsyslog
Nota
Este es el nombre del archivo en Ubuntu. En otras distribuciones, use /etc/
rsyslog.conf.
También hay disponible una aplicación móvil (en la tienda iOS y Android, puede
encontrarla bajo el nombre Microsoft Azure) si quiere ver el estado de las cargas de
trabajo mientras está en movimiento.
Nota
Este servicio no tiene costos por adelantado, usted paga lo que usa. Lea
http://aka.ms/PricingTierWarning para obtener más detalles.
Después de la creación del servicio, aparece una ventana emergente que le permite
navegar al recurso recién creado. También puede volver a buscar en Todos los servicios.
Observe, en la parte superior derecha del panel de recursos, Azure Monitor y el ID
del área de trabajo; necesitará esta información más adelante. Vaya a Configuración
avanzada para encontrar la clave del área de trabajo.
432 | Solución de problemas y supervisión de sus cargas de trabajo
Puede obtener información detallada sobre un área de trabajo en formato JSON con
el siguiente comando de la CLI de Azure:
az ml workspace show -w my-workspace -g my-resource-grp
wget \
https://github.com/microsoft/OMS-Agent-for-Linux \
/blob/master/installer/scripts/onboard_agent.sh
sudo -s
Haga clic en Máquinas virtuales (VM) de Azure. Verá las VM disponibles en esta área
de trabajo:
Como alternativa, para obtener todos los mensajes de syslog, como prueba, puede
reiniciar la VM o intentar esto:
logger -t <facility>. <priority> "message"
También hay muchos ejemplos disponibles si hace clic en el botón Búsquedas guardadas.
Las soluciones de supervisión proporcionan un complemento muy interesante para
simplificar aún más este proceso. En el panel Recurso, haga clic en Ver soluciones:
sudo sh InstallDependencyAgent-Linux64.bin -s
438 | Solución de problemas y supervisión de sus cargas de trabajo
Para habilitar Azure Monitor para el clúster existente de AKS, use el comando az aks
con esta modificación:
az aks enable-addons -a monitoring -n myAKS -g MyKubernetes
Register-AzResourceProvider -ProviderNamespaceMicrosoft.Insights
Figura 11.17: Visualización de la distribución del flujo de tráfico de la red con Análisis de tráfico
Aunque no use Azure Monitor, Azure puede proporciona todo tipo de métricas para
cada VM, pero no en una ubicación central. Simplemente vaya a su VM. En el panel
Información general, puede ver los datos de rendimiento de la CPU, la memoria y el
almacenamiento. La información detallada está disponible en la sección Métricas,
en Supervisión. Todos los tipos de datos están disponibles, como los datos de CPU,
almacenamiento y red:
Figura 11.19: Visualización del uso de los recursos con el comando top
444 | Solución de problemas y supervisión de sus cargas de trabajo
Figura 11.20: Las entradas inferiores de la salida obtenidas del comando top
Otra alternativa es nmon, que es similar a atop, pero se centra más en las estadísticas
y brinda información más detallada, especialmente con respecto a la memoria
y el almacenamiento:
glances es la alternativa más avanzada a top. Ofrece todas las características de las
alternativas y, además de eso, la puede usar de forma remota. Necesita proporcionar
el nombre de usuario y la contraseña del servidor para iniciar glances:
glances --username <username> --password <password> --server
Por ejemplo, use este comando para notificar las estadísticas de CPU cinco veces con
un intervalo de un segundo:
sar -u 1 5
(Si quiere supervisar individualmente todos los núcleos, puede usar la palabra clave ALL).
Estos son otros recursos importantes:
• -r: memoria
• -S: intercambio
• -d: disco
• -n <type>: tipos de red, como estos:
DEV: muestra las estadísticas de los dispositivos de red
EDEV: muestra las estadísticas de errores de los dispositivos de red
NFS: muestra las actividades del cliente NFS (Network File System)
SOCK: muestra los sockets que se usan para IPv4
IP: muestra el tráfico de red IPv4
TCP: muestra el tráfico de red TCPv4
UDP: muestra el tráfico de red UDPv4
ALL: muestra toda la información anterior
Supervisión del rendimiento | 449
iostat es una utilidad, como el nombre lo indica, que puede medir I/O, pero que
también crea informes para el uso de CPU:
Nota
En los sistemas Linux modernos, tanto systemd-timers como el método anterior
con cron están disponibles. sysstat todavía usa cron. Para comprobar si cron
está disponible y en ejecución, vaya a systemctl | grep cron.
cron ejecuta el comando sa1 cada 10 minutos. Recopila la actividad del sistema y la
almacena en una base de datos binaria. Una vez al día, el comando sa2 se ejecuta
para generar un informe. Los datos se almacenan en el directorio /var/log/sa.
Puede consultar esa base de datos con sadf:
Figura 11.25: Consulta de la base de datos con sadf para ver la actividad del sistema
Esta captura de pantalla muestra los datos del 6 de noviembre, entre las 09:00:00 y las
10:10:00. De manera predeterminada, muestra estadísticas de CPU, pero se puede
personalizar con los mismos parámetros que sar:
sadf /var/log/sa/sa03 -- -n DEV
Esto muestra las estadísticas de red de cada interfaz de red del 6 de noviembre.
Supervisión del rendimiento | 451
dstat
sysstat está disponible para los informes históricos, mientras que dstat se usa para los
informes en tiempo real. Si bien top es la versión supervisada de ps, es dstat la versión
de supervisión de sar:
Analiza la información del directorio /proc/net. Otra utilidad que puede analizar esta
información es ss. Puede solicitar un resumen sencillo con esto:
ss -s
Usar el parámetro -t no solo muestra los puertos con un estado de escucha, sino
también el tráfico entrante y saliente en esta interfaz específica.
Si necesita más detalles, el paquete iproute2 proporciona otra utilidad: nstat. Con el
parámetro –d, incluso se puede ejecutar en modo de intervalo:
Figura 11.28: Obtención de un informe detallado sobre los puertos con un estado de escucha
Supervisión del rendimiento | 453
Esto ya es mucho más que un resumen sencillo de ss. Sin embargo, el paquete iproute2
tiene más para ofrecer: lnstat.
Este es el comando que proporciona estadísticas de red, como el enrutamiento de
estadísticas de caché:
lnstat––d
Esto le muestra todo lo que puede mostrar o supervisar. Es de nivel muy bajo, pero
solucionamos algunos problemas relacionados con el rendimiento del firewall con
lnstat -f/proc/net/stat/nf_conntrack, a la vez que supervisamos el contador drops.
Todo está en una interfaz basada en menús, por lo que no hay parámetros que tenga
que recordar:
tcpdump
Por supuesto, tcpdump no es una solución de supervisión de rendimiento. Esta utilidad
es una excelente herramienta para supervisar, capturar y analizar el tráfico de red.
Para ver el tráfico de red en todas las interfaces de red, ejecute lo siguiente:
tcpdump -i any
Para agregar distintos niveles de detalle, repita el parámetro v hasta un nivel de detalle
máximo de tres:
tcpdump -n -i eth0 -vvv
tcpdumpsrc port 22
Se agregó el parámetro –c, así es que solo se capturaron cinco paquetes. Puede guardar
los datos capturados en un archivo:
tcpdump -v -x -XX -w /tmp/capture.log
Para leer los datos con una marca de tiempo completa en formato legible para las
personas, use este comando:
tcpdump -tttt -r /tmp/capture.log
Nota
Otro gran analizador de red es Wireshark. Es una herramienta gráfica que está
disponible para muchos sistemas operativos. Este analizador puede importar los
datos capturados de tcpdump. Incluye un gran filtro de búsqueda y herramientas
de análisis para muchos protocolos y servicios de red diferentes.
Resumen
En este capítulo, analizamos varios temas relacionados con la solución de problemas, el
registro, la supervisión e incluso el análisis. A partir de la obtención de acceso a una VM,
investigamos el registro en Linux tanto de manera local como remota.
Hay una delgada línea entre la supervisión del rendimiento y la solución de problemas
de rendimiento. Hay muchísimas utilidades diferentes disponibles para descubrir la
causa de sus problemas de rendimiento. Cada uno tiene un objetivo diferente, pero
también hay una gran superposición. Hemos hablado de las utilidades más populares
en Linux y algunas de las opciones disponibles.
En el primer capítulo, vimos que Azure es un entorno muy apto para open source,
y que Microsoft se ha esforzado mucho por hacer que Azure sea una solución de nube
abierta y estándar que tiene en cuenta la interoperabilidad. En este capítulo, vimos que
Microsoft no solo ha hecho un gran esfuerzo por admitir a Linux mientras implementa
su aplicación, sino también en Azure Monitor.
Preguntas
1. ¿Por qué debe tener al menos un usuario con una contraseña en una VM?
2. ¿Cuál es el propósito de este demonio de systemd-journald?
3. ¿Qué son las estructuras de syslog?
4. ¿Qué prioridades hay disponibles en syslog?
5. ¿Cómo puede agregar entradas a un registro y por qué hacerlo?
6. ¿Qué servicios hay disponibles para ver las métricas en Azure?
7. ¿Por qué top solo es útil para echar un primer vistazo a los problemas relacionados
con el rendimiento? ¿Qué utilidad o utilidades pueden corregir eso?
8. ¿Cuál es la diferencia entre las utilidades sysstat y dstat?
9. ¿Por qué debe instalar Wireshark en su estación de trabajo?
Lectura adicional | 457
Lectura adicional
Una excelente fuente de información es el sitio web de Brendan D Gregg
(http://www.brendangregg.com), donde comparte una lista increíblemente larga
de documentación, diapositivas, videos y más sobre el rendimiento de Linux. Además,
hay otras utilidades muy buenas. Él fue quien me enseñó, en 2015, que es importante
identificar correctamente un problema:
• ¿Qué le hace pensar que hay un problema?
• ¿Hubo alguna vez en que no hubo problemas?
• ¿Ha cambiado algo recientemente?
• Intente buscar descripciones técnicas, como latencia, errores en tiempo de
ejecución, etc.
• ¿Es solo la aplicación o también afecta a otros recursos?
• Proporcione una descripción exacta del entorno.
Por último, pero no menos importante, está la Red Hat Enterprise Linux Troubleshooting
Guide (Guía para la solución de problemas de Red Hat Enterprise Linux), de Benjamin
Cane. Sé que algunas partes del libro están obsoletas, ya que se imprimió en 2015 y, sin
duda, espero una segunda edición, pero, sobre todo si es su primera vez en Linux, le
recomiendo comprar este libro.
12 Apéndice
En este capítulo se presenta un conjunto de soluciones para todas las preguntas que se
hicieron en los capítulos anteriores. Si ya respondió estas preguntas, puede comprobar
la exactitud de sus respuestas. Si no pudo encontrar una solución en ese momento,
puede consultar las respuestas que se dan aquí para los capítulos respectivos.
3. A veces (por ejemplo, para una cuenta de almacenamiento), el nombre debe ser
exclusivo. Un prefijo combinado con un número generado aleatoriamente es una
buena manera de hacer que el nombre sea reconocible y único.
4. Para definir el intervalo IP que se puede usar dentro de una red virtual.
5. Para crear una o más subredes dentro de la red virtual que se pueden aislar
o enrutar entre sí, sin salir de la red virtual.
6. Un grupo de seguridad de red proporciona listas de control de acceso para la red
y proporciona enrutamiento de puertos a las máquinas virtuales o los contenedores.
7. El tráfico de la máquina virtual a Internet se envía a través de Traducción de
direcciones de red de origen (SNAT). Esto significa que la dirección IP del paquete
de origen se reemplaza por la dirección IP pública, que se necesita para TCP/IP
para el enrutamiento de salida y de entrada.
8. Se lanzará una dirección IP pública asignada dinámicamente cuando se desasigne
la máquina virtual. Cuando la máquina virtual vuelva a iniciarse, obtendrá otra
dirección IP. Puede crear y asignar una dirección IP pública estática cuando sea
obligatorio mantener la misma dirección IP incluso después de que cambie la
dirección IP del servicio.
mkdir /mnt/myraid
Capítulo 6: Administración de seguridad e identidades de Linux | 463
[Mount]
Where = /mnt/myraid
What = /dev/md127
Type = xfs
[Install]
WantedBy = local-fs.mount
Inicie y habilítelo en el arranque:
systemctl enable --now mnt-myraid.mount
7. Además del hecho de que SELinux puede proteger más objetos de recursos,
AppArmor trabaja directamente con las rutas de acceso, mientras que SELinux
protege todo el sistema con un control de acceso pormenorizado.
8. Necesita los siguientes requisitos previos antes de unirse a un dominio de AD:
Un cliente Kerberos para la autorización
Demonio de servicios de seguridad del sistema (SSSD): un back-end que es
responsable de la configuración y utilización de características como el uso
y el almacenamiento en caché de credenciales
Bibliotecas de Samba para admitir las opciones o características de Windows
Algunas utilidades para unirse al dominio y administrarlo, como realm, adcli
y el comando net