<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[labjp.xyz]]></title><description><![CDATA[🚀 Blog sobre Open Source, Kubernetes y Cloud Native. Pruebas de concepto, DevOps, CI/CD, seguridad y automatización. Experiencias en laboratorios y entornos re]]></description><link>https://labjp.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1738357324236/68f89b9c-0a53-4351-9ec1-44f35e38a39a.png</url><title>labjp.xyz</title><link>https://labjp.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 13:28:36 GMT</lastBuildDate><atom:link href="https://labjp.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[eBPF + IA + Kubernetes: Detección de Amenazas en Tiempo Real para Cloud Native]]></title><description><![CDATA[¿Cómo detectar ataques cibernéticos en tiempo real sin impactar el rendimiento?
Imagina un sistema que puede analizar cada paquete de red que pasa por tu infraestructura, detectar patrones sospechosos como ataques DDoS o escaneos de puertos, y alerta...]]></description><link>https://labjp.hashnode.dev/ebpf-ia-kubernetes-deteccion-de-amenazas-en-tiempo-real-para-cloud-native</link><guid isPermaLink="true">https://labjp.hashnode.dev/ebpf-ia-kubernetes-deteccion-de-amenazas-en-tiempo-real-para-cloud-native</guid><category><![CDATA[eBPF]]></category><category><![CDATA[IA]]></category><category><![CDATA[Kubernetes]]></category><dc:creator><![CDATA[Jean Paul López]]></dc:creator><pubDate>Sat, 23 Aug 2025 02:11:19 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-como-detectar-ataques-ciberneticos-en-tiempo-real-sin-impactar-el-rendimiento">¿Cómo detectar ataques cibernéticos en tiempo real sin impactar el rendimiento?</h2>
<p>Imagina un sistema que puede analizar <strong>cada paquete de red</strong> que pasa por tu infraestructura, detectar patrones sospechosos como ataques DDoS o escaneos de puertos, y alertarte en segundos - todo esto sin afectar la velocidad de tu red. Esto es exactamente lo que logra este proyecto combinando <strong>eBPF</strong> (observabilidad a nivel del kernel) con <strong>Inteligencia Artificial</strong>.</p>
<h3 id="heading-el-problema-que-resolvemos">El Problema que Resolvemos</h3>
<p>Los sistemas tradicionales de seguridad enfrentan un dilema:</p>
<ul>
<li><p><strong>Monitoreo superficial</strong>: Rápido pero pierde detalles críticos</p>
</li>
<li><p><strong>Análisis profundo</strong>: Detecta todo pero ralentiza el sistema</p>
</li>
</ul>
<p>Nuestra solución rompe este compromiso usando eBPF para capturar datos a velocidad del kernel, y modelos de ML para detectar tanto amenazas conocidas como anomalías nuevas.</p>
]]></content:encoded></item><item><title><![CDATA[Pasos para Ser un Golden Kubestronaut: Mi Experiencia Personal]]></title><description><![CDATA[Si estás leyendo esto, probablemente compartas conmigo esa fascinación por el mundo Cloud Native. Cuando me enteré del programa Kubestronaut de la CNCF, lo tomé como un reto interesante, una forma objetiva de medir en qué nivel realmente me encontrab...]]></description><link>https://labjp.hashnode.dev/pasos-para-ser-un-golden-kubestronaut-mi-experiencia-personal</link><guid isPermaLink="true">https://labjp.hashnode.dev/pasos-para-ser-un-golden-kubestronaut-mi-experiencia-personal</guid><category><![CDATA[Golden Kubestronaut]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[CKS]]></category><category><![CDATA[cka]]></category><category><![CDATA[ckad]]></category><category><![CDATA[kubestronaut]]></category><category><![CDATA[#LFCS]]></category><dc:creator><![CDATA[Jean Paul López]]></dc:creator><pubDate>Sat, 21 Jun 2025 22:15:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1750391328783/7767bee2-f693-4664-9ecb-47c796e297f3.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Si estás leyendo esto, probablemente compartas conmigo esa fascinación por el mundo Cloud Native. Cuando me enteré del programa Kubestronaut de la CNCF, lo tomé como un reto interesante, una forma objetiva de medir en qué nivel realmente me encontraba con respecto a Kubernetes. Era la oportunidad perfecta para poner a prueba mis conocimientos y ver qué tan lejos podía llegar en este ecosistema tan interesante. Y mientras estaba en plena preparación, la CNCF anunció el nuevo programa Golden Kubestronaut, lo que añadió una meta aún más ambiciosa a mi horizonte.</p>
<p>Todavía estoy en medio de esta travesía. He pasado varias noches estudiando, he conversado con profesionales que ya tienen su chaqueta, y he superado varios de esos exámenes. Si hay algo que he aprendido en este proceso es que cada certificación representa un desafío importante, pero la satisfacción de aprobar vale la pena.</p>
<p>Permíteme compartir cómo ha sido esta aventura desde mi perspectiva personal.</p>
<h2 id="heading-el-punto-de-partida-convertirse-en-kubestronaut"><strong>El punto de partida: Convertirse en Kubestronaut 🧑‍🚀</strong></h2>
<p>Todo comienza con un objetivo ambicioso pero alcanzable. Para obtener el título de Kubestronaut, debes demostrar un dominio integral de Kubernetes aprobando cinco certificaciones que abarcan los aspectos fundamentales de esta tecnología.</p>
<h3 id="heading-las-cinco-certificaciones-requeridas"><strong>Las cinco certificaciones requeridas</strong></h3>
<p>Para alcanzar el estatus de Kubestronaut, necesitas aprobar estos cinco exámenes:</p>
<p><strong>Exámenes teóricos</strong> (opción múltiple, sin acceso a documentación):</p>
<ul>
<li><p><strong>KCNA (Kubernetes and Cloud Native Associate)</strong>: Los cimientos teóricos de todo el ecosistema Cloud Native</p>
</li>
<li><p><strong>KCSA (Kubernetes and Cloud Native Security Associate)</strong>: Una inmersión profunda en los principios de seguridad en la nube</p>
</li>
</ul>
<p><strong>Exámenes prácticos</strong> (con acceso a documentación oficial):</p>
<ul>
<li><p><strong>CKA (Certified Kubernetes Administrator)</strong>: Valida tu capacidad para mantener un clúster en funcionamiento sin importar los obstáculos</p>
</li>
<li><p><strong>CKAD (Certified Kubernetes Application Developer)</strong>: Enfocado en el despliegue y la gestión eficiente de aplicaciones</p>
</li>
<li><p><strong>CKS (Certified Kubernetes Security Specialist)</strong>: El más desafiante, donde la seguridad es protagonista</p>
</li>
</ul>
<h3 id="heading-mi-recomendacion-personal-el-orden-importa"><strong>Mi recomendación personal: El orden importa</strong></h3>
<p>Después de mi experiencia y conversaciones con algunos Kubestronauts, te comparto el orden que considero más efectivo para abordar estas certificaciones:</p>
<ol>
<li><p><strong>KCNA</strong> - Comienza con los fundamentos teóricos del ecosistema</p>
</li>
<li><p><strong>KCSA</strong> - Profundiza en los conceptos de seguridad</p>
</li>
<li><p><strong>CKA</strong> - Tu primer examen práctico, estableciendo las bases administrativas</p>
</li>
<li><p><strong>CKAD</strong> - Construye sobre lo aprendido, ahora desde la perspectiva del desarrollador</p>
</li>
<li><p><strong>CKS</strong> - Especialización en seguridad de Kubernetes, requiere tener el CKA aprobado</p>
</li>
</ol>
<p>¿Por qué este orden? Iniciar con la parte teórica te proporciona una comprensión sólida del ecosistema antes de enfrentarte a la terminal. Los exámenes KCNA y KCSA te darán el contexto y vocabulario necesarios para aprovechar mejor la documentación durante los exámenes prácticos. Además, el CKS requiere haber aprobado previamente el CKA, por lo que tiene sentido dejarlo para el final cuando ya dominas tanto la teoría como la práctica.</p>
<h3 id="heading-la-recompensa"><strong>La recompensa</strong></h3>
<p>Cuando finalmente logras aprobar las cinco certificaciones y mantenerlas vigentes simultáneamente, llega el momento de la verdad. Las recompensas van más allá del reconocimiento: recibes la exclusiva chaqueta Kubestronaut (definitivamente un buen trofeo 🧥), tu insignia digital verificable, acceso a una comunidad privada en Slack donde intercambias conocimientos con otros expertos, y descuentos para continuar tu formación.</p>
<h2 id="heading-el-siguiente-nivel-golden-kubestronaut"><strong>El siguiente nivel: Golden Kubestronaut 🌟</strong></h2>
<p>Alcanzar el nivel Kubestronaut es solo el comienzo. Para quienes quieren ir más allá, existe el Golden Kubestronaut —un nivel para aquellos que no solo dominan Kubernetes, sino que conocen a fondo gran parte del ecosistema Cloud Native reconocido por la CNCF.</p>
<h3 id="heading-un-viaje-a-traves-del-ecosistema"><strong>Un viaje a través del ecosistema</strong></h3>
<p>La lista de certificaciones requeridas se expande considerablemente. Además de mantener las cinco certificaciones Kubestronaut, debes conquistar las siguientes:</p>
<p><strong>LFCS (Linux Foundation Certified SysAdmin)</strong>: El viaje comienza estableciendo una base sólida en Linux. Es un examen práctico puro, donde solo cuentas con la terminal y tu conocimiento.</p>
<p>A partir de ahí, te sumerges en un océano de herramientas especializadas. La mayoría son exámenes teóricos que ponen a prueba tu comprensión profunda:</p>
<ul>
<li><p><strong>PCA</strong>: Prometheus para monitoreo y alertas. Te evalúa en métricas, consultas PromQL y mejores prácticas de observabilidad.</p>
</li>
<li><p><strong>CCA</strong>: Cilium para networking avanzado y seguridad. Cubre eBPF, políticas de red y observabilidad de tráfico.</p>
</li>
<li><p><strong>CAPA</strong>: Argo Project, enfocado en ArgoCD para GitOps, Argo Workflows para orquestación y las demás herramientas del ecosistema Argo.</p>
</li>
<li><p><strong>CGOA</strong>: GitOps como metodología. Principios, patrones y mejores prácticas para la entrega continua declarativa.</p>
</li>
<li><p><strong>CBA</strong>: Backstage para portales de desarrolladores. Construcción de catálogos de servicios y experiencias de desarrollo internas.</p>
</li>
<li><p><strong>OTCA</strong>: OpenTelemetry para observabilidad unificada. Trazas distribuidas, métricas y logs en un estándar abierto.</p>
</li>
<li><p><strong>KCA</strong>: Kyverno para políticas declarativas. Validación, mutación y generación de recursos de Kubernetes.</p>
</li>
</ul>
<p>Mención especial merece el <strong>ICA (Istio Certified Associate)</strong>, que combina preguntas teóricas con un laboratorio práctico. Te obliga a cambiar de enfoque a mitad del examen, algo bastante particular.</p>
<h3 id="heading-los-beneficios-adicionales"><strong>Los beneficios adicionales</strong></h3>
<p>Alcanzar el estatus Golden Kubestronaut trae consigo beneficios adicionales: una mochila dorada, un gorro de edición limitada, suscripciones a plataformas de bienestar, una entrada gratuita anual a cualquier Kubernetes Community Day, y descuentos para KubeCon y futuras certificaciones. Es un reconocimiento importante a tu dedicación y conocimiento.</p>
<h2 id="heading-lecciones-desde-las-trincheras"><strong>Lecciones desde las trincheras 🔥</strong></h2>
<p>Aunque todavía me faltan por aprobar el CKS, ICA, CCA, CBA y LFCS para completar mi camino hacia el Golden Kubestronaut, quiero compartir lo que he aprendido hasta ahora y lo que me han contado otros compañeros de esta aventura.</p>
<p>Cada examen tiene su propia personalidad. El CKA y CKAD me enseñaron mucho sobre la administración y desarrollo en Kubernetes. Según quienes ya pasaron por el CKS, es donde la seguridad se vuelve protagonista con escenarios complejos. Y el LFCS, me cuentan, es un regreso a las bases de administración de sistemas Linux, donde solo tienes la terminal como herramienta. Cada certificación aprobada te da energía para continuar, aunque hay momentos donde el cansancio y las dudas aparecen.</p>
<h3 id="heading-consejos-que-marcan-la-diferencia"><strong>Consejos que marcan la diferencia</strong></h3>
<p>Estas son algunas estrategias que me han funcionado y que otros Kubestronauts también recomiendan:</p>
<p><strong>Compromiso con fecha límite</strong>: Cuando compres un voucher, agenda el examen de inmediato. Tener una fecha en el calendario te obliga a estudiar en serio. La presión de una fecha límite realmente funciona.</p>
<p><strong>Domina la navegación de documentación</strong>: En los exámenes prácticos (CKA, CKAD, CKS), saber buscar rápido en la documentación oficial es tan importante como conocer los comandos. Practica hasta que encuentres cualquier cosa en segundos.</p>
<p><strong>Preparación para exámenes teóricos</strong>: Sin atajos. Haz resúmenes y repasa hasta que los conceptos sean claros.</p>
<p><strong>La práctica es clave</strong>: Monta tu propio clúster con minikube o kind, usa las sesiones de práctica de killer.sh (vienen con CKA/CKAD/CKS/LFCS), y practica hasta que kubectl sea natural para ti.</p>
<p><strong>Únete a la comunidad</strong>: Los grupos de estudio locales de CNCF (<a target="_blank" href="https://community.cncf.io/chapters/">https://community.cncf.io/chapters/</a>) son un gran apoyo. Compartir experiencias y dudas con otros que están en el mismo camino hace toda la diferencia.</p>
<p><strong>Invierte en buenos recursos</strong>: Plataformas como KodeKloud ofrecen laboratorios y cursos especializados. Aunque son de pago, la inversión vale la pena por la calidad del contenido y la práctica que obtienes.</p>
<p><strong>Busca descuentos para certificaciones</strong>: Las certificaciones tienen un costo considerable, pero siempre hay formas de ahorrar. El repositorio <a target="_blank" href="https://github.com/techiescamp/linux-foundation-coupon">https://github.com/techiescamp/linux-foundation-coupon</a> mantiene cupones activos cada mes. El mejor momento para comprar suele ser Black Friday.</p>
<h2 id="heading-la-mision-continua"><strong>La misión continúa...</strong></h2>
<p>El camino hacia el Golden Kubestronaut es arduo y exigente, pero puedo asegurarte que cada hora invertida te transforma profundamente como profesional. Más allá de las insignias o la vestimenta exclusiva, es una demostración tangible de tu compromiso con la excelencia y una oportunidad invaluable para crecer y compartir conocimiento con la comunidad.</p>
<p>Mi viaje continúa, celebrando cada logro, por pequeño que sea. Si tú también has emprendido esta ruta, mi consejo es simple: persevera. Establece tu próximo objetivo, estudia con pasión y celebra cada avance.</p>
<p>¡Espero encontrarte pronto en el exclusivo club dorado! 🚀✨</p>
<h3 id="heading-referencias-utiles"><strong>Referencias útiles</strong></h3>
<ul>
<li><p><strong>Programa oficial Kubestronaut</strong>: <a target="_blank" href="https://www.cncf.io/training/kubestronaut/">https://www.cncf.io/training/kubestronaut/</a></p>
</li>
<li><p><strong>Comunidades locales CNCF</strong>: <a target="_blank" href="https://community.cncf.io/chapters/">https://community.cncf.io/chapters/</a></p>
</li>
<li><p><strong>Cupones de descuento actualizados</strong>: <a target="_blank" href="https://github.com/techiescamp/linux-foundation-coupon">https://github.com/techiescamp/linux-foundation-coupon</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Ansible Execution Environment: Optimizando la Automatización con Contenedores]]></title><description><![CDATA[La historia de un problema común
Imagina esta situación: acabas de escribir un playbook de Ansible perfecto en tu máquina local. Funciona de maravilla. Lo pruebas una y otra vez, y todo sale bien. Llega el momento de ejecutarlo en producción y... ¡so...]]></description><link>https://labjp.hashnode.dev/ansible-execution-environment-optimizando-la-automatizacion-con-contenedores</link><guid isPermaLink="true">https://labjp.hashnode.dev/ansible-execution-environment-optimizando-la-automatizacion-con-contenedores</guid><category><![CDATA[automation]]></category><category><![CDATA[ansible]]></category><category><![CDATA[containers]]></category><category><![CDATA[AAP]]></category><category><![CDATA[execution environment]]></category><dc:creator><![CDATA[Jean Paul López]]></dc:creator><pubDate>Sat, 21 Jun 2025 05:00:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1738359810593/6e3a4205-7020-470c-aeaa-501705a1ac27.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-la-historia-de-un-problema-comun">La historia de un problema común</h2>
<p>Imagina esta situación: acabas de escribir un playbook de Ansible perfecto en tu máquina local. Funciona de maravilla. Lo pruebas una y otra vez, y todo sale bien. Llega el momento de ejecutarlo en producción y... ¡sorpresa! Falla porque el servidor tiene una versión diferente de Python, le faltan módulos o tiene dependencias incompatibles.</p>
<p>Si esto te suena familiar, no estás solo. Es uno de los dolores de cabeza más comunes en el mundo de la automatización con Ansible. Y es precisamente el problema que <strong>Ansible Execution Environment (EE)</strong> viene a resolver.</p>
<h2 id="heading-que-es-exactamente-un-execution-environment">¿Qué es exactamente un Execution Environment?</h2>
<p>Piensa en un Execution Environment como una "cápsula espacial" para tus playbooks de Ansible. Es un contenedor que lleva consigo todo lo necesario para ejecutar tus automatizaciones: la versión correcta de Python, todos los módulos necesarios, las colecciones de Ansible que usas, y cualquier herramienta adicional que requieras.</p>
<p>La gran diferencia es que, mientras antes tenías que asegurarte de que cada servidor tuviera el entorno correcto configurado (y mantenerlo actualizado), ahora simplemente ejecutas tu contenedor y listo.</p>
<h2 id="heading-por-que-esto-cambia-todo">¿Por qué esto cambia todo?</h2>
<h3 id="heading-1-consistencia-total-entre-ambientes">1. <strong>Consistencia total entre ambientes</strong></h3>
<p>Ya no más "funciona en mi máquina". Tu playbook se ejecutará exactamente igual en desarrollo, staging y producción. La misma versión de Python, las mismas librerías, los mismos resultados.</p>
<h3 id="heading-2-colaboracion-sin-dolores-de-cabeza">2. <strong>Colaboración sin dolores de cabeza</strong></h3>
<p>Cuando compartes un EE con tu equipo, todos trabajan con el mismo entorno. No más perder horas configurando dependencias o resolviendo conflictos de versiones.</p>
<h3 id="heading-3-multiples-versiones-sin-conflictos">3. <strong>Múltiples versiones sin conflictos</strong></h3>
<p>¿Un playbook legacy necesita Python 2.7 mientras que otro requiere Python 3.11? Sin problema. Cada EE es independiente y puede tener sus propias versiones de todo.</p>
<h3 id="heading-4-preparado-para-el-enterprise">4. <strong>Preparado para el enterprise</strong></h3>
<p>Si tu empresa usa o planea usar Ansible Automation Platform, los EE son el estándar. Facilitan la gobernanza, el cumplimiento y la escalabilidad de tus automatizaciones.</p>
<h2 id="heading-manos-a-la-obra-creando-tu-primer-execution-environment">Manos a la obra: Creando tu primer Execution Environment</h2>
<p>Vamos a crear un EE usando la versión más reciente de ansible-builder. Esta guía está probada y funciona perfectamente con Red Hat UBI 9.</p>
<h3 id="heading-paso-1-instalar-las-herramientas-necesarias">Paso 1: Instalar las herramientas necesarias</h3>
<p>Primero necesitamos <code>ansible-builder</code>:</p>
<pre><code class="lang-bash"><span class="hljs-comment"># Instalar la última versión de ansible-builder</span>
pip install ansible-builder --upgrade

