<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://lorcopotia.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://lorcopotia.github.io/" rel="alternate" type="text/html" /><updated>2025-05-28T15:51:15+00:00</updated><id>https://lorcopotia.github.io/feed.xml</id><title type="html">IT neighbor</title><subtitle>DevOps Engineer, SysAdmin, Gamer y filósofo de la vida.</subtitle><entry><title type="html">Aprende Python creando tu propio contador de palabras</title><link href="https://lorcopotia.github.io/2025/05/04/Aprende-Python-creando-tu-propio-contador-de-palabras.html" rel="alternate" type="text/html" title="Aprende Python creando tu propio contador de palabras" /><published>2025-05-04T00:00:00+00:00</published><updated>2025-05-04T00:00:00+00:00</updated><id>https://lorcopotia.github.io/2025/05/04/Aprende-Python-creando-tu-propio-contador-de-palabras</id><content type="html" xml:base="https://lorcopotia.github.io/2025/05/04/Aprende-Python-creando-tu-propio-contador-de-palabras.html"><![CDATA[<p>Una de las mejores formas de iniciarte en el mundo del desarrollo con Python es mediante la creación de <strong>scripts prácticos y reutilizables</strong>. Hoy vamos a explorar un ejemplo sencillo pero poderoso: un <strong>contador de palabras</strong> que analiza archivos de texto.</p>

<p>Este script no solo enseña los fundamentos de Python, sino que también introduce buenas prácticas como uso de módulos estándar, expresiones regulares y estructuras de control.</p>

<hr />

<h2 id="-qué-hace-el-script">🔍 ¿Qué hace el script?</h2>

<p>El objetivo del script es <strong>leer un archivo de texto, contar la frecuencia de cada palabra</strong> (ignorando mayúsculas, minúsculas y símbolos especiales), y mostrar los resultados ordenados por frecuencia de uso.</p>

<hr />

<h2 id="-paso-a-paso">🧱 Paso a paso</h2>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">Counter</span>
<span class="kn">import</span> <span class="nn">re</span>
</code></pre></div></div>

<ul>
  <li>os: para verificar si el archivo existe.</li>
  <li>Counter: estructura que cuenta elementos rápidamente.</li>
  <li>re: expresiones regulares para limpiar y extraer palabras.</li>
</ul>

<h2 id="-función-principal">💬 Función principal</h2>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">count_words</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span>
    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s">'r'</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s">'utf-8'</span><span class="p">)</span> <span class="k">as</span> <span class="nb">file</span><span class="p">:</span>
        <span class="n">words</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="nb">file</span><span class="p">:</span>
            <span class="n">line_words</span> <span class="o">=</span> <span class="n">re</span><span class="p">.</span><span class="n">findall</span><span class="p">(</span><span class="sa">r</span><span class="s">'\b\w+\b'</span><span class="p">,</span> <span class="n">line</span><span class="p">.</span><span class="n">lower</span><span class="p">())</span>
            <span class="n">words</span><span class="p">.</span><span class="n">extend</span><span class="p">(</span><span class="n">line_words</span><span class="p">)</span>
        <span class="n">word_count</span> <span class="o">=</span> <span class="n">Counter</span><span class="p">(</span><span class="n">words</span><span class="p">)</span>
        <span class="k">for</span> <span class="n">word</span><span class="p">,</span> <span class="n">count</span> <span class="ow">in</span> <span class="n">word_count</span><span class="p">.</span><span class="n">most_common</span><span class="p">():</span>
            <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"</span><span class="si">{</span><span class="n">word</span><span class="si">}</span><span class="s">: </span><span class="si">{</span><span class="n">count</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
</code></pre></div></div>

<ul>
  <li>Lee el archivo línea por línea.</li>
  <li>Convierte todo a minúsculas.</li>
  <li>Usa una expresión regular para encontrar solo palabras.</li>
  <li>Usa Counter para contar cuántas veces aparece cada palabra.</li>
  <li>Muestra los resultados ordenados por frecuencia.</li>
</ul>

<h2 id="-bloque-principal">🚀 Bloque principal</h2>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">"__main__"</span><span class="p">:</span>
    <span class="n">filename</span> <span class="o">=</span> <span class="s">'lewis.txt'</span>
    <span class="k">if</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">exists</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span>
        <span class="n">count_words</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"File '</span><span class="si">{</span><span class="n">filename</span><span class="si">}</span><span class="s">' does not exist."</span><span class="p">)</span>
</code></pre></div></div>

<h2 id="-por-qué-es-útil-para-principiantes">🌟 ¿Por qué es útil para principiantes?</h2>

<ul>
  <li>Te obliga a pensar en flujos de entrada/salida.</li>
  <li>Introduce el manejo de errores de forma simple (os.path.exists).</li>
  <li>Trabaja con archivos de texto, una tarea común en cualquier ámbito.</li>
  <li>Te enseña a usar herramientas potentes como Counter y re.</li>
</ul>

<h2 id="-conclusión">🧠 Conclusión</h2>

<p>Este tipo de script es ideal para quienes empiezan con Python porque combina varios conceptos esenciales en menos de 30 líneas de código. Además, ¡puedes adaptarlo fácilmente para otros fines como análisis de logs, procesamiento de datos o creación de herramientas de línea de comandos!</p>

<p>¿Y tú, qué vas a automatizar hoy? 💡</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Una de las mejores formas de iniciarte en el mundo del desarrollo con Python es mediante la creación de scripts prácticos y reutilizables. Hoy vamos a explorar un ejemplo sencillo pero poderoso: un contador de palabras que analiza archivos de texto. Este script no solo enseña los fundamentos de Python, sino que también introduce buenas prácticas como uso de módulos estándar, expresiones regulares y estructuras de control. 🔍 ¿Qué hace el script? El objetivo del script es leer un archivo de texto, contar la frecuencia de cada palabra (ignorando mayúsculas, minúsculas y símbolos especiales), y mostrar los resultados ordenados por frecuencia de uso. 🧱 Paso a paso import os from collections import Counter import re os: para verificar si el archivo existe. Counter: estructura que cuenta elementos rápidamente. re: expresiones regulares para limpiar y extraer palabras. 💬 Función principal def count_words(filename): with open(filename, 'r', encoding='utf-8') as file: words = [] for line in file: line_words = re.findall(r'\b\w+\b', line.lower()) words.extend(line_words) word_count = Counter(words) for word, count in word_count.most_common(): print(f"{word}: {count}") Lee el archivo línea por línea. Convierte todo a minúsculas. Usa una expresión regular para encontrar solo palabras. Usa Counter para contar cuántas veces aparece cada palabra. Muestra los resultados ordenados por frecuencia. 🚀 Bloque principal if __name__ == "__main__": filename = 'lewis.txt' if os.path.exists(filename): count_words(filename) else: print(f"File '{filename}' does not exist.") 🌟 ¿Por qué es útil para principiantes? Te obliga a pensar en flujos de entrada/salida. Introduce el manejo de errores de forma simple (os.path.exists). Trabaja con archivos de texto, una tarea común en cualquier ámbito. Te enseña a usar herramientas potentes como Counter y re. 🧠 Conclusión Este tipo de script es ideal para quienes empiezan con Python porque combina varios conceptos esenciales en menos de 30 líneas de código. Además, ¡puedes adaptarlo fácilmente para otros fines como análisis de logs, procesamiento de datos o creación de herramientas de línea de comandos! ¿Y tú, qué vas a automatizar hoy? 💡]]></summary></entry><entry><title type="html">Problemas con disco SSD en puerto USB3 de mi Raspberry pi 4B</title><link href="https://lorcopotia.github.io/2024/12/26/Problemas-con-Raspberry-pi-usb-ssd.html" rel="alternate" type="text/html" title="Problemas con disco SSD en puerto USB3 de mi Raspberry pi 4B" /><published>2024-12-26T00:00:00+00:00</published><updated>2024-12-26T00:00:00+00:00</updated><id>https://lorcopotia.github.io/2024/12/26/Problemas-con-Raspberry-pi-usb-ssd</id><content type="html" xml:base="https://lorcopotia.github.io/2024/12/26/Problemas-con-Raspberry-pi-usb-ssd.html"><![CDATA[<p>Recientemente por navidad me regale un <a href="https://amzn.eu/d/8JSV4IM">SSD de 1TB</a> para almacenar mis datos, videos y demás ya que estaba en oferta.</p>

<p>Tengo un <a href="https://amzn.eu/d/0vlmhFf">raspberry pi 4B</a> que utilizo para mis proyectos personales. En el tengo desplegados los siguientes servicios:</p>

<ul>
  <li>Pihole</li>
  <li>Samba</li>
  <li>Jellyfin</li>
  <li>Plex</li>
  <li>Jackett</li>
  <li>Sonarr</li>
  <li>Radarr</li>
  <li>Transmission-openvpn</li>
  <li>Overseerr</li>
  <li>Twingate</li>
  <li>Homepage</li>
  <li>Portainer</li>
</ul>