<span class="hljs-comment"># Verificar que tienes la versión 3.x</span>
ansible-builder --version

<span class="hljs-comment"># También necesitarás Podman o Docker</span>
<span class="hljs-comment"># En Fedora/RHEL:</span>
sudo dnf install podman

<span class="hljs-comment"># En Ubuntu/Debian:</span>
sudo apt install podman
</code></pre>
<h3 id="heading-paso-2-crear-la-estructura-del-proyecto">Paso 2: Crear la estructura del proyecto</h3>
<p>Vamos a crear todos los archivos necesarios de una vez. Crea un directorio para tu proyecto:</p>
<pre><code class="lang-bash">mkdir mi-ee-ubi9 &amp;&amp; <span class="hljs-built_in">cd</span> mi-ee-ubi9
</code></pre>
<h3 id="heading-paso-3-crear-el-archivo-principal-execution-environmentyml">Paso 3: Crear el archivo principal <code>execution-environment.yml</code></h3>
<p>Este es el corazón de tu EE. Crea el archivo con este contenido:</p>
<pre><code class="lang-yaml"><span class="hljs-attr">version:</span> <span class="hljs-number">3</span>

<span class="hljs-attr">build_arg_defaults:</span>
  <span class="hljs-attr">ANSIBLE_GALAXY_CLI_COLLECTION_OPTS:</span> <span class="hljs-string">'--pre'</span>

<span class="hljs-attr">dependencies:</span>
  <span class="hljs-attr">ansible_core:</span>
    <span class="hljs-attr">package_pip:</span> <span class="hljs-string">ansible-core==2.14.4</span>
  <span class="hljs-attr">ansible_runner:</span>
    <span class="hljs-attr">package_pip:</span> <span class="hljs-string">ansible-runner</span>
  <span class="hljs-attr">galaxy:</span> <span class="hljs-string">requirements.yml</span>
  <span class="hljs-attr">python:</span> <span class="hljs-string">requirements.txt</span>
  <span class="hljs-attr">system:</span> <span class="hljs-string">bindep.txt</span>
  <span class="hljs-attr">exclude:</span>
    <span class="hljs-attr">python:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">docker</span>
    <span class="hljs-attr">system:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">python3-Cython</span>

<span class="hljs-attr">images:</span>
  <span class="hljs-attr">base_image:</span>
    <span class="hljs-attr">name:</span> <span class="hljs-string">docker.io/redhat/ubi9:latest</span>

<span class="hljs-attr">additional_build_files:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">src:</span> <span class="hljs-string">files/ansible.cfg</span>
    <span class="hljs-attr">dest:</span> <span class="hljs-string">configs</span>

<span class="hljs-attr">additional_build_steps:</span>
  <span class="hljs-attr">prepend_base:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">RUN</span> <span class="hljs-string">echo</span> <span class="hljs-string">"Starting build process..."</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">RUN</span> <span class="hljs-string">dnf</span> <span class="hljs-string">install</span> <span class="hljs-string">-y</span> <span class="hljs-string">python3-pip</span>

  <span class="hljs-attr">prepend_galaxy:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">COPY</span> <span class="hljs-string">_build/configs/ansible.cfg</span> <span class="hljs-string">/etc/ansible/ansible.cfg</span>

  <span class="hljs-attr">prepend_final:</span> <span class="hljs-string">|
    RUN whoami
    RUN cat /etc/os-release