<p>Luego de conectar el SSD utilizando una <a href="https://amzn.eu/d/jbXfyQ3">carcasa</a> que compré también en oferta, después de 12h aprox la raspberry pi dejo de reconocer el dispositivo mostrandome los siguientes mensajes en <code class="language-plaintext highlighter-rouge">dmesg</code>:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">[</span>  105.485849] xhci_hcd 0000:01:00.0: WARNING: Host System Error
<span class="o">[</span>  110.559295] xhci_hcd 0000:01:00.0: xHCI host not responding to stop endpoint <span class="nb">command</span>
<span class="o">[</span>  110.559312] xhci_hcd 0000:01:00.0: xHCI host controller not responding, assume dead
<span class="o">[</span>  110.559357] xhci_hcd 0000:01:00.0: HC died<span class="p">;</span> cleaning up
<span class="o">[</span>  110.559437] sd 0:0:0:0: <span class="o">[</span>sda] tag#10 uas_eh_abort_handler 0 uas-tag 1 inflight: CMD
<span class="o">[</span>  110.559445] sd 0:0:0:0: <span class="o">[</span>sda] tag#10 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 05 80 08 48 00 00 10 00
<span class="o">[</span>  110.559451] sd 0:0:0:0: <span class="o">[</span>sda] tag#9 uas_eh_abort_handler 0 uas-tag 22 inflight: CMD
<span class="o">[</span>  110.559455] sd 0:0:0:0: <span class="o">[</span>sda] tag#9 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 05 80 08 20 00 00 10 00
<span class="o">[</span>  110.559460] sd 0:0:0:0: <span class="o">[</span>sda] tag#8 uas_eh_abort_handler 0 uas-tag 21 inflight: CMD
<span class="o">[</span>  110.559464] sd 0:0:0:0: <span class="o">[</span>sda] tag#8 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 05 80 08 00 00 00 08 00
<span class="o">[</span>  110.559469] sd 0:0:0:0: <span class="o">[</span>sda] tag#7 uas_eh_abort_handler 0 uas-tag 4 inflight: CMD
<span class="o">[</span>  110.559473] sd 0:0:0:0: <span class="o">[</span>sda] tag#7 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 05 40 08 58 00 00 10 00
<span class="o">[</span>  110.559478] sd 0:0:0:0: <span class="o">[</span>sda] tag#6 uas_eh_abort_handler 0 uas-tag 20 inflight: CMD
<span class="o">[</span>  110.559482] sd 0:0:0:0: <span class="o">[</span>sda] tag#6 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 05 40 08 30 00 00 18 00
<span class="o">[</span>  110.559487] sd 0:0:0:0: <span class="o">[</span>sda] tag#5 uas_eh_abort_handler 0 uas-tag 19 inflight: CMD
<span class="o">[</span>  110.559490] sd 0:0:0:0: <span class="o">[</span>sda] tag#5 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 05 40 08 10 00 00 10 00
<span class="o">[</span>  110.559495] sd 0:0:0:0: <span class="o">[</span>sda] tag#4 uas_eh_abort_handler 0 uas-tag 18 inflight: CMD
<span class="o">[</span>  110.559499] sd 0:0:0:0: <span class="o">[</span>sda] tag#4 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 05 40 08 00 00 00 08 00
<span class="o">[</span>  110.559504] sd 0:0:0:0: <span class="o">[</span>sda] tag#3 uas_eh_abort_handler 0 uas-tag 17 inflight: CMD
<span class="o">[</span>  110.559507] sd 0:0:0:0: <span class="o">[</span>sda] tag#3 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 05 00 08 60 00 00 10 00
<span class="o">[</span>  110.559512] sd 0:0:0:0: <span class="o">[</span>sda] tag#2 uas_eh_abort_handler 0 uas-tag 16 inflight: CMD
<span class="o">[</span>  110.559516] sd 0:0:0:0: <span class="o">[</span>sda] tag#2 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 05 00 08 38 00 00 08 00
<span class="o">[</span>  110.559521] sd 0:0:0:0: <span class="o">[</span>sda] tag#1 uas_eh_abort_handler 0 uas-tag 15 inflight: CMD
<span class="o">[</span>  110.559524] sd 0:0:0:0: <span class="o">[</span>sda] tag#1 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 05 00 08 00 00 00 08 00
<span class="o">[</span>  110.559529] sd 0:0:0:0: <span class="o">[</span>sda] tag#0 uas_eh_abort_handler 0 uas-tag 14 inflight: CMD
<span class="o">[</span>  110.559532] sd 0:0:0:0: <span class="o">[</span>sda] tag#0 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 04 c0 08 68 00 00 10 00
<span class="o">[</span>  110.559538] sd 0:0:0:0: <span class="o">[</span>sda] tag#25 uas_eh_abort_handler 0 uas-tag 3 inflight: CMD
<span class="o">[</span>  110.559541] sd 0:0:0:0: <span class="o">[</span>sda] tag#25 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 74 70 6d 00 00 00 08 00
<span class="o">[</span>  110.559559] usb 1-1: USB disconnect, device number 2
<span class="o">[</span>  110.560054] usb 2-2: USB disconnect, device number 2
<span class="o">[</span>  110.560166] sd 0:0:0:0: <span class="o">[</span>sda] tag#15 uas_zap_pending 0 uas-tag 5 inflight: CMD
<span class="o">[</span>  110.560173] sd 0:0:0:0: <span class="o">[</span>sda] tag#15 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 00 01 2c b0 00 00 08 00
<span class="o">[</span>  110.560210] sd 0:0:0:0: <span class="o">[</span>sda] tag#15 UNKNOWN<span class="o">(</span>0x2003<span class="o">)</span> Result: <span class="nv">hostbyte</span><span class="o">=</span>0x01 <span class="nv">driverbyte</span><span class="o">=</span>DRIVER_OK <span class="nv">cmd_age</span><span class="o">=</span>9s
<span class="o">[</span>  110.560225] sd 0:0:0:0: <span class="o">[</span>sda] tag#15 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 00 01 2c b0 00 00 08 00
<span class="o">[</span>  110.560232] I/O error, dev sda, sector 76976 op 0x0:<span class="o">(</span>READ<span class="o">)</span> flags 0x3000 phys_seg 1 prio class 2
<span class="o">[</span>  110.560274] EXT4-fs error <span class="o">(</span>device sda1<span class="o">)</span>: __ext4_find_entry:1683: inode <span class="c">#2: comm dockerd: reading directory lblock 0</span>
<span class="o">[</span>  110.560409] device offline error, dev sda, sector 76976 op 0x0:<span class="o">(</span>READ<span class="o">)</span> flags 0x3000 phys_seg 1 prio class 2
<span class="o">[</span>  110.560970] EXT4-fs error <span class="o">(</span>device sda1<span class="o">)</span>: __ext4_find_entry:1683: inode <span class="c">#2: comm dockerd: reading directory lblock 0</span>
<span class="o">[</span>  110.561203] device offline error, dev sda, sector 76976 op 0x0:<span class="o">(</span>READ<span class="o">)</span> flags 0x3000 phys_seg 1 prio class 2
<span class="o">[</span>  110.563398] device offline error, dev sda, sector 973342720 op 0x1:<span class="o">(</span>WRITE<span class="o">)</span> flags 0x9800 phys_seg 1 prio class 2
<span class="o">[</span>  110.563450] Buffer I/O error on dev sda1, logical block 121667584, lost <span class="nb">sync </span>page write
<span class="o">[</span>  110.563676] EXT4-fs error <span class="o">(</span>device sda1<span class="o">)</span>: __ext4_find_entry:1683: inode <span class="c">#2: comm runc:[2:INIT]: reading directory lblock 0</span>
<span class="o">[</span>  110.564815] device offline error, dev sda, sector 76976 op 0x0:<span class="o">(</span>READ<span class="o">)</span> flags 0x3000 phys_seg 1 prio class 2
<span class="o">[</span>  110.564905] EXT4-fs error <span class="o">(</span>device sda1<span class="o">)</span>: __ext4_find_entry:1683: inode <span class="c">#2: comm dockerd: reading directory lblock 0</span>
<span class="o">[</span>  110.565379] device offline error, dev sda, sector 76976 op 0x0:<span class="o">(</span>READ<span class="o">)</span> flags 0x3000 phys_seg 1 prio class 2
<span class="o">[</span>  110.565555] EXT4-fs error <span class="o">(</span>device sda1<span class="o">)</span>: __ext4_find_entry:1683: inode <span class="c">#2: comm dockerd: reading directory lblock 0</span>
<span class="o">[</span>  110.565990] device offline error, dev sda, sector 76976 op 0x0:<span class="o">(</span>READ<span class="o">)</span> flags 0x3000 phys_seg 1 prio class 2
<span class="o">[</span>  110.566173] EXT4-fs error <span class="o">(</span>device sda1<span class="o">)</span>: __ext4_find_entry:1683: inode <span class="c">#2: comm dockerd: reading directory lblock 0</span>
<span class="o">[</span>  110.566241] JBD2: I/O error when updating journal superblock <span class="k">for </span>sda1-8.
<span class="o">[</span>  110.566251] Aborting journal on device sda1-8.
<span class="o">[</span>  110.566303] device offline error, dev sda, sector 76976 op 0x0:<span class="o">(</span>READ<span class="o">)</span> flags 0x3000 phys_seg 1 prio class 2
<span class="o">[</span>  110.566323] device offline error, dev sda, sector 973342720 op 0x1:<span class="o">(</span>WRITE<span class="o">)</span> flags 0x9800 phys_seg 1 prio class 2
<span class="o">[</span>  110.566330] device offline error, dev sda, sector 973342720 op 0x1:<span class="o">(</span>WRITE<span class="o">)</span> flags 0x9800 phys_seg 1 prio class 2
<span class="o">[</span>  110.566335] Buffer I/O error on dev sda1, logical block 121667584, lost <span class="nb">sync </span>page write
<span class="o">[</span>  110.566353] EXT4-fs error <span class="o">(</span>device sda1<span class="o">)</span>: __ext4_find_entry:1683: inode <span class="c">#2: comm dockerd: reading directory lblock 0</span>
<span class="o">[</span>  110.566386] JBD2: I/O error when updating journal superblock <span class="k">for </span>sda1-8.
<span class="o">[</span>  110.566447] EXT4-fs error <span class="o">(</span>device sda1<span class="o">)</span>: __ext4_find_entry:1683: inode <span class="c">#2: comm dockerd: reading directory lblock 0</span>
<span class="o">[</span>  110.566597] Buffer I/O error on dev sda1, logical block 0, lost <span class="nb">sync </span>page write
<span class="o">[</span>  110.566609] EXT4-fs error <span class="o">(</span>device sda1<span class="o">)</span>: __ext4_find_entry:1683: inode <span class="c">#2: comm dockerd: reading directory lblock 0</span>
<span class="o">[</span>  110.566629] EXT4-fs <span class="o">(</span>sda1<span class="o">)</span>: shut down requested <span class="o">(</span>2<span class="o">)</span>
<span class="o">[</span>  110.566684] EXT4-fs <span class="o">(</span>sda1<span class="o">)</span>: I/O error <span class="k">while </span>writing superblock
<span class="o">[</span>  110.566726] Buffer I/O error on dev sda1, logical block 0, lost <span class="nb">sync </span>page write
<span class="o">[</span>  110.566743] EXT4-fs <span class="o">(</span>sda1<span class="o">)</span>: I/O error <span class="k">while </span>writing superblock
<span class="o">[</span>  110.579622] sd 0:0:0:0: Device offlined - not ready after error recovery
<span class="o">[</span>  110.579646] sd 0:0:0:0: Device offlined - not ready after error recovery
<span class="o">[</span>  110.579650] sd 0:0:0:0: Device offlined - not ready after error recovery
<span class="o">[</span>  110.579653] sd 0:0:0:0: Device offlined - not ready after error recovery
<span class="o">[</span>  110.579656] sd 0:0:0:0: Device offlined - not ready after error recovery
<span class="o">[</span>  110.579659] sd 0:0:0:0: Device offlined - not ready after error recovery
<span class="o">[</span>  110.579662] sd 0:0:0:0: Device offlined - not ready after error recovery
<span class="o">[</span>  110.579665] sd 0:0:0:0: Device offlined - not ready after error recovery
<span class="o">[</span>  110.579668] sd 0:0:0:0: Device offlined - not ready after error recovery
<span class="o">[</span>  110.579671] sd 0:0:0:0: Device offlined - not ready after error recovery
<span class="o">[</span>  110.579674] sd 0:0:0:0: Device offlined - not ready after error recovery
<span class="o">[</span>  110.579678] sd 0:0:0:0: Device offlined - not ready after error recovery
<span class="o">[</span>  110.579681] sd 0:0:0:0: Device offlined - not ready after error recovery
<span class="o">[</span>  110.579684] sd 0:0:0:0: Device offlined - not ready after error recovery
<span class="o">[</span>  110.579687] sd 0:0:0:0: Device offlined - not ready after error recovery
<span class="o">[</span>  110.579690] sd 0:0:0:0: Device offlined - not ready after error recovery
<span class="o">[</span>  110.579693] sd 0:0:0:0: Device offlined - not ready after error recovery
<span class="o">[</span>  110.579696] sd 0:0:0:0: Device offlined - not ready after error recovery
<span class="o">[</span>  110.579700] sd 0:0:0:0: Device offlined - not ready after error recovery
<span class="o">[</span>  110.579703] sd 0:0:0:0: Device offlined - not ready after error recovery
<span class="o">[</span>  110.579738] sd 0:0:0:0: <span class="o">[</span>sda] tag#25 UNKNOWN<span class="o">(</span>0x2003<span class="o">)</span> Result: <span class="nv">hostbyte</span><span class="o">=</span>0x07 <span class="nv">driverbyte</span><span class="o">=</span>DRIVER_OK <span class="nv">cmd_age</span><span class="o">=</span>32s
<span class="o">[</span>  110.579748] sd 0:0:0:0: <span class="o">[</span>sda] tag#25 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 74 70 6d 00 00 00 08 00
<span class="o">[</span>  110.579793] sd 0:0:0:0: <span class="o">[</span>sda] tag#0 UNKNOWN<span class="o">(</span>0x2003<span class="o">)</span> Result: <span class="nv">hostbyte</span><span class="o">=</span>0x07 <span class="nv">driverbyte</span><span class="o">=</span>DRIVER_OK <span class="nv">cmd_age</span><span class="o">=</span>36s
<span class="o">[</span>  110.579798] sd 0:0:0:0: <span class="o">[</span>sda] tag#0 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 04 c0 08 68 00 00 10 00
<span class="o">[</span>  110.579815] sd 0:0:0:0: <span class="o">[</span>sda] tag#1 UNKNOWN<span class="o">(</span>0x2003<span class="o">)</span> Result: <span class="nv">hostbyte</span><span class="o">=</span>0x07 <span class="nv">driverbyte</span><span class="o">=</span>DRIVER_OK <span class="nv">cmd_age</span><span class="o">=</span>36s
<span class="o">[</span>  110.579819] sd 0:0:0:0: <span class="o">[</span>sda] tag#1 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 05 00 08 00 00 00 08 00
<span class="o">[</span>  110.579844] sd 0:0:0:0: <span class="o">[</span>sda] tag#2 UNKNOWN<span class="o">(</span>0x2003<span class="o">)</span> Result: <span class="nv">hostbyte</span><span class="o">=</span>0x07 <span class="nv">driverbyte</span><span class="o">=</span>DRIVER_OK <span class="nv">cmd_age</span><span class="o">=</span>36s
<span class="o">[</span>  110.579850] sd 0:0:0:0: <span class="o">[</span>sda] tag#2 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 05 00 08 38 00 00 08 00
<span class="o">[</span>  110.579862] sd 0:0:0:0: <span class="o">[</span>sda] tag#3 UNKNOWN<span class="o">(</span>0x2003<span class="o">)</span> Result: <span class="nv">hostbyte</span><span class="o">=</span>0x07 <span class="nv">driverbyte</span><span class="o">=</span>DRIVER_OK <span class="nv">cmd_age</span><span class="o">=</span>36s
<span class="o">[</span>  110.579859] Buffer I/O error on dev sda1, logical block 244190368, async page <span class="nb">read</span>
<span class="o">[</span>  110.579866] sd 0:0:0:0: <span class="o">[</span>sda] tag#3 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 05 00 08 60 00 00 10 00
<span class="o">[</span>  110.579878] sd 0:0:0:0: <span class="o">[</span>sda] tag#4 UNKNOWN<span class="o">(</span>0x2003<span class="o">)</span> Result: <span class="nv">hostbyte</span><span class="o">=</span>0x07 <span class="nv">driverbyte</span><span class="o">=</span>DRIVER_OK <span class="nv">cmd_age</span><span class="o">=</span>36s
<span class="o">[</span>  110.579883] sd 0:0:0:0: <span class="o">[</span>sda] tag#4 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 05 40 08 00 00 00 08 00
<span class="o">[</span>  110.579893] sd 0:0:0:0: <span class="o">[</span>sda] tag#5 UNKNOWN<span class="o">(</span>0x2003<span class="o">)</span> Result: <span class="nv">hostbyte</span><span class="o">=</span>0x07 <span class="nv">driverbyte</span><span class="o">=</span>DRIVER_OK <span class="nv">cmd_age</span><span class="o">=</span>36s
<span class="o">[</span>  110.579898] sd 0:0:0:0: <span class="o">[</span>sda] tag#5 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 05 40 08 10 00 00 10 00
<span class="o">[</span>  110.579911] sd 0:0:0:0: <span class="o">[</span>sda] tag#6 UNKNOWN<span class="o">(</span>0x2003<span class="o">)</span> Result: <span class="nv">hostbyte</span><span class="o">=</span>0x07 <span class="nv">driverbyte</span><span class="o">=</span>DRIVER_OK <span class="nv">cmd_age</span><span class="o">=</span>36s
<span class="o">[</span>  110.579915] sd 0:0:0:0: <span class="o">[</span>sda] tag#6 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 05 40 08 30 00 00 18 00
<span class="o">[</span>  110.579933] sd 0:0:0:0: <span class="o">[</span>sda] tag#7 UNKNOWN<span class="o">(</span>0x2003<span class="o">)</span> Result: <span class="nv">hostbyte</span><span class="o">=</span>0x07 <span class="nv">driverbyte</span><span class="o">=</span>DRIVER_OK <span class="nv">cmd_age</span><span class="o">=</span>36s
<span class="o">[</span>  110.579937] sd 0:0:0:0: <span class="o">[</span>sda] tag#7 CDB: <span class="nv">opcode</span><span class="o">=</span>0x28 28 00 05 40 08 58 00 00 10 00
<span class="o">[</span>  110.627656] sd 0:0:0:0: <span class="o">[</span>sda] Synchronizing SCSI cache
<span class="o">[</span>  110.649895] sd 0:0:0:0: <span class="o">[</span>sda] Synchronize Cache<span class="o">(</span>10<span class="o">)</span> failed: Result: <span class="nv">hostbyte</span><span class="o">=</span>0x07 <span class="nv">driverbyte</span><span class="o">=</span>DRIVER_OK
<span class="o">[</span>  110.651240] scsi 0:0:0:0: rejecting I/O to dead device
<span class="o">[</span>  110.651589] xhci_hcd 0000:01:00.0: WARN Can<span class="s1">'t disable streams for endpoint 0x82, streams are being disabled already
[  110.894702] EXT4-fs (sda1): unmounting filesystem 3f7d608d-0d52-4e00-a58b-12126dd6adc2.
</span></code></pre></div></div>