</span>
  <span class="hljs-attr">append_final:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">RUN</span> <span class="hljs-string">echo</span> <span class="hljs-string">"Build completed!"</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">RUN</span> <span class="hljs-string">dnf</span> <span class="hljs-string">clean</span> <span class="hljs-string">all</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">RUN</span> <span class="hljs-string">rm</span> <span class="hljs-string">-rf</span> <span class="hljs-string">/var/cache/dnf</span>
</code></pre>
<h3 id="heading-paso-4-crear-las-dependencias-del-sistema-bindeptxt">Paso 4: Crear las dependencias del sistema (<code>bindep.txt</code>)</h3>
<p>Este archivo lista los paquetes del sistema operativo que necesitas:</p>
<pre><code class="lang-plaintext"># Compilación
gcc [compile platform:rpm]
make [compile platform:rpm]

# Control de versiones
git [platform:rpm]

# Herramientas de red
iputils [platform:rpm]
net-tools [platform:rpm]
openssh-clients [platform:rpm]

# Desarrollo Python
python3-devel [platform:rpm]
python3-cffi [platform:rpm]
python3-cryptography [platform:rpm]
python3-lxml [platform:rpm]
python3-pycparser [platform:rpm]

# SSH y conectividad
libssh-devel [platform:rpm]
sshpass [platform:rpm]

# Utilidades
rsync [platform:rpm]
unzip [platform:rpm]
tar [platform:rpm]
</code></pre>
<h3 id="heading-paso-5-crear-las-colecciones-de-ansible-requirementsyml">Paso 5: Crear las colecciones de Ansible (<code>requirements.yml</code>)</h3>
<p>Define qué colecciones de Ansible necesitas:</p>
<pre><code class="lang-yaml"><span class="hljs-meta">---</span>
<span class="hljs-attr">collections:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">ansible.posix</span>
    <span class="hljs-attr">version:</span> <span class="hljs-string">"&gt;=1.5.0"</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">community.general</span>
    <span class="hljs-attr">version:</span> <span class="hljs-string">"&gt;=7.0.0"</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">ansible.utils</span>
    <span class="hljs-attr">version:</span> <span class="hljs-string">"&gt;=2.9.0"</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">community.crypto</span>
    <span class="hljs-attr">version:</span> <span class="hljs-string">"&gt;=2.11.0"</span>
</code></pre>
<h3 id="heading-paso-6-crear-las-dependencias-de-python-requirementstxt">Paso 6: Crear las dependencias de Python (<code>requirements.txt</code>)</h3>
<p>Lista los paquetes de Python necesarios:</p>
<pre><code class="lang-plaintext"># Core
six&gt;=1.16.0
psutil&gt;=5.9.0