<p>Buscando en foros encontré el siguiente <a href="https://bbs.archlinux.org/viewtopic.php?id=245295">artículo</a> que me proporcionó la solución:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Añadir la siguiente línea al final del fichero /boot/firmware/config.txt</span>
<span class="nv">max_usb_current</span><span class="o">=</span>1
</code></pre></div></div>

<p>Y después, reiniciar.</p>

<p>Espero que os sirva tanto como a mí. Feliz y próspero año nuevo a todos!!!</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Recientemente por navidad me regale un SSD de 1TB para almacenar mis datos, videos y demás ya que estaba en oferta. Tengo un raspberry pi 4B que utilizo para mis proyectos personales. En el tengo desplegados los siguientes servicios: Pihole Samba Jellyfin Plex Jackett Sonarr Radarr Transmission-openvpn Overseerr Twingate Homepage Portainer Luego de conectar el SSD utilizando una carcasa que compré también en oferta, después de 12h aprox la raspberry pi dejo de reconocer el dispositivo mostrandome los siguientes mensajes en dmesg: [ 105.485849] xhci_hcd 0000:01:00.0: WARNING: Host System Error [ 110.559295] xhci_hcd 0000:01:00.0: xHCI host not responding to stop endpoint command [ 110.559312] xhci_hcd 0000:01:00.0: xHCI host controller not responding, assume dead [ 110.559357] xhci_hcd 0000:01:00.0: HC died; cleaning up [ 110.559437] sd 0:0:0:0: [sda] tag#10 uas_eh_abort_handler 0 uas-tag 1 inflight: CMD [ 110.559445] sd 0:0:0:0: [sda] tag#10 CDB: opcode=0x28 28 00 05 80 08 48 00 00 10 00 [ 110.559451] sd 0:0:0:0: [sda] tag#9 uas_eh_abort_handler 0 uas-tag 22 inflight: CMD [ 110.559455] sd 0:0:0:0: [sda] tag#9 CDB: opcode=0x28 28 00 05 80 08 20 00 00 10 00 [ 110.559460] sd 0:0:0:0: [sda] tag#8 uas_eh_abort_handler 0 uas-tag 21 inflight: CMD [ 110.559464] sd 0:0:0:0: [sda] tag#8 CDB: opcode=0x28 28 00 05 80 08 00 00 00 08 00 [ 110.559469] sd 0:0:0:0: [sda] tag#7 uas_eh_abort_handler 0 uas-tag 4 inflight: CMD [ 110.559473] sd 0:0:0:0: [sda] tag#7 CDB: opcode=0x28 28 00 05 40 08 58 00 00 10 00 [ 110.559478] sd 0:0:0:0: [sda] tag#6 uas_eh_abort_handler 0 uas-tag 20 inflight: CMD [ 110.559482] sd 0:0:0:0: [sda] tag#6 CDB: opcode=0x28 28 00 05 40 08 30 00 00 18 00 [ 110.559487] sd 0:0:0:0: [sda] tag#5 uas_eh_abort_handler 0 uas-tag 19 inflight: CMD [ 110.559490] sd 0:0:0:0: [sda] tag#5 CDB: opcode=0x28 28 00 05 40 08 10 00 00 10 00 [ 110.559495] sd 0:0:0:0: [sda] tag#4 uas_eh_abort_handler 0 uas-tag 18 inflight: CMD [ 110.559499] sd 0:0:0:0: [sda] tag#4 CDB: opcode=0x28 28 00 05 40 08 00 00 00 08 00 [ 110.559504] sd 0:0:0:0: [sda] tag#3 uas_eh_abort_handler 0 uas-tag 17 inflight: CMD [ 110.559507] sd 0:0:0:0: [sda] tag#3 CDB: opcode=0x28 28 00 05 00 08 60 00 00 10 00 [ 110.559512] sd 0:0:0:0: [sda] tag#2 uas_eh_abort_handler 0 uas-tag 16 inflight: CMD [ 110.559516] sd 0:0:0:0: [sda] tag#2 CDB: opcode=0x28 28 00 05 00 08 38 00 00 08 00 [ 110.559521] sd 0:0:0:0: [sda] tag#1 uas_eh_abort_handler 0 uas-tag 15 inflight: CMD [ 110.559524] sd 0:0:0:0: [sda] tag#1 CDB: opcode=0x28 28 00 05 00 08 00 00 00 08 00 [ 110.559529] sd 0:0:0:0: [sda] tag#0 uas_eh_abort_handler 0 uas-tag 14 inflight: CMD [ 110.559532] sd 0:0:0:0: [sda] tag#0 CDB: opcode=0x28 28 00 04 c0 08 68 00 00 10 00 [ 110.559538] sd 0:0:0:0: [sda] tag#25 uas_eh_abort_handler 0 uas-tag 3 inflight: CMD [ 110.559541] sd 0:0:0:0: [sda] tag#25 CDB: opcode=0x28 28 00 74 70 6d 00 00 00 08 00 [ 110.559559] usb 1-1: USB disconnect, device number 2 [ 110.560054] usb 2-2: USB disconnect, device number 2 [ 110.560166] sd 0:0:0:0: [sda] tag#15 uas_zap_pending 0 uas-tag 5 inflight: CMD [ 110.560173] sd 0:0:0:0: [sda] tag#15 CDB: opcode=0x28 28 00 00 01 2c b0 00 00 08 00 [ 110.560210] sd 0:0:0:0: [sda] tag#15 UNKNOWN(0x2003) Result: hostbyte=0x01 driverbyte=DRIVER_OK cmd_age=9s [ 110.560225] sd 0:0:0:0: [sda] tag#15 CDB: opcode=0x28 28 00 00 01 2c b0 00 00 08 00 [ 110.560232] I/O error, dev sda, sector 76976 op 0x0:(READ) flags 0x3000 phys_seg 1 prio class 2 [ 110.560274] EXT4-fs error (device sda1): __ext4_find_entry:1683: inode #2: comm dockerd: reading directory lblock 0 [ 110.560409] device offline error, dev sda, sector 76976 op 0x0:(READ) flags 0x3000 phys_seg 1 prio class 2 [ 110.560970] EXT4-fs error (device sda1): __ext4_find_entry:1683: inode #2: comm dockerd: reading directory lblock 0 [ 110.561203] device offline error, dev sda, sector 76976 op 0x0:(READ) flags 0x3000 phys_seg 1 prio class 2 [ 110.563398] device offline error, dev sda, sector 973342720 op 0x1:(WRITE) flags 0x9800 phys_seg 1 prio class 2 [ 110.563450] Buffer I/O error on dev sda1, logical block 121667584, lost sync page write [ 110.563676] EXT4-fs error (device sda1): __ext4_find_entry:1683: inode #2: comm runc:[2:INIT]: reading directory lblock 0 [ 110.564815] device offline error, dev sda, sector 76976 op 0x0:(READ) flags 0x3000 phys_seg 1 prio class 2 [ 110.564905] EXT4-fs error (device sda1): __ext4_find_entry:1683: inode #2: comm dockerd: reading directory lblock 0 [ 110.565379] device offline error, dev sda, sector 76976 op 0x0:(READ) flags 0x3000 phys_seg 1 prio class 2 [ 110.565555] EXT4-fs error (device sda1): __ext4_find_entry:1683: inode #2: comm dockerd: reading directory lblock 0 [ 110.565990] device offline error, dev sda, sector 76976 op 0x0:(READ) flags 0x3000 phys_seg 1 prio class 2 [ 110.566173] EXT4-fs error (device sda1): __ext4_find_entry:1683: inode #2: comm dockerd: reading directory lblock 0 [ 110.566241] JBD2: I/O error when updating journal superblock for sda1-8. [ 110.566251] Aborting journal on device sda1-8. [ 110.566303] device offline error, dev sda, sector 76976 op 0x0:(READ) flags 0x3000 phys_seg 1 prio class 2 [ 110.566323] device offline error, dev sda, sector 973342720 op 0x1:(WRITE) flags 0x9800 phys_seg 1 prio class 2 [ 110.566330] device offline error, dev sda, sector 973342720 op 0x1:(WRITE) flags 0x9800 phys_seg 1 prio class 2 [ 110.566335] Buffer I/O error on dev sda1, logical block 121667584, lost sync page write [ 110.566353] EXT4-fs error (device sda1): __ext4_find_entry:1683: inode #2: comm dockerd: reading directory lblock 0 [ 110.566386] JBD2: I/O error when updating journal superblock for sda1-8. [ 110.566447] EXT4-fs error (device sda1): __ext4_find_entry:1683: inode #2: comm dockerd: reading directory lblock 0 [ 110.566597] Buffer I/O error on dev sda1, logical block 0, lost sync page write [ 110.566609] EXT4-fs error (device sda1): __ext4_find_entry:1683: inode #2: comm dockerd: reading directory lblock 0 [ 110.566629] EXT4-fs (sda1): shut down requested (2) [ 110.566684] EXT4-fs (sda1): I/O error while writing superblock [ 110.566726] Buffer I/O error on dev sda1, logical block 0, lost sync page write [ 110.566743] EXT4-fs (sda1): I/O error while writing superblock [ 110.579622] sd 0:0:0:0: Device offlined - not ready after error recovery [ 110.579646] sd 0:0:0:0: Device offlined - not ready after error recovery [ 110.579650] sd 0:0:0:0: Device offlined - not ready after error recovery [ 110.579653] sd 0:0:0:0: Device offlined - not ready after error recovery [ 110.579656] sd 0:0:0:0: Device offlined - not ready after error recovery [ 110.579659] sd 0:0:0:0: Device offlined - not ready after error recovery [ 110.579662] sd 0:0:0:0: Device offlined - not ready after error recovery [ 110.579665] sd 0:0:0:0: Device offlined - not ready after error recovery [ 110.579668] sd 0:0:0:0: Device offlined - not ready after error recovery [ 110.579671] sd 0:0:0:0: Device offlined - not ready after error recovery [ 110.579674] sd 0:0:0:0: Device offlined - not ready after error recovery [ 110.579678] sd 0:0:0:0: Device offlined - not ready after error recovery [ 110.579681] sd 0:0:0:0: Device offlined - not ready after error recovery [ 110.579684] sd 0:0:0:0: Device offlined - not ready after error recovery [ 110.579687] sd 0:0:0:0: Device offlined - not ready after error recovery [ 110.579690] sd 0:0:0:0: Device offlined - not ready after error recovery [ 110.579693] sd 0:0:0:0: Device offlined - not ready after error recovery [ 110.579696] sd 0:0:0:0: Device offlined - not ready after error recovery [ 110.579700] sd 0:0:0:0: Device offlined - not ready after error recovery [ 110.579703] sd 0:0:0:0: Device offlined - not ready after error recovery [ 110.579738] sd 0:0:0:0: [sda] tag#25 UNKNOWN(0x2003) Result: hostbyte=0x07 driverbyte=DRIVER_OK cmd_age=32s [ 110.579748] sd 0:0:0:0: [sda] tag#25 CDB: opcode=0x28 28 00 74 70 6d 00 00 00 08 00 [ 110.579793] sd 0:0:0:0: [sda] tag#0 UNKNOWN(0x2003) Result: hostbyte=0x07 driverbyte=DRIVER_OK cmd_age=36s [ 110.579798] sd 0:0:0:0: [sda] tag#0 CDB: opcode=0x28 28 00 04 c0 08 68 00 00 10 00 [ 110.579815] sd 0:0:0:0: [sda] tag#1 UNKNOWN(0x2003) Result: hostbyte=0x07 driverbyte=DRIVER_OK cmd_age=36s [ 110.579819] sd 0:0:0:0: [sda] tag#1 CDB: opcode=0x28 28 00 05 00 08 00 00 00 08 00 [ 110.579844] sd 0:0:0:0: [sda] tag#2 UNKNOWN(0x2003) Result: hostbyte=0x07 driverbyte=DRIVER_OK cmd_age=36s [ 110.579850] sd 0:0:0:0: [sda] tag#2 CDB: opcode=0x28 28 00 05 00 08 38 00 00 08 00 [ 110.579862] sd 0:0:0:0: [sda] tag#3 UNKNOWN(0x2003) Result: hostbyte=0x07 driverbyte=DRIVER_OK cmd_age=36s [ 110.579859] Buffer I/O error on dev sda1, logical block 244190368, async page read [ 110.579866] sd 0:0:0:0: [sda] tag#3 CDB: opcode=0x28 28 00 05 00 08 60 00 00 10 00 [ 110.579878] sd 0:0:0:0: [sda] tag#4 UNKNOWN(0x2003) Result: hostbyte=0x07 driverbyte=DRIVER_OK cmd_age=36s [ 110.579883] sd 0:0:0:0: [sda] tag#4 CDB: opcode=0x28 28 00 05 40 08 00 00 00 08 00 [ 110.579893] sd 0:0:0:0: [sda] tag#5 UNKNOWN(0x2003) Result: hostbyte=0x07 driverbyte=DRIVER_OK cmd_age=36s [ 110.579898] sd 0:0:0:0: [sda] tag#5 CDB: opcode=0x28 28 00 05 40 08 10 00 00 10 00 [ 110.579911] sd 0:0:0:0: [sda] tag#6 UNKNOWN(0x2003) Result: hostbyte=0x07 driverbyte=DRIVER_OK cmd_age=36s [ 110.579915] sd 0:0:0:0: [sda] tag#6 CDB: opcode=0x28 28 00 05 40 08 30 00 00 18 00 [ 110.579933] sd 0:0:0:0: [sda] tag#7 UNKNOWN(0x2003) Result: hostbyte=0x07 driverbyte=DRIVER_OK cmd_age=36s [ 110.579937] sd 0:0:0:0: [sda] tag#7 CDB: opcode=0x28 28 00 05 40 08 58 00 00 10 00 [ 110.627656] sd 0:0:0:0: [sda] Synchronizing SCSI cache [ 110.649895] sd 0:0:0:0: [sda] Synchronize Cache(10) failed: Result: hostbyte=0x07 driverbyte=DRIVER_OK [ 110.651240] scsi 0:0:0:0: rejecting I/O to dead device [ 110.651589] xhci_hcd 0000:01:00.0: WARN Can't disable streams for endpoint 0x82, streams are being disabled already [ 110.894702] EXT4-fs (sda1): unmounting filesystem 3f7d608d-0d52-4e00-a58b-12126dd6adc2. Buscando en foros encontré el siguiente artículo que me proporcionó la solución: # Añadir la siguiente línea al final del fichero /boot/firmware/config.txt max_usb_current=1 Y después, reiniciar. Espero que os sirva tanto como a mí. Feliz y próspero año nuevo a todos!!!]]></summary></entry><entry><title type="html">Métodos de Gestión de Secretos en Ansible</title><link href="https://lorcopotia.github.io/2024/12/11/M%C3%A9todos-de-gesti%C3%B3n-de-secretos-en-Ansible.html" rel="alternate" type="text/html" title="Métodos de Gestión de Secretos en Ansible" /><published>2024-12-11T00:00:00+00:00</published><updated>2024-12-11T00:00:00+00:00</updated><id>https://lorcopotia.github.io/2024/12/11/M%C3%A9todos-de-gesti%C3%B3n-de-secretos-en-Ansible</id><content type="html" xml:base="https://lorcopotia.github.io/2024/12/11/M%C3%A9todos-de-gesti%C3%B3n-de-secretos-en-Ansible.html"><![CDATA[<h1 id="métodos-de-gestión-de-secretos-en-ansible">Métodos de Gestión de Secretos en Ansible</h1>