# Networking
paramiko&gt;=2.12.0
netaddr&gt;=0.8.0

# Utilidades
jinja2&gt;=3.1.0
PyYAML&gt;=6.0
requests&gt;=2.28.0
urllib3&gt;=1.26.0
</code></pre>
<h3 id="heading-paso-7-crear-la-configuracion-de-ansible">Paso 7: Crear la configuración de Ansible</h3>
<p>Primero crea el directorio:</p>
<pre><code class="lang-bash">mkdir -p files
</code></pre>
<p>Luego crea <code>files/ansible.cfg</code>:</p>
<pre><code class="lang-plaintext">[defaults]
host_key_checking = False
retry_files_enabled = False
stdout_callback = yaml
interpreter_python = auto_silent
gathering = smart
fact_caching = jsonfile
fact_caching_connection = /tmp/ansible-facts
fact_caching_timeout = 3600

[ssh_connection]
pipelining = True
control_path = /tmp/ansible-ssh-%%h-%%p-%%r

[inventory]
enable_plugins = auto, yaml, ini, toml
</code></pre>
<h3 id="heading-paso-8-construir-tu-execution-environment">Paso 8: Construir tu Execution Environment</h3>
<p>Ahora viene el momento de la verdad:</p>
<pre><code class="lang-bash">ansible-builder build -t mi-ee:latest
</code></pre>
<p>El proceso tomará algunos minutos la primera vez. Verás cómo:</p>
<ol>
<li><p>Se descarga la imagen base de UBI 9</p>
</li>
<li><p>Se instalan los paquetes del sistema</p>
</li>
<li><p>Se configuran las dependencias de Python</p>
</li>
<li><p>Se descargan las colecciones de Ansible</p>
</li>
<li><p>Se aplican las configuraciones personalizadas</p>
</li>
</ol>
<h3 id="heading-paso-9-verificar-y-usar-tu-ee">Paso 9: Verificar y usar tu EE</h3>
<p><strong>Verificar que se construyó correctamente:</strong></p>
<pre><code class="lang-bash"><span class="hljs-comment"># Ver la imagen creada</span>
podman images | grep mi-ee