<p>Las fuentes describen principalmente un método para la gestión de secretos en Ansible: Ansible Vault.
Ansible Vault funciona como una caja fuerte digital, permitiendo almacenar información sensible de manera segura. Este método implica los siguientes pasos:</p>

<ol>
  <li>
    <p>Cifrado del archivo: Se utiliza el comando ansible-vault encrypt para cifrar un archivo YAML que contiene las variables secretas. Ansible solicita una contraseña para cifrar el archivo.</p>
  </li>
  <li>
    <p>Almacenamiento de la clave: La contraseña utilizada para cifrar el archivo (la “clave” de la caja fuerte) se almacena de forma segura, separada del playbook.</p>
  </li>
  <li>
    <p>Descifrado durante la ejecución: Al ejecutar un playbook que utiliza variables cifradas con Vault, se usa la clave para descifrar el archivo en memoria, permitiendo a Ansible acceder a los datos.</p>
  </li>
</ol>

<p>Existen diferentes maneras de proporcionar la contraseña para descifrar el archivo:</p>
<ul>
  <li>Solicitar contraseña en tiempo de ejecución: Se puede usar la opción –ask-vault-pass al ejecutar el playbook para que Ansible solicite la contraseña al usuario.</li>
  <li>Archivo de contraseñas: Se puede crear un archivo que contenga la contraseña y usar la opción –vault-password-file para indicarle a Ansible la ubicación del archivo. Este archivo debe tener permisos estrictos (600) para que solo el usuario pueda leerlo.</li>
  <li>Script ejecutable: Similar al archivo de contraseñas, se puede usar un script que genere la contraseña como salida y pasar la ruta del script a Ansible.</li>
</ul>

<h2 id="ventajas-de-ansible-vault">Ventajas de Ansible Vault:</h2>
<ul>
  <li>Seguridad: Ansible Vault utiliza cifrado AES-256, un algoritmo de cifrado robusto que hace que el descifrado sin la clave sea extremadamente difícil.</li>
  <li>Integración: Vault está integrado en Ansible, simplificando su uso y evitando la necesidad de herramientas externas.</li>
  <li>Flexibilidad: Vault puede cifrar diferentes tipos de archivos YAML, incluyendo archivos de variables, variables de host y grupo, e incluso archivos de tareas.</li>
</ul>

<h2 id="alternativas-a-ansible-vault">Alternativas a Ansible Vault:</h2>

<p>Las fuentes también mencionan la posibilidad de usar servicios externos de gestión de secretos, como Vault de HashiCorp, Keywhiz de Square o servicios en la nube como AWS Key Management Service o Microsoft Azure Key Vault. Estos servicios ofrecen características más avanzadas que Ansible Vault, pero pueden ser más complejos de configurar.</p>

<h2 id="consideraciones-de-seguridad">Consideraciones de Seguridad:</h2>
<ul>
  <li>La seguridad de Ansible Vault depende en gran medida de la seguridad de la contraseña utilizada para cifrar el archivo. Se recomienda utilizar contraseñas fuertes y almacenarlas de forma segura.</li>
  <li>Si la clave se ve comprometida, la información cifrada con Vault se vuelve vulnerable. Es importante gestionar la rotación de claves y seguir buenas prácticas de seguridad.</li>