<span class="hljs-comment"># Ver qué colecciones están instaladas</span>
podman run --rm mi-ee:latest ansible-galaxy collection list

<span class="hljs-comment"># Ver la versión de Ansible</span>
podman run --rm mi-ee:latest ansible --version

<span class="hljs-comment"># Ver qué módulos de Python están instalados</span>
podman run --rm mi-ee:latest pip list
</code></pre>
<p><strong>Usar tu EE para ejecutar playbooks:</strong></p>
<pre><code class="lang-bash"><span class="hljs-comment"># Instalar ansible-navigator si no lo tienes</span>
pip install ansible-navigator

<span class="hljs-comment"># Ejecutar un playbook</span>
ansible-navigator run site.yml --execution-environment-image mi-ee:latest
</code></pre>
<h2 id="heading-troubleshooting-problemas-comunes-y-sus-soluciones">Troubleshooting: Problemas comunes y sus soluciones</h2>
<h3 id="heading-el-build-falla-con-error-de-paquete-no-encontrado">"El build falla con error de paquete no encontrado"</h3>
<p>Este es el error más común al usar UBI. Red Hat Universal Base Image tiene repositorios limitados por diseño.</p>
<p><strong>Solución rápida</strong>: Revisa qué paquete falla y:</p>
<ol>
<li><p>Búscalo con un nombre alternativo</p>
</li>
<li><p>Elimínalo de <code>bindep.txt</code> si no es crítico</p>
</li>
<li><p>Instálalo desde fuente en <code>additional_build_steps</code></p>
</li>
</ol>
<p><strong>Ejemplo real</strong>: Si <code>openshift-clients</code> no está disponible:</p>
<pre><code class="lang-yaml"><span class="hljs-attr">additional_build_steps:</span>
  <span class="hljs-attr">prepend_base:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">RUN</span> <span class="hljs-string">curl</span> <span class="hljs-string">-L</span> <span class="hljs-string">https://mirror.openshift.com/pub/openshift-v4/clients/ocp/latest/openshift-client-linux.tar.gz</span> <span class="hljs-string">|</span> <span class="hljs-string">tar</span> <span class="hljs-string">xz</span> <span class="hljs-string">-C</span> <span class="hljs-string">/usr/local/bin</span>