</ul>

<p>Aunque Ansible Vault es una herramienta útil para proteger información sensible en playbooks de Ansible, es importante comprender sus limitaciones y aplicar las medidas de seguridad adecuadas para proteger las claves de cifrado.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Métodos de Gestión de Secretos en Ansible Las fuentes describen principalmente un método para la gestión de secretos en Ansible: Ansible Vault. Ansible Vault funciona como una caja fuerte digital, permitiendo almacenar información sensible de manera segura. Este método implica los siguientes pasos: Cifrado del archivo: Se utiliza el comando ansible-vault encrypt para cifrar un archivo YAML que contiene las variables secretas. Ansible solicita una contraseña para cifrar el archivo. Almacenamiento de la clave: La contraseña utilizada para cifrar el archivo (la “clave” de la caja fuerte) se almacena de forma segura, separada del playbook. Descifrado durante la ejecución: Al ejecutar un playbook que utiliza variables cifradas con Vault, se usa la clave para descifrar el archivo en memoria, permitiendo a Ansible acceder a los datos. Existen diferentes maneras de proporcionar la contraseña para descifrar el archivo: Solicitar contraseña en tiempo de ejecución: Se puede usar la opción –ask-vault-pass al ejecutar el playbook para que Ansible solicite la contraseña al usuario. Archivo de contraseñas: Se puede crear un archivo que contenga la contraseña y usar la opción –vault-password-file para indicarle a Ansible la ubicación del archivo. Este archivo debe tener permisos estrictos (600) para que solo el usuario pueda leerlo. Script ejecutable: Similar al archivo de contraseñas, se puede usar un script que genere la contraseña como salida y pasar la ruta del script a Ansible. Ventajas de Ansible Vault: Seguridad: Ansible Vault utiliza cifrado AES-256, un algoritmo de cifrado robusto que hace que el descifrado sin la clave sea extremadamente difícil. Integración: Vault está integrado en Ansible, simplificando su uso y evitando la necesidad de herramientas externas. Flexibilidad: Vault puede cifrar diferentes tipos de archivos YAML, incluyendo archivos de variables, variables de host y grupo, e incluso archivos de tareas. Alternativas a Ansible Vault: Las fuentes también mencionan la posibilidad de usar servicios externos de gestión de secretos, como Vault de HashiCorp, Keywhiz de Square o servicios en la nube como AWS Key Management Service o Microsoft Azure Key Vault. Estos servicios ofrecen características más avanzadas que Ansible Vault, pero pueden ser más complejos de configurar. Consideraciones de Seguridad: La seguridad de Ansible Vault depende en gran medida de la seguridad de la contraseña utilizada para cifrar el archivo. Se recomienda utilizar contraseñas fuertes y almacenarlas de forma segura. Si la clave se ve comprometida, la información cifrada con Vault se vuelve vulnerable. Es importante gestionar la rotación de claves y seguir buenas prácticas de seguridad. Aunque Ansible Vault es una herramienta útil para proteger información sensible en playbooks de Ansible, es importante comprender sus limitaciones y aplicar las medidas de seguridad adecuadas para proteger las claves de cifrado.]]></summary></entry><entry><title type="html">Creando Usuarios Con Ansible</title><link href="https://lorcopotia.github.io/2024/11/27/Creando-usuarios-con-Ansible.html" rel="alternate" type="text/html" title="Creando Usuarios Con Ansible" /><published>2024-11-27T00:00:00+00:00</published><updated>2024-11-27T00:00:00+00:00</updated><id>https://lorcopotia.github.io/2024/11/27/Creando-usuarios-con-Ansible</id><content type="html" xml:base="https://lorcopotia.github.io/2024/11/27/Creando-usuarios-con-Ansible.html"><![CDATA[<h1 id="protegiendo-las-credenciales-con-ansible-vault">Protegiendo las credenciales con Ansible Vault</h1>

<p>¡Hola de nuevo, amantes de la automatización! ¿Listos para llevar nuestras habilidades con Ansible al siguiente nivel? En esta ocasión, vamos a aprender a crear usuarios en un servidor remoto de forma segura, utilizando Ansible Vault para proteger nuestras preciadas credenciales.</p>

<ol>
  <li>¡Elevando la seguridad! Guardando las credenciales en un archivo con Ansible Vault</li>
</ol>

<p>Para empezar, necesitamos un lugar seguro donde guardar los nombres de usuario y contraseñas que usaremos para crear las cuentas en el servidor remoto. Ansible Vault es la herramienta perfecta para este trabajo.
Ejecuta el siguiente comando en tu terminal para crear un archivo llamado credenciales_usuarios.yml:
ansible-vault create credenciales_usuarios.yml
Ansible te pedirá que introduzcas una contraseña súper secreta. ¡Guárdala bien, es la llave para acceder a nuestra fortaleza digital!
Dentro del archivo credenciales_usuarios.yml, define una lista de usuarios con sus respectivos nombres de usuario y contraseñas:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">usuarios</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">nombre</span><span class="pi">:</span> <span class="s">usuario1</span>
    <span class="na">usuario</span><span class="pi">:</span> <span class="s">usuario1</span>
    <span class="na">contrasena</span><span class="pi">:</span> <span class="s2">"</span><span class="s">contrasena_segura_1"</span>
  <span class="pi">-</span> <span class="na">nombre</span><span class="pi">:</span> <span class="s">usuario2</span>
    <span class="na">usuario</span><span class="pi">:</span> <span class="s">usuario2</span>
    <span class="na">contrasena</span><span class="pi">:</span> <span class="s2">"</span><span class="s">contrasena_segura_2"</span>
</code></pre></div></div>

<p>Guarda el archivo y Ansible lo encriptará con la contraseña que elegiste. ¡Tus credenciales están a salvo!</p>

<ol>
  <li>¡A la acción! Creando usuarios con un playbook de Ansible
Ahora, vamos a crear un playbook que use las credenciales almacenadas en nuestro archivo credenciales_usuarios.yml para crear las cuentas de usuario en el servidor remoto. Crea un archivo llamado crear_usuarios.yml con el siguiente contenido:</li>
</ol>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>- hosts: servidores_remotos
  become: yes

  vars_files:
    - credenciales_usuarios.yml

  tasks:
    - name: Crear usuarios
      ansible.builtin.user:
        name: ""
        password: ""
        state: present
      loop: ""
</code></pre></div></div>

<p>¡Desglosando el playbook!</p>
<ul>
  <li>hosts: Define el grupo de servidores donde se crearán los usuarios. Puedes usar el nombre del grupo que definiste en tu archivo de inventario.</li>
  <li>become: Le da a Ansible superpoderes para ejecutar tareas como administrador.</li>
  <li>vars_files: Aquí incluimos nuestro archivo encriptado con Ansible Vault.</li>
  <li>tasks: Define las tareas a ejecutar. En este caso, solo tenemos una tarea:
    <ul>
      <li>Crear usuarios: Usa el módulo user para crear las cuentas de usuario. La opción loop recorre la lista de usuarios definida en credenciales_usuarios.yml.</li>
    </ul>
  </li>
</ul>

<ol>
  <li>¡A ejecutar se ha dicho! Poniendo en marcha el playbook</li>
</ol>

<p>Recuerda que para ejecutar el playbook con la información encriptada, necesitas proporcionar la contraseña de Ansible Vault. Puedes hacerlo al ejecutar el playbook o usando un archivo de contraseña, como te mostramos en el paso 3 del artículo anterior.
Ejecuta el siguiente comando para poner en marcha nuestro plan maestro:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ansible-playbook <span class="nt">-i</span> hosts crear_usuarios.yml <span class="nt">--ask-vault-pass</span>
</code></pre></div></div>

<p>Ansible te pedirá la contraseña de credenciales_usuarios.yml y luego creará las cuentas de usuario en el servidor remoto. ¡Misión cumplida! ¡Seguridad y eficiencia en un solo paquete!</p>

<p>Con Ansible Vault y un playbook bien diseñado, podemos automatizar la creación de usuarios de forma segura y eficiente. ¡Anímate a probarlo y sigue explorando las posibilidades de Ansible!</p>

<p>Nota: La información sobre cómo usar Ansible Vault proviene de la documentación oficial de Ansible y no de las fuentes proporcionadas. Puedes encontrar más detalles en la página de la documentación de <a href="https://docs.ansible.com/ansible/2.9/user_guide/vault.html">Ansible Vault</a>.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Protegiendo las credenciales con Ansible Vault]]></summary></entry><entry><title type="html">Organizando fotos con Python</title><link href="https://lorcopotia.github.io/2024/11/12/Organizando-fotos-con-python.html" rel="alternate" type="text/html" title="Organizando fotos con Python" /><published>2024-11-12T00:00:00+00:00</published><updated>2024-11-12T00:00:00+00:00</updated><id>https://lorcopotia.github.io/2024/11/12/Organizando-fotos-con-python</id><content type="html" xml:base="https://lorcopotia.github.io/2024/11/12/Organizando-fotos-con-python.html"><![CDATA[<h1 id="el-poder-de-python-automatiza-tu-mundo">El poder de Python: Automatiza tu mundo</h1>

<p>¿Te imaginas poder controlar tu computadora, tus servidores, ¡incluso tu casa inteligente con solo unas líneas de código? Eso es lo que puedes lograr aprendiendo Python, un lenguaje de programación versátil y poderoso que está conquistando el mundo.</p>