</code></pre>
<h3 id="heading-mi-ee-pesa-mas-de-1gb">"Mi EE pesa más de 1GB"</h3>
<p>Los EEs pueden inflarse rápidamente, especialmente con múltiples colecciones y dependencias.</p>
<p><strong>Estrategia de optimización</strong>:</p>
<ol>
<li><p>Revisa qué realmente necesitas - menos es más</p>
</li>
<li><p>Limpia después de instalar:</p>
</li>
</ol>
<pre><code class="lang-yaml"><span class="hljs-attr">additional_build_steps:</span>
  <span class="hljs-attr">append_final:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">RUN</span> <span class="hljs-string">dnf</span> <span class="hljs-string">clean</span> <span class="hljs-string">all</span> <span class="hljs-string">&amp;&amp;</span> <span class="hljs-string">rm</span> <span class="hljs-string">-rf</span> <span class="hljs-string">/var/cache/dnf</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">RUN</span> <span class="hljs-string">find</span> <span class="hljs-string">/usr/local</span> <span class="hljs-string">-type</span> <span class="hljs-string">d</span> <span class="hljs-string">-name</span> <span class="hljs-string">"__pycache__"</span> <span class="hljs-string">-exec</span> <span class="hljs-string">rm</span> <span class="hljs-string">-rf</span> {} <span class="hljs-string">+</span> <span class="hljs-number">2</span><span class="hljs-string">&gt;/dev/null</span> <span class="hljs-string">||</span> <span class="hljs-literal">true</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">RUN</span> <span class="hljs-string">find</span> <span class="hljs-string">/usr/local</span> <span class="hljs-string">-type</span> <span class="hljs-string">f</span> <span class="hljs-string">-name</span> <span class="hljs-string">"*.pyc"</span> <span class="hljs-string">-delete</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">RUN</span> <span class="hljs-string">rm</span> <span class="hljs-string">-rf</span> <span class="hljs-string">/root/.cache</span> <span class="hljs-string">/tmp/*</span>
</code></pre>
<h3 id="heading-permission-denied-al-montar-volumenes">"Permission denied al montar volúmenes"</h3>
<p>El clásico problema de SELinux en sistemas Red Hat.</p>
<p><strong>Solución</strong>: Siempre usa la opción <code>:Z</code> al montar:</p>
<pre><code class="lang-yaml"><span class="hljs-comment"># Correcto</span>
<span class="hljs-string">podman</span> <span class="hljs-string">run</span> <span class="hljs-string">-v</span> <span class="hljs-string">$(pwd):/runner:Z</span> <span class="hljs-string">mi-ee:latest</span>
</code></pre>
<h2 id="heading-mejores-practicas">Mejores prácticas</h2>
<ol>
<li><p><strong>Versiona tus EEs</strong>: Usa tags semánticos como <code>v1.0.0</code>, no solo <code>latest</code></p>
</li>
<li><p><strong>Documenta dependencias</strong>: Comenta por qué incluyes cada paquete</p>
</li>
<li><p><strong>Mantén EEs específicos</strong>: Crea diferentes EEs para diferentes propósitos</p>
</li>
<li><p><strong>Automatiza builds</strong>: Integra la construcción en tu CI/CD</p>
</li>
<li><p><strong>Prueba regularmente</strong>: Valida que tus playbooks funcionan con el EE</p>
</li>
</ol>
<h2 id="heading-conclusion">Conclusión</h2>
<p>Los Ansible Execution Environments representan un cambio fundamental en cómo manejamos las dependencias y la portabilidad en Ansible. Con esta guía, tienes todo lo necesario para crear EEs robustos y reproducibles basados en Red Hat UBI 9.</p>
<p>La clave está en empezar simple: crea tu primer EE con las dependencias mínimas, pruébalo, y ve agregando lo que necesites. En poco tiempo, te preguntarás cómo sobrevivías sin ellos.</p>
<h2 id="heading-recursos-adicionales">Recursos adicionales</h2>
<ul>
<li><p><a target="_blank" href="https://ansible-builder.readthedocs.io/en/latest/">Documentación oficial de Ansible Builder</a></p>
</li>
<li><p><a target="_blank" href="https://ansible-navigator.readthedocs.io/">Ansible Navigator Documentation</a></p>
</li>
<li><p><a target="_blank" href="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/building_running_and_managing_containers/index">Red Hat UBI Documentation</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/ansible/ansible-builder">Ejemplos de EE en GitHub</a></p>
</li>
</ul>
<hr />
<p><strong>¿Ya creaste tu primer Execution Environment?</strong> ¿Qué problemas resolviste? ¿Qué personalizaciones agregaste?</p>
<p>Y si este artículo te fue útil, compártelo con ese colega que siempre está peleando con las versiones de Python. 😉</p>
]]></content:encoded></item></channel></rss>