<p>¿Por qué Python es tan especial?</p>
<ul>
  <li>Es fácil de aprender: La sintaxis de Python es clara y concisa, ¡casi como leer en inglés! Esto lo convierte en un lenguaje ideal para principiantes.</li>
  <li>Es muy versátil: Puedes usar Python para casi cualquier cosa: desde análisis de datos hasta desarrollo web, pasando por inteligencia artificial y automatización.</li>
  <li>Tiene una gran comunidad: Millones de personas en todo el mundo utilizan Python, lo que significa que hay una gran cantidad de recursos, tutoriales y bibliotecas disponibles para ayudarte a aprender y a resolver cualquier problema que puedas tener.</li>
</ul>

<p>¿Aún no te convences? Veamos un ejemplo práctico que te dejará con ganas de más.</p>

<p>Imagina que tienes un montón de fotos en tu computadora, todas desorganizadas en diferentes carpetas. Quieres ordenarlas por fecha, pero hacerlo manualmente te llevaría horas. ¡Con Python puedes hacerlo en minutos!</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>

<span class="c1"># Directorio donde están las fotos
</span><span class="n">directorio_fotos</span> <span class="o">=</span> <span class="s">"/ruta/a/tus/fotos"</span>

<span class="c1"># Recorrer todas las fotos en el directorio
</span><span class="k">for</span> <span class="n">nombre_archivo</span> <span class="ow">in</span> <span class="n">os</span><span class="p">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">directorio_fotos</span><span class="p">):</span>
  <span class="c1"># Obtener la fecha de la foto
</span>  <span class="n">fecha_foto</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">getmtime</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">directorio_fotos</span><span class="p">,</span> <span class="n">nombre_archivo</span><span class="p">)))</span>

  <span class="c1"># Crear una carpeta para el año y el mes de la foto
</span>  <span class="n">carpeta_destino</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">directorio_fotos</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">fecha_foto</span><span class="p">.</span><span class="n">year</span><span class="p">),</span> <span class="nb">str</span><span class="p">(</span><span class="n">fecha_foto</span><span class="p">.</span><span class="n">month</span><span class="p">))</span>
  <span class="n">os</span><span class="p">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">carpeta_destino</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>

  <span class="c1"># Mover la foto a la carpeta correspondiente
</span>  <span class="n">os</span><span class="p">.</span><span class="n">rename</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">directorio_fotos</span><span class="p">,</span> <span class="n">nombre_archivo</span><span class="p">),</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">carpeta_destino</span><span class="p">,</span> <span class="n">nombre_archivo</span><span class="p">))</span>

<span class="k">print</span><span class="p">(</span><span class="s">"¡Fotos organizadas con éxito!"</span><span class="p">)</span>
</code></pre></div></div>

<p>Con este simple script, Python recorre todas tus fotos, extrae la fecha de cada una y las organiza en carpetas por año y mes. ¡Adiós al caos fotográfico!
Este es solo un pequeño ejemplo de lo que puedes hacer con Python. Anímate a explorar este fascinante mundo de la programación y descubre el poder de automatizar tu mundo.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[El poder de Python: Automatiza tu mundo ¿Te imaginas poder controlar tu computadora, tus servidores, ¡incluso tu casa inteligente con solo unas líneas de código? Eso es lo que puedes lograr aprendiendo Python, un lenguaje de programación versátil y poderoso que está conquistando el mundo. ¿Por qué Python es tan especial? Es fácil de aprender: La sintaxis de Python es clara y concisa, ¡casi como leer en inglés! Esto lo convierte en un lenguaje ideal para principiantes. Es muy versátil: Puedes usar Python para casi cualquier cosa: desde análisis de datos hasta desarrollo web, pasando por inteligencia artificial y automatización. Tiene una gran comunidad: Millones de personas en todo el mundo utilizan Python, lo que significa que hay una gran cantidad de recursos, tutoriales y bibliotecas disponibles para ayudarte a aprender y a resolver cualquier problema que puedas tener. ¿Aún no te convences? Veamos un ejemplo práctico que te dejará con ganas de más. Imagina que tienes un montón de fotos en tu computadora, todas desorganizadas en diferentes carpetas. Quieres ordenarlas por fecha, pero hacerlo manualmente te llevaría horas. ¡Con Python puedes hacerlo en minutos! import os from datetime import datetime # Directorio donde están las fotos directorio_fotos = "/ruta/a/tus/fotos" # Recorrer todas las fotos en el directorio for nombre_archivo in os.listdir(directorio_fotos): # Obtener la fecha de la foto fecha_foto = datetime.fromtimestamp(os.path.getmtime(os.path.join(directorio_fotos, nombre_archivo))) # Crear una carpeta para el año y el mes de la foto carpeta_destino = os.path.join(directorio_fotos, str(fecha_foto.year), str(fecha_foto.month)) os.makedirs(carpeta_destino, exist_ok=True) # Mover la foto a la carpeta correspondiente os.rename(os.path.join(directorio_fotos, nombre_archivo), os.path.join(carpeta_destino, nombre_archivo)) print("¡Fotos organizadas con éxito!") Con este simple script, Python recorre todas tus fotos, extrae la fecha de cada una y las organiza en carpetas por año y mes. ¡Adiós al caos fotográfico! Este es solo un pequeño ejemplo de lo que puedes hacer con Python. Anímate a explorar este fascinante mundo de la programación y descubre el poder de automatizar tu mundo.]]></summary></entry><entry><title type="html">Utilizando Ansible Dia A Dia</title><link href="https://lorcopotia.github.io/2024/11/04/Utilizando-Ansible-dia-a-dia.html" rel="alternate" type="text/html" title="Utilizando Ansible Dia A Dia" /><published>2024-11-04T00:00:00+00:00</published><updated>2024-11-04T00:00:00+00:00</updated><id>https://lorcopotia.github.io/2024/11/04/Utilizando-Ansible-dia-a-dia</id><content type="html" xml:base="https://lorcopotia.github.io/2024/11/04/Utilizando-Ansible-dia-a-dia.html"><![CDATA[<h1 id="ansible-en-nuestro-día-a-día">Ansible en nuestro día-a-día</h1>

<h2 id="automatizando-la-configuración-de-un-servidor-web-con-ansible-un-ejemplo-práctico">Automatizando la configuración de un servidor web con Ansible: Un ejemplo práctico</h2>

<p>En el mundo actual de desarrollo y operaciones, la automatización es clave para lograr eficiencia y escalabilidad. Ansible se ha convertido en una herramienta fundamental para los equipos de DevOps, permitiéndoles automatizar la configuración y gestión de su infraestructura de manera sencilla y efectiva.</p>

<p>Este artículo presenta un ejemplo práctico y útil que demuestra cómo usar un playbook de Ansible para configurar un servidor web Apache en un sistema Ubuntu.</p>

<p><strong>El playbook:</strong></p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="pi">-</span> <span class="na">hosts</span><span class="pi">:</span> <span class="s">webservers</span>
  <span class="na">become</span><span class="pi">:</span> <span class="s">yes</span>

  <span class="na">vars</span><span class="pi">:</span>
    <span class="na">document_root</span><span class="pi">:</span> <span class="s">/var/www/html</span>
    <span class="na">apache_package</span><span class="pi">:</span> <span class="s">apache2</span>

  <span class="na">tasks</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Instalar Apache</span>
    <span class="na">apt</span><span class="pi">:</span> 
      <span class="na">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
      <span class="na">state</span><span class="pi">:</span> <span class="s">present</span>

  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Crear el directorio raíz del documento</span>
    <span class="na">file</span><span class="pi">:</span>
      <span class="na">path</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
      <span class="na">state</span><span class="pi">:</span> <span class="s">directory</span>
      <span class="na">owner</span><span class="pi">:</span> <span class="s">www-data</span>
      <span class="na">group</span><span class="pi">:</span> <span class="s">www-data</span>
      <span class="na">mode</span><span class="pi">:</span> <span class="m">0755</span>

  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Copiar archivo index.html</span>
    <span class="na">copy</span><span class="pi">:</span>
      <span class="na">src</span><span class="pi">:</span> <span class="s">index.html</span>
      <span class="na">dest</span><span class="pi">:</span> <span class="s2">"</span><span class="s">/index.html"</span>
      <span class="na">owner</span><span class="pi">:</span> <span class="s">www-data</span>
      <span class="na">group</span><span class="pi">:</span> <span class="s">www-data</span>
      <span class="na">mode</span><span class="pi">:</span> <span class="m">0644</span>

  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Habilitar el sitio web predeterminado</span>
    <span class="na">command</span><span class="pi">:</span> <span class="s">a2ensite default</span>

  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Reiniciar Apache</span>
    <span class="na">service</span><span class="pi">:</span>
      <span class="na">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
      <span class="na">state</span><span class="pi">:</span> <span class="s">restarted</span>
</code></pre></div></div>

<p><strong>Explicación paso a paso:</strong></p>

<ol>
  <li><strong>Definición de hosts:</strong> La primera línea define el grupo de hosts (<code class="language-plaintext highlighter-rouge">webservers</code>) donde se ejecutará el playbook.  <strong>Es importante destacar que debes configurar tu inventario de Ansible para que incluya los servidores que pertenecen a este grupo.</strong></li>
  <li><strong>Privilegios de root:</strong> <code class="language-plaintext highlighter-rouge">become: yes</code> indica que las tareas se ejecutarán con privilegios de root.</li>
  <li><strong>Variables:</strong> La sección <code class="language-plaintext highlighter-rouge">vars</code> define las variables que se utilizarán en el playbook, como la ruta del directorio raíz del documento (<code class="language-plaintext highlighter-rouge">document_root</code>) y el nombre del paquete de Apache (<code class="language-plaintext highlighter-rouge">apache_package</code>).</li>
  <li><strong>Tareas:</strong> La sección <code class="language-plaintext highlighter-rouge">tasks</code> contiene la lista de tareas que se ejecutarán en los hosts especificados.
    <ul>
      <li><strong>Instalar Apache:</strong> Esta tarea utiliza el módulo <code class="language-plaintext highlighter-rouge">apt</code> para instalar el paquete de Apache.</li>
      <li><strong>Crear directorio raíz:</strong> Esta tarea utiliza el módulo <code class="language-plaintext highlighter-rouge">file</code> para crear el directorio raíz del documento si no existe.</li>
      <li><strong>Copiar archivo index.html:</strong> Esta tarea utiliza el módulo <code class="language-plaintext highlighter-rouge">copy</code> para copiar un archivo <code class="language-plaintext highlighter-rouge">index.html</code> desde el directorio local al directorio raíz del documento en el servidor.</li>
      <li><strong>Habilitar sitio web:</strong> Esta tarea utiliza el comando <code class="language-plaintext highlighter-rouge">a2ensite</code> para habilitar el sitio web predeterminado en Apache.</li>
      <li><strong>Reiniciar Apache:</strong> Esta tarea utiliza el módulo <code class="language-plaintext highlighter-rouge">service</code> para reiniciar el servicio Apache, asegurando que los cambios se apliquen.</li>
    </ul>
  </li>
</ol>

<p><strong>Beneficios de usar Ansible:</strong></p>

<ul>
  <li><strong>Idempotencia:</strong>  Ansible garantiza que el servidor esté en el estado deseado, incluso si el playbook se ejecuta varias veces. Si Apache ya está instalado, Ansible no intentará reinstalarlo.</li>
  <li><strong>Simplicidad:</strong>  La sintaxis YAML de Ansible es fácil de leer y entender, incluso para personas sin experiencia previa en programación.</li>
  <li><strong>Reutilización:</strong>  Los playbooks de Ansible se pueden reutilizar para configurar múltiples servidores con diferentes configuraciones, lo que reduce la duplicación de esfuerzos y la posibilidad de errores.</li>
</ul>

<p><strong>Conclusión:</strong></p>

<p>Este ejemplo práctico ilustra cómo Ansible puede simplificar significativamente la configuración de un servidor web. Con solo unas pocas líneas de código YAML, puedes automatizar todo el proceso, desde la instalación de software hasta la configuración de archivos y servicios. Ansible no solo ahorra tiempo y reduce errores, sino que también hace que la gestión de la infraestructura sea más eficiente, escalable y repetible.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Ansible en nuestro día-a-día Automatizando la configuración de un servidor web con Ansible: Un ejemplo práctico En el mundo actual de desarrollo y operaciones, la automatización es clave para lograr eficiencia y escalabilidad. Ansible se ha convertido en una herramienta fundamental para los equipos de DevOps, permitiéndoles automatizar la configuración y gestión de su infraestructura de manera sencilla y efectiva. Este artículo presenta un ejemplo práctico y útil que demuestra cómo usar un playbook de Ansible para configurar un servidor web Apache en un sistema Ubuntu. El playbook: --- - hosts: webservers become: yes vars: document_root: /var/www/html apache_package: apache2 tasks: - name: Instalar Apache apt: name: "" state: present - name: Crear el directorio raíz del documento file: path: "" state: directory owner: www-data group: www-data mode: 0755 - name: Copiar archivo index.html copy: src: index.html dest: "/index.html" owner: www-data group: www-data mode: 0644 - name: Habilitar el sitio web predeterminado command: a2ensite default - name: Reiniciar Apache service: name: "" state: restarted Explicación paso a paso: Definición de hosts: La primera línea define el grupo de hosts (webservers) donde se ejecutará el playbook. Es importante destacar que debes configurar tu inventario de Ansible para que incluya los servidores que pertenecen a este grupo. Privilegios de root: become: yes indica que las tareas se ejecutarán con privilegios de root. Variables: La sección vars define las variables que se utilizarán en el playbook, como la ruta del directorio raíz del documento (document_root) y el nombre del paquete de Apache (apache_package). Tareas: La sección tasks contiene la lista de tareas que se ejecutarán en los hosts especificados. Instalar Apache: Esta tarea utiliza el módulo apt para instalar el paquete de Apache. Crear directorio raíz: Esta tarea utiliza el módulo file para crear el directorio raíz del documento si no existe. Copiar archivo index.html: Esta tarea utiliza el módulo copy para copiar un archivo index.html desde el directorio local al directorio raíz del documento en el servidor. Habilitar sitio web: Esta tarea utiliza el comando a2ensite para habilitar el sitio web predeterminado en Apache. Reiniciar Apache: Esta tarea utiliza el módulo service para reiniciar el servicio Apache, asegurando que los cambios se apliquen. Beneficios de usar Ansible: Idempotencia: Ansible garantiza que el servidor esté en el estado deseado, incluso si el playbook se ejecuta varias veces. Si Apache ya está instalado, Ansible no intentará reinstalarlo. Simplicidad: La sintaxis YAML de Ansible es fácil de leer y entender, incluso para personas sin experiencia previa en programación. Reutilización: Los playbooks de Ansible se pueden reutilizar para configurar múltiples servidores con diferentes configuraciones, lo que reduce la duplicación de esfuerzos y la posibilidad de errores. Conclusión: Este ejemplo práctico ilustra cómo Ansible puede simplificar significativamente la configuración de un servidor web. Con solo unas pocas líneas de código YAML, puedes automatizar todo el proceso, desde la instalación de software hasta la configuración de archivos y servicios. Ansible no solo ahorra tiempo y reduce errores, sino que también hace que la gestión de la infraestructura sea más eficiente, escalable y repetible.]]></summary></entry><entry><title type="html">Utilizando HTTP2 con Docker y Nginx</title><link href="https://lorcopotia.github.io/2024/10/12/Utilizando-HTTP2-con-Docker-Nginx.html" rel="alternate" type="text/html" title="Utilizando HTTP2 con Docker y Nginx" /><published>2024-10-12T00:00:00+00:00</published><updated>2024-10-12T00:00:00+00:00</updated><id>https://lorcopotia.github.io/2024/10/12/Utilizando-HTTP2-con-Docker-Nginx</id><content type="html" xml:base="https://lorcopotia.github.io/2024/10/12/Utilizando-HTTP2-con-Docker-Nginx.html"><![CDATA[<h1 id="http2dockernginx">HTTP/2+Docker+Nginx</h1>

<p>La idea surgió por la necesidad de <a href="https://docs.openshift.com/container-platform/4.14/networking/ingress-operator.html#nw-http2-haproxy_configuring-ingress">habilitar HTTP/2 en Openshift</a> y de contar con una imagen que ya estuviese preparada para desplegar y poder validad que se esta utilizando el protocolo satisfactoriamente. En esta guía utilizaré Docker.</p>

<h2 id="pasos">Pasos</h2>

<ol>
  <li>
    <p>Ejecutar los siguientes comandos para preparar los certificados que utilizaremos (estos son autofirmados para los propósitos del tutorial):</p>

    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkdir certs
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./certs/nginx.key -out ./certs/nginx.crt
</code></pre></div>    </div>
  </li>
  <li>
    <p>Crear el docker-compose.yml:</p>

    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>services:
  nginx:
    image: lorcopotia/my-http2-app:latest
    ports:
      - "443:443" 
    volumes:
       - ./certs:/etc/nginx/certs:ro
       #- ./html:/usr/share/nginx/html # Descomentar y poner el directorio vuestra web
 restart: always
</code></pre></div>    </div>
  </li>
  <li>
    <p>Ejecutar el siguiente comando para inicializar el contenedor:</p>

    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker compose up -d
</code></pre></div>    </div>
  </li>
  <li>
    <p>Abrir <code class="language-plaintext highlighter-rouge">https://localhost</code> el tu navegador favorito e inspecciona con Developer tools. En la pestaña de <em>Red</em> deberias poder ver <code class="language-plaintext highlighter-rouge">h2</code> en la columna <em>protocol</em>.</p>
  </li>
</ol>]]></content><author><name></name></author><summary type="html"><![CDATA[HTTP/2+Docker+Nginx La idea surgió por la necesidad de habilitar HTTP/2 en Openshift y de contar con una imagen que ya estuviese preparada para desplegar y poder validad que se esta utilizando el protocolo satisfactoriamente. En esta guía utilizaré Docker. Pasos Ejecutar los siguientes comandos para preparar los certificados que utilizaremos (estos son autofirmados para los propósitos del tutorial): mkdir certs openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./certs/nginx.key -out ./certs/nginx.crt Crear el docker-compose.yml: services: nginx: image: lorcopotia/my-http2-app:latest ports: - "443:443" volumes: - ./certs:/etc/nginx/certs:ro #- ./html:/usr/share/nginx/html # Descomentar y poner el directorio vuestra web restart: always Ejecutar el siguiente comando para inicializar el contenedor: docker compose up -d Abrir https://localhost el tu navegador favorito e inspecciona con Developer tools. En la pestaña de Red deberias poder ver h2 en la columna protocol.]]></summary></entry></feed>