<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Open-Source | Luis Cacho</title><link>https://luiscachog.io/tag/open-source/</link><atom:link href="https://luiscachog.io/tag/open-source/index.xml" rel="self" type="application/rss+xml"/><description>Open-Source</description><generator>Wowchemy (https://wowchemy.com)</generator><language>en-us</language><lastBuildDate>Thu, 25 Mar 2021 09:10:47 -0500</lastBuildDate><image><url>https://luiscachog.io/media/icon_hu4fa4dbbaafd6f1b45a88958b9b4a0dd0_11007_512x512_fill_lanczos_center_3.png</url><title>Open-Source</title><link>https://luiscachog.io/tag/open-source/</link></image><item><title>Differences between Kubernetes and Openshift</title><link>https://luiscachog.io/slides/k8s-vs-ocp/</link><pubDate>Thu, 25 Mar 2021 09:10:47 -0500</pubDate><guid>https://luiscachog.io/slides/k8s-vs-ocp/</guid><description>&lt;!-- [revealoptions]
controlsBackArrows= "hidden"
history= false
center= true
showNotes= false
width= "100%"
height= "100%"
margin= 0.2
minScale= 0.2
maxScale= 1.5 -->
&lt;h1 id="heading">&lt;/h1>
&lt;h2 id="differences-between-kubernetes-and-openshift">Differences between Kubernetes and Openshift&lt;/h2>
&lt;hr>
&lt;h3 id="luis-cacho">Luis Cacho&lt;/h3>
&lt;h4 id="senior-container-infrastructure-consultant">Senior Container Infrastructure Consultant&lt;/h4>
&lt;h5 id="red-hathttpsredhatcom">&lt;a href="https://redhat.com" target="_blank" rel="noopener">@Red Hat&lt;/a>&lt;/h5>
&lt;hr>
&lt;section data-shortcode-section>
&lt;h3 id="kubernetes">Kubernetes&lt;/h3>
&lt;h4 id="some-assembly-required">Some assembly required&lt;/h4>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/k8s-lego_hu5d4fa49e9520c9dd96a24d33f6995b83_231012_48794af0155d9a2bccc567c0020e68ae.webp 400w,
/media/slides/k8s-vs-ocp/k8s-lego_hu5d4fa49e9520c9dd96a24d33f6995b83_231012_dd12ccf7664715d6e555f2ac927603a6.webp 760w,
/media/slides/k8s-vs-ocp/k8s-lego_hu5d4fa49e9520c9dd96a24d33f6995b83_231012_1200x1200_fit_q90_h2_lanczos.webp 1200w"
src="https://luiscachog.io/media/slides/k8s-vs-ocp/k8s-lego_hu5d4fa49e9520c9dd96a24d33f6995b83_231012_48794af0155d9a2bccc567c0020e68ae.webp"
width="50%"
height="760"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;hr>
&lt;!-- markdownlint-capture -->
&lt;!-- markdownlint-disable -->
&lt;h3 id="kubernetes-1">Kubernetes&lt;/h3>
&lt;!-- markdownlint-restore -->
&lt;h4 id="some-assembly-required-1">Some assembly required&lt;/h4>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/k8s-lack_hue22ff0180dba771c4b2ced3e722d392b_12541_e93d7511a3f9d6d1a8a73de2dceb786c.webp 400w,
/media/slides/k8s-vs-ocp/k8s-lack_hue22ff0180dba771c4b2ced3e722d392b_12541_832425835d1bbb59e844aefb220cdae5.webp 760w,
/media/slides/k8s-vs-ocp/k8s-lack_hue22ff0180dba771c4b2ced3e722d392b_12541_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://luiscachog.io/media/slides/k8s-vs-ocp/k8s-lack_hue22ff0180dba771c4b2ced3e722d392b_12541_e93d7511a3f9d6d1a8a73de2dceb786c.webp"
width="100%"
height="327"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;aside class="notes">
&lt;ul>
&lt;li>Press &lt;code>S&lt;/code> key to view -&lt;/li>
&lt;/ul>
&lt;p>Kubernetes does not provide (out-of-the-box):&lt;/p>
&lt;ol>
&lt;li>Operative System&lt;/li>
&lt;li>Developer tooling and UX&lt;/li>
&lt;li>Container runtime (CRI-O, Containerd, Docker, etc).&lt;/li>
&lt;li>Image registry&lt;/li>
&lt;li>Software-defined networking&lt;/li>
&lt;li>Load‐balancer and routing&lt;/li>
&lt;li>Log management&lt;/li>
&lt;li>Container metrics and monitoring&lt;/li>
&lt;li>DNS&lt;/li>
&lt;li>Ingress&lt;/li>
&lt;li>RBAC&lt;/li>
&lt;li>Storage&lt;/li>
&lt;li>Management&lt;/li>
&lt;li>Service Catalog (Operators)&lt;/li>
&lt;/ol>
&lt;/aside>
&lt;hr>
&lt;!-- markdownlint-capture -->
&lt;!-- markdownlint-disable -->
&lt;h3 id="kubernetes-2">Kubernetes&lt;/h3>
&lt;!-- markdownlint-restore -->
&lt;h4 id="some-assembly-required-2">Some assembly required&lt;/h4>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/k8s-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6556548_3714d455a464221b6a1d8baf8dd3d70d.webp 400w,
/media/slides/k8s-vs-ocp/k8s-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6556548_2d3810e7e57aa438895b4bee44290b15.webp 760w,
/media/slides/k8s-vs-ocp/k8s-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6556548_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://luiscachog.io/media/slides/k8s-vs-ocp/k8s-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6556548_3714d455a464221b6a1d8baf8dd3d70d.webp"
width="100%"
height="460"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/section>
&lt;hr>
&lt;section data-shortcode-section>
&lt;h3 id="openshift">Openshift&lt;/h3>
&lt;h4 id="value-added">Value Added&lt;/h4>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/ocp-logo_hub55d0082020858bd8e0d2513214bb36a_58983_27ac333dfa6b7cab104fa5c4bf33e82d.webp 400w,
/media/slides/k8s-vs-ocp/ocp-logo_hub55d0082020858bd8e0d2513214bb36a_58983_360fe55c5a4b106c7fe23b1a6cd1e52f.webp 760w,
/media/slides/k8s-vs-ocp/ocp-logo_hub55d0082020858bd8e0d2513214bb36a_58983_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://luiscachog.io/media/slides/k8s-vs-ocp/ocp-logo_hub55d0082020858bd8e0d2513214bb36a_58983_27ac333dfa6b7cab104fa5c4bf33e82d.webp"
width="70%"
height="324"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;hr>
&lt;!-- markdownlint-capture -->
&lt;!-- markdownlint-disable -->
&lt;h3 id="openshift-1">Openshift&lt;/h3>
&lt;!-- markdownlint-restore -->
&lt;h4 id="value-added-1">Value Added&lt;/h4>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/ocp-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6563729_1aaf0e92aea7613704fa9ac8bebc3a0f.webp 400w,
/media/slides/k8s-vs-ocp/ocp-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6563729_641a6e6fa95ce9815f897687463d4ca1.webp 760w,
/media/slides/k8s-vs-ocp/ocp-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6563729_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://luiscachog.io/media/slides/k8s-vs-ocp/ocp-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6563729_1aaf0e92aea7613704fa9ac8bebc3a0f.webp"
width="100%"
height="460"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;hr>
&lt;!-- markdownlint-capture -->
&lt;!-- markdownlint-disable -->
&lt;h3 id="openshift-2">Openshift&lt;/h3>
&lt;!-- markdownlint-restore -->
&lt;h4 id="value-added-2">Value Added&lt;/h4>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/ocp-arch_hu5ad65d1c520fefa54127e833cd143ea7_167834_b5727e55f72b3d94cb10d01346c89252.webp 400w,
/media/slides/k8s-vs-ocp/ocp-arch_hu5ad65d1c520fefa54127e833cd143ea7_167834_4638c01656df18eef165986fb64bc40a.webp 760w,
/media/slides/k8s-vs-ocp/ocp-arch_hu5ad65d1c520fefa54127e833cd143ea7_167834_1200x1200_fit_q90_h2_lanczos_2.webp 1200w"
src="https://luiscachog.io/media/slides/k8s-vs-ocp/ocp-arch_hu5ad65d1c520fefa54127e833cd143ea7_167834_b5727e55f72b3d94cb10d01346c89252.webp"
width="100%"
height="429"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/section>
&lt;hr>
&lt;section data-shortcode-section>
&lt;h3 id="openshift-contains-kubernetes">Openshift contains Kubernetes&lt;/h3>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/ocp-contains-k8s_hu1e0fae1efb02309ebe72b4ea66218d50_97537_f8b786763edc718263bf7bbb9b9cc32b.webp 400w,
/media/slides/k8s-vs-ocp/ocp-contains-k8s_hu1e0fae1efb02309ebe72b4ea66218d50_97537_96f387002adacb57fbf6e32a888c96a8.webp 760w,
/media/slides/k8s-vs-ocp/ocp-contains-k8s_hu1e0fae1efb02309ebe72b4ea66218d50_97537_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://luiscachog.io/media/slides/k8s-vs-ocp/ocp-contains-k8s_hu1e0fae1efb02309ebe72b4ea66218d50_97537_f8b786763edc718263bf7bbb9b9cc32b.webp"
width="90%"
height="435"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;aside class="notes">
&lt;ul>
&lt;li>Press &lt;code>S&lt;/code> key to view -&lt;/li>
&lt;/ul>
&lt;/aside>
&lt;hr>
&lt;!-- markdownlint-capture -->
&lt;!-- markdownlint-disable -->
&lt;h3 id="openshift-contains-kubernetes-1">Openshift contains Kubernetes&lt;/h3>
&lt;!-- markdownlint-restore -->
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/ocp-is-k8s_hud3011e5a0c6e498bbc0af9bd76a3a0dd_105280_89205a684652c1b7301a7c7737a9ce4e.webp 400w,
/media/slides/k8s-vs-ocp/ocp-is-k8s_hud3011e5a0c6e498bbc0af9bd76a3a0dd_105280_afdaf2fcf41a32a0c5da9a20e5afb4cd.webp 760w,
/media/slides/k8s-vs-ocp/ocp-is-k8s_hud3011e5a0c6e498bbc0af9bd76a3a0dd_105280_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://luiscachog.io/media/slides/k8s-vs-ocp/ocp-is-k8s_hud3011e5a0c6e498bbc0af9bd76a3a0dd_105280_89205a684652c1b7301a7c7737a9ce4e.webp"
width="90%"
height="386"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/section>
&lt;hr>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;h3 id="openshit-is-a-kubernetes-flavor">Openshit IS a Kubernetes flavor&lt;/h3>
&lt;hr>
&lt;h2 id="thank-you">Thank You&lt;/h2></description></item><item><title>Differences between Kubernetes and Openshift</title><link>https://luiscachog.io/talk/differences-between-kubernetes-and-openshift/</link><pubDate>Thu, 25 Mar 2021 09:09:11 -0500</pubDate><guid>https://luiscachog.io/talk/differences-between-kubernetes-and-openshift/</guid><description/></item><item><title>Personal Website</title><link>https://luiscachog.io/project/luiscachog.io/</link><pubDate>Sun, 24 Nov 2019 00:00:00 +0000</pubDate><guid>https://luiscachog.io/project/luiscachog.io/</guid><description>&lt;p>Static site for luiscachog.io using:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://gohugo.io/" target="_blank" rel="noopener">Hugo&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://sourcethemes.com/academic/" target="_blank" rel="noopener">Academic&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://netlify.com" target="_blank" rel="noopener">Netlify&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Actual status:
&lt;a href="https://app.netlify.com/sites/luiscachog-io/deploys" target="_blank" rel="noopener">
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img src="https://api.netlify.com/api/v1/badges/ee03253e-7d3e-45ab-83b6-979d6963dfeb/deploy-status" alt="Netlify Status" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/a>&lt;/p></description></item><item><title>Kubernetes Contributor</title><link>https://luiscachog.io/project/kubernetes-contributor/</link><pubDate>Sun, 27 Oct 2019 00:00:00 +0000</pubDate><guid>https://luiscachog.io/project/kubernetes-contributor/</guid><description>&lt;p>Contributing to the &lt;a href="https://kubernetes.io" target="_blank" rel="noopener">Kubernetes&lt;/a> project in different &lt;a href="https://git.k8s.io/community/" target="_blank" rel="noopener">special interest groups&lt;/a>,
mainly focused on migration and modernization, documentation, community, and user/contributor experience.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://prow.k8s.io/pr?query=is%3Apr%20author%3Aluiscachog" target="_blank" rel="noopener">Prow PR Dashboard&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="sig-docs">sig-docs&lt;/h2>
&lt;p>Contributor on the Spanish translation content at kubernetes.io in &lt;strong>sig-docs&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/kubernetes/community/tree/master/sig-docs" target="_blank" rel="noopener">Docs Special Interest Group&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/kubernetes/website/issues/13948" target="_blank" rel="noopener">Tracking Spanish Localisation Progress (M1) #13948&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="kubernetes-docs-es">kubernetes-docs-es&lt;/h2>
&lt;h2 id="konveyor">konveyor&lt;/h2></description></item><item><title>Ansible Galaxy Roles</title><link>https://luiscachog.io/project/ansible-galaxy-roles/</link><pubDate>Fri, 25 Oct 2019 00:00:00 +0000</pubDate><guid>https://luiscachog.io/project/ansible-galaxy-roles/</guid><description>&lt;ul>
&lt;li>
&lt;p>CircleCI Role: Ansible role that installs &lt;a href="https://circleci-public.github.io/circleci-cli/" target="_blank" rel="noopener">CircleCI CLI&lt;/a> on your server/workstation. &lt;a href="https://app.travis-ci.com/github/luiscachog/ansible-circleci-cli" target="_blank" rel="noopener">
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img src="https://app.travis-ci.com/luiscachog/ansible-circleci-cli.svg?branch=master" alt="Build Status" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Sonobuoy Role: Ansible role that installs &lt;a href="https://sonobuoy.io/" target="_blank" rel="noopener">sonobuoy&lt;/a> on your server/workstation. &lt;a href="https://app.travis-ci.com/github/luiscachog/ansible-sonobuoy" target="_blank" rel="noopener">
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img src="https://app.travis-ci.com/luiscachog/ansible-sonobuoy.svg?branch=master" alt="Build Status" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/a>&lt;/p>
&lt;/li>
&lt;/ul></description></item><item><title>Molecule Cookiecutter</title><link>https://luiscachog.io/project/molecule-cookiecutter/</link><pubDate>Thu, 24 Oct 2019 00:00:00 +0000</pubDate><guid>https://luiscachog.io/project/molecule-cookiecutter/</guid><description>&lt;p>A Cookiecutter template for your new Molecule project.&lt;/p></description></item><item><title>Docker Login the Right Way</title><link>https://luiscachog.io/docker-login-the-right-way/</link><pubDate>Wed, 15 May 2019 00:00:00 +0000</pubDate><guid>https://luiscachog.io/docker-login-the-right-way/</guid><description>&lt;details class="toc-inpage d-print-none " open>
&lt;summary class="font-weight-bold">Table of Contents&lt;/summary>
&lt;nav id="TableOfContents">
&lt;ul>
&lt;li>&lt;a href="#credential-store">Credential Store&lt;/a>&lt;/li>
&lt;li>&lt;a href="#docker-credential-helpers">Docker Credential Helpers&lt;/a>&lt;/li>
&lt;li>&lt;a href="#docker-credential-secret-service">docker-credential-secret service&lt;/a>&lt;/li>
&lt;/ul>
&lt;/nav>
&lt;/details>
&lt;h1 id="docker-login-the-right-way">Docker Login the right Way&lt;/h1>
&lt;p>Hi again!&lt;/p>
&lt;p>It is been a while since I wrote something here, as always, there is no much time for a hobby.&lt;/p>
&lt;p>I&amp;rsquo;ve been working for a while with docker, not a production level, but for some applications that I use at work.
And since the &lt;a href="https://www.zdnet.com/article/docker-hub-hack-exposed-data-of-190000-users/" target="_blank" rel="noopener">Docker Hub Data breach&lt;/a>
I put more atention on the security of my data/credentials, so I investigate a little about and found this official
repository &lt;a href="https://github.com/docker/docker-credential-helpers/" target="_blank" rel="noopener">https://github.com/docker/docker-credential-helpers/&lt;/a> from Docker where are the supported credential helpers.&lt;/p>
&lt;h2 id="credential-store">Credential Store&lt;/h2>
&lt;p>Docker keeps our credentials saved on a JSON file located on &lt;code>~/.docker/config.json&lt;/code>,
but unfortunatelly credentials are just encrypted on base64,
here is an &lt;a href="https://fosdem.org/2019/schedule/event/base64_not_encryption/" target="_blank" rel="noopener">articule/video&lt;/a> where there is an explanation for the why it is a bad idea to just use base64 encryption.&lt;/p>
&lt;p>The following is a diagram on how a plain text storage works:&lt;/p>
&lt;figure id="figure-docker-plain-text-storage">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Plain Text Storage" srcset="
/media/posts/docker-login-the-right-way/DockerPlainTextCredentials_hu371181661409e61f690ceccfb695d5d5_82530_0db582c8916ffc5cd1b1225c42276838.webp 400w,
/media/posts/docker-login-the-right-way/DockerPlainTextCredentials_hu371181661409e61f690ceccfb695d5d5_82530_b27b4b3bd220158c0d85a61a2d4ae88b.webp 760w,
/media/posts/docker-login-the-right-way/DockerPlainTextCredentials_hu371181661409e61f690ceccfb695d5d5_82530_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://luiscachog.io/media/posts/docker-login-the-right-way/DockerPlainTextCredentials_hu371181661409e61f690ceccfb695d5d5_82530_0db582c8916ffc5cd1b1225c42276838.webp"
width="760"
height="570"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Plain Text Storage
&lt;/figcaption>&lt;/figure>
&lt;p>Here is an example on how &lt;code>~/.docker/config.json&lt;/code> looks like when is using plain text credentials:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">cat ~/.docker/config.json
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;auths&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;https://index.docker.io/v1/&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;auth&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;azRjaDA6c3VwZXJzZWNyZXRwYXNzd29yZAo=&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;quay.io&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;auth&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;azRjaDA6c3VwZXJzZWNyZXRwYXNzd29yZAo=&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;HttpHeaders&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;User-Agent&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;Docker-Client/18.09.6 (linux)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>After a successful &lt;code>docker login&lt;/code> command,
Docker stores a base64 encoded string from the concatenation of the username, a colon, and the password and associates this string to the registry the user is logging into:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">$ &lt;span class="nb">echo&lt;/span> &lt;span class="nv">azRjaDA6c3VwZXJzZWNyZXRwYXNzd29yZAo&lt;/span>&lt;span class="o">=&lt;/span> &lt;span class="p">|&lt;/span> base64 -d -
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">luiscachog:supersecretpassword
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>A &lt;code>docker logout&lt;/code> command removes the entry from the JSON file for the given registry:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">$ docker &lt;span class="nb">logout&lt;/span> quay.io
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Remove login credentials &lt;span class="k">for&lt;/span> quay.io
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ cat ~/.docker/config.json
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;auths&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;https://index.docker.io/v1/&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;auth&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;azRjaDA6c3VwZXJzZWNyZXRwYXNzd29yZAo=&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;HttpHeaders&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;User-Agent&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;Docker-Client/18.09.6 (linux)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="docker-credential-helpers">Docker Credential Helpers&lt;/h2>
&lt;p>Since docker version &lt;code>1.11&lt;/code> implements support from an external credential store for registry authentication.
That means we can use a native keychain of the OS. Using an external store is more secure than storing on a &amp;ldquo;plain text&amp;rdquo; Docker configuration file.&lt;/p>
&lt;figure id="figure-docker-secure-storage">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Secure Storage" srcset="
/media/posts/docker-login-the-right-way/DockerSecureCredentials_huadaed0eecd0771dd576c62f4a77f8685_87803_dfab2c86655b67a2dd7b453f742b7daa.webp 400w,
/media/posts/docker-login-the-right-way/DockerSecureCredentials_huadaed0eecd0771dd576c62f4a77f8685_87803_67d1fdd1b117feb8b3cab43352b4a5be.webp 760w,
/media/posts/docker-login-the-right-way/DockerSecureCredentials_huadaed0eecd0771dd576c62f4a77f8685_87803_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://luiscachog.io/media/posts/docker-login-the-right-way/DockerSecureCredentials_huadaed0eecd0771dd576c62f4a77f8685_87803_dfab2c86655b67a2dd7b453f742b7daa.webp"
width="760"
height="543"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Secure Storage
&lt;/figcaption>&lt;/figure>
&lt;p>In order to use a external credential store, we need a program to interact with.&lt;/p>
&lt;p>The actual list of &amp;ldquo;official&amp;rdquo; Docker Credential Helper is:&lt;/p>
&lt;ol>
&lt;li>docker-credential-osxkeychain: Provides a helper to use the OS X keychain as credentials store.&lt;/li>
&lt;li>docker-credential-secretservice: Provides a helper to use the D-Bus secret service as credentials store.&lt;/li>
&lt;li>docker-credential-wincred: Provides a helper to use Windows credentials manager as store.&lt;/li>
&lt;li>docker-credential-pass: Provides a helper to use pass as credentials store.&lt;/li>
&lt;/ol>
&lt;h2 id="docker-credential-secret-service">docker-credential-secret service&lt;/h2>
&lt;p>On this post we will explore the docker-credential-secretservice and how to configure it.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>We need to download and install the helper.
You can find the lastest release on &lt;a href="https://github.com/docker/docker-credential-helpers/releases" target="_blank" rel="noopener">https://github.com/docker/docker-credential-helpers/releases&lt;/a>.
Download it, extract it and make it executable.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">wget https://github.com/docker/docker-credential-helpers/releases/download/v0.6.2/docker-credential-secretservice-v0.6.2-amd64.tar.gz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tar -xf docker-credential-secretservice-v0.6.2-amd64.tar.gz
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod +x docker-credential-secretservice
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo mv docker-credential-secretservice /usr/local/bin/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Then, we need to specify the credential store in the file &lt;code>~/.docker/config.json&lt;/code> to tell docker to use it.
The value must be the one after the prefix &lt;code>docker-credential-&lt;/code>. In this case:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;credsStore&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;secretservice&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>To facilite the configuration and do not make mistakes, you can run:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">sed -i &lt;span class="s1">&amp;#39;0,/{/s/{/{\n\t&amp;#34;credsStore&amp;#34;: &amp;#34;secretservice&amp;#34;,/&amp;#39;&lt;/span> ~/.docker/config.json
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>From now we are uning an external store, so if you are currently logged in, you must run &lt;code>docker logout&lt;/code> to remove the credentials from the file and run &lt;code>docker login&lt;/code> tostart using the new ones.&lt;/p>
&lt;p>Let me know how this works for you.&lt;/p>
&lt;p>&lt;strong>References:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Docker Credential Helpers repository&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/li>
&lt;li>Docker Credential Store Documentation&lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup>&lt;/li>
&lt;li>Slides about this topic &lt;sup id="fnref:3">&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref">3&lt;/a>&lt;/sup>&lt;/li>
&lt;/ul>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>&lt;a href="https://github.com/docker/docker-credential-helpers" target="_blank" rel="noopener">Docker Credential Helpers&lt;/a>&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:2">
&lt;p>&lt;a href="https://docs.docker.com/engine/reference/commandline/login/#credentials-store" target="_blank" rel="noopener">docker cli documentation&lt;/a>&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:3">
&lt;p>&lt;a href="https://www.slideshare.net/DavidYeung22/can-we-stop-saving-docker-credentials-in-plain-text-now" target="_blank" rel="noopener">Stop saving credential tokens in text files&lt;/a>&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>Bulk Delete Rackspace Cloud Files data via API</title><link>https://luiscachog.io/bulk-delete-cloud-files-api/</link><pubDate>Wed, 13 Feb 2019 00:00:00 +0000</pubDate><guid>https://luiscachog.io/bulk-delete-cloud-files-api/</guid><description>&lt;p>Sometimes it is necessary to delete all the content of the Cloud Files containers, however, the API does not have a proper method to delete the data and the containers on the same API call.
Also, accoring to the documentation, you can only delete &lt;strong>empty&lt;/strong> containers.&lt;/p>
&lt;p>So, in cases where you need to delete the &lt;strong>data and the containers&lt;/strong> at the same time, you should follow the next steps:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Download &lt;a href="https://github.com/cloudnull/turbolift" target="_blank" rel="noopener">Turbolift&lt;/a>, I know it is an old tool.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">git clone https://github.com/cloudnull/turbolift
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> turbolift
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>In order to get and isolated installation, we are going to create a Python Virtual Environment (virtualenv)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">mkvirtualenv turbolift
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">workon turbolift
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Install the tool&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">pip install turbolift
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Now, prior to start to play with the API calls, we need to grab some data to authenticate with the API:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Variable&lt;/th>
&lt;th>Definition&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>USERNAME&lt;/td>
&lt;td>This is the Rackspace Public Cloud username&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>APIKEY&lt;/td>
&lt;td>This is your API-KEY&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>REGION&lt;/td>
&lt;td>This is the Region where the Cloud Files are located (dfw, ord, iad, lon, hkg)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>TOKEN&lt;/td>
&lt;td>The TOKEN is generated after you get authenticated&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ENDPOINT&lt;/td>
&lt;td>This ENDPOINT is given also after you get authenticated&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/li>
&lt;li>
&lt;p>Next step, we are going to use &lt;a href="https://curl.haxx.se/" target="_blank" rel="noopener">cURL&lt;/a>, to perform all the API calls:&lt;/p>
&lt;ul>
&lt;li>First of all, get the TOKEN:&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">USERNAME&lt;/span>&lt;span class="o">=&lt;/span>YOUR-USERNAME
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">APIKEY&lt;/span>&lt;span class="o">=&lt;/span>YOUR-APIKEY
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">TOKEN&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>curl -s -XPOST https://identity.api.rackspacecloud.com/v2.0/tokens &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -d&lt;span class="s1">&amp;#39;{&amp;#34;auth&amp;#34;:{&amp;#34;RAX-KSKEY:apiKeyCredentials&amp;#34;:{&amp;#34;username&amp;#34;:&amp;#34;&amp;#39;&lt;/span>&lt;span class="nv">$USERNAME&lt;/span>&lt;span class="s1">&amp;#39;&amp;#34;,&amp;#34;apiKey&amp;#34;:&amp;#34;&amp;#39;&lt;/span>&lt;span class="nv">$APIKEY&lt;/span>&lt;span class="s1">&amp;#39;&amp;#34;}}}&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -H&lt;span class="s2">&amp;#34;Content-type:application/json&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> jq &lt;span class="s1">&amp;#39;.access.token.id&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> tr -d &lt;span class="s2">&amp;#34;\&amp;#34;&amp;#34;&lt;/span>&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>Next step, get the ENDPOINT:&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">ENDPOINT&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>curl -s -XPOST https://identity.api.rackspacecloud.com/v2.0/tokens &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -d&lt;span class="s1">&amp;#39;{&amp;#34;auth&amp;#34;:{&amp;#34;RAX-KSKEY:apiKeyCredentials&amp;#34;:{&amp;#34;username&amp;#34;:&amp;#34;&amp;#39;&lt;/span>&lt;span class="nv">$CL_USERNAME&lt;/span>&lt;span class="s1">&amp;#39;&amp;#34;,&amp;#34;apiKey&amp;#34;:&amp;#34;&amp;#39;&lt;/span>&lt;span class="nv">$APIKEY&lt;/span>&lt;span class="s1">&amp;#39;&amp;#34;}}}&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -H&lt;span class="s2">&amp;#34;Content-type:application/json&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> jq &lt;span class="s1">&amp;#39;.access.serviceCatalog[] | select((.name==&amp;#34;cloudFiles&amp;#34;) or (.name==&amp;#34;cloudFilesCDN&amp;#34;)) | {name} + .
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> endpoints[] | .publicURL&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> tr -d &lt;span class="s2">&amp;#34;\&amp;#34;&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> grep -v cdn &lt;span class="p">|&lt;/span> grep -i &lt;span class="nv">$REGION&lt;/span>&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>In this case we are skipping all te CDN endpoints, but you can add them if is necessary.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>With all the collected data, next step is use turbolift to delete the Cloud Files container and their data. To do it, I use a for-loop:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> i in &lt;span class="k">$(&lt;/span>curl -s -H &lt;span class="s2">&amp;#34;X-Auth-Token: &lt;/span>&lt;span class="nv">$TOKEN&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="nv">$ENDPOINT&lt;/span>&lt;span class="k">)&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span> turbolift -u &lt;span class="nv">$USERNAME&lt;/span> -a &lt;span class="nv">$APIKEY&lt;/span> --os-rax-auth &lt;span class="nv">$REGION&lt;/span> delete -c &lt;span class="nv">$i&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="k">done&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>Now, you have all the Data and Cloud Files containers deleted on one region.&lt;/p>
&lt;p>&amp;#x1f604;&lt;/p></description></item><item><title>My First Contribution to OpenStack project</title><link>https://luiscachog.io/my-first-contribution-to-openstack/</link><pubDate>Thu, 15 Mar 2018 00:00:00 +0000</pubDate><guid>https://luiscachog.io/my-first-contribution-to-openstack/</guid><description>&lt;p>I been working since last year using &lt;a href="https://www.ansible.com/" target="_blank" rel="noopener">Ansible&lt;/a> for fun and to trying to get prepared to become a DevOps, so I found an excelent OpenStack project called &lt;a href="https://github.com/openstack/ara" target="_blank" rel="noopener">ARA Records Ansible&lt;/a>.&lt;/p>
&lt;figure id="figure-ansible-logo">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Ansible Logo" srcset="
/media/posts/my-first-contribution-to-openstack/Ansible-Logo_hub884469535c087589ce6d86f0418926d_8020_e8654a6c9737fb6cf9a9d6a845d8f829.webp 400w,
/media/posts/my-first-contribution-to-openstack/Ansible-Logo_hub884469535c087589ce6d86f0418926d_8020_34c2626c3a799dab177de63acc44cc35.webp 760w,
/media/posts/my-first-contribution-to-openstack/Ansible-Logo_hub884469535c087589ce6d86f0418926d_8020_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://luiscachog.io/media/posts/my-first-contribution-to-openstack/Ansible-Logo_hub884469535c087589ce6d86f0418926d_8020_e8654a6c9737fb6cf9a9d6a845d8f829.webp"
width="760"
height="760"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Ansible Logo
&lt;/figcaption>&lt;/figure>
&lt;figure id="figure-ara-logo">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="ARA Logo" srcset="
/media/posts/my-first-contribution-to-openstack/ARA-Logo_hu17e4256629a5c6ba45baa8e753225cf6_37253_b02dfcb5baf4780ab653a7834a9e4c0a.webp 400w,
/media/posts/my-first-contribution-to-openstack/ARA-Logo_hu17e4256629a5c6ba45baa8e753225cf6_37253_303171032104318092c9459674593e15.webp 760w,
/media/posts/my-first-contribution-to-openstack/ARA-Logo_hu17e4256629a5c6ba45baa8e753225cf6_37253_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://luiscachog.io/media/posts/my-first-contribution-to-openstack/ARA-Logo_hu17e4256629a5c6ba45baa8e753225cf6_37253_b02dfcb5baf4780ab653a7834a9e4c0a.webp"
width="760"
height="556"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
ARA Logo
&lt;/figcaption>&lt;/figure>
&lt;p>Basically it is a project from the OpenStack community that makes it easier to understand and troubleshoot your Ansible roles and playbooks.
If you want more information, please refer to the &lt;a href="http://ara.readthedocs.io/en/latest/" target="_blank" rel="noopener">Documentation Page&lt;/a>.&lt;/p>
&lt;p>Anyhow, I just found a little bug on the Ansible Role to install ARA &lt;a href="https://opendev.org/recordsansible/ansible-role-ara" target="_blank" rel="noopener">ansible-role-ara&lt;/a> on Debian based distros and just send the patch to fix it.&lt;/p>
&lt;p>Here is the link to my &lt;a href="https://opendev.org/recordsansible/ansible-role-ara/commit/3e194e169070213c0bcfd007c97222ce318c6556" target="_blank" rel="noopener">contribution&lt;/a>.&lt;/p>
&lt;p>And, as I am proud of my first commit on a big project here is the screenshot too:&lt;/p>
&lt;figure id="figure-first-openstack-contrib">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="My First OpenStack Contribution" srcset="
/media/posts/my-first-contribution-to-openstack/OpenStack-Contribution_hue50cae8c9a4f3ce2cc82fba8663fd3f2_54865_0af5728d9b6f3d8f558a246cb97b792f.webp 400w,
/media/posts/my-first-contribution-to-openstack/OpenStack-Contribution_hue50cae8c9a4f3ce2cc82fba8663fd3f2_54865_6aa243ac01ede5843567d9273ddd14a0.webp 760w,
/media/posts/my-first-contribution-to-openstack/OpenStack-Contribution_hue50cae8c9a4f3ce2cc82fba8663fd3f2_54865_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://luiscachog.io/media/posts/my-first-contribution-to-openstack/OpenStack-Contribution_hue50cae8c9a4f3ce2cc82fba8663fd3f2_54865_0af5728d9b6f3d8f558a246cb97b792f.webp"
width="748"
height="699"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
My First OpenStack Contribution
&lt;/figcaption>&lt;/figure>
&lt;p>I feel happy and motivated to still learn about this Open-Source project and a lot more.&lt;/p>
&lt;p>&amp;#x1f604;&lt;/p></description></item><item><title>Deployment de un sitio estatico con Hugo y Git Hooks</title><link>https://luiscachog.io/deployment-hugo-site-git-hooks/</link><pubDate>Mon, 05 Mar 2018 00:00:00 +0000</pubDate><guid>https://luiscachog.io/deployment-hugo-site-git-hooks/</guid><description>&lt;details class="toc-inpage d-print-none " open>
&lt;summary class="font-weight-bold">Table of Contents&lt;/summary>
&lt;nav id="TableOfContents">
&lt;ul>
&lt;li>&lt;a href="#motivación">Motivación&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#consideraciones">Consideraciones&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#instruciones">Instruciones&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#consideraciones-técnicas">Consideraciones técnicas&lt;/a>&lt;/li>
&lt;li>&lt;a href="#autenticación-mediante-llaves-ssh">Autenticación mediante llaves SSH&lt;/a>&lt;/li>
&lt;li>&lt;a href="#configuración-sitio-con-hugo">Configuración sitio con Hugo&lt;/a>&lt;/li>
&lt;li>&lt;a href="#configuración-del-repositorio-git-en-el-servidor-de-desarrollo-1ra-parte">Configuración del repositorio Git en el servidor de desarrollo 1ra parte&lt;/a>&lt;/li>
&lt;li>&lt;a href="#configuración-del-repositorio-git-en-el-servidor-productivo">Configuración del repositorio Git en el servidor productivo&lt;/a>&lt;/li>
&lt;li>&lt;a href="#configuración-del-repositorio-git-en-el-servidor-de-desarrollo-2da-parte">Configuración del repositorio Git en el servidor de desarrollo 2da parte&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/nav>
&lt;/details>
&lt;h2 id="motivación">Motivación&lt;/h2>
&lt;p>Estoy intentando escribir un poco más en mi blog, ya que noté que muchas veces no lo hacia muy a menudo
por que al llegar a la consola de administración de Wordpress, habia que dar bastantes clicks para llegar al menu de &amp;ldquo;Posts&amp;rdquo;,
además de que cada vez que entraba había un plugin diferente que actualizar, y verificar que nada se rompiera con
las nuevas actualizaciónes, en pocas palabras hay que darle bastante mantenimiento a un sitio con Wordpress,
y además de eso había que dedicarse a escribir el post.&lt;/p>
&lt;p>Otra razón por lo que opté hacer el cambio de plataforma, es que al estar tratando de convertirme en DevOps, es necesario,
desde mi punto de vista; tratar automatizar/scriptear la mayoria de tus tareas que realizas día a día, y con &lt;a href="https://gohugo.io/" title="Hugo" target="_blank" rel="noopener">Hugo&lt;/a> considero que se puede realizar este objetivo también.&lt;/p>
&lt;h3 id="consideraciones">Consideraciones&lt;/h3>
&lt;p>Una vez que decidí migrarme de Wordpress, el siguiente paso era decidir a que plataforma mudarme.
De entrada la plataforma que queria probar era un &lt;a href="https://en.wikipedia.org/wiki/Static_web_page" target="_blank" rel="noopener">Static Site Generator&lt;/a>,
aqui otro &lt;a href="https://cloudcannon.com/blog/what-is-a-static-website/" target="_blank" rel="noopener">link&lt;/a> de por que usar un Static Site Generator.&lt;/p>
&lt;p>Partiendo de lo anterior, las opciones que me parecieron interesantes fueron:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://gohugo.io" target="_blank" rel="noopener">Hugo&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://jekyllrb.com" target="_blank" rel="noopener">Jekyll&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://octopress.org/" target="_blank" rel="noopener">Octopress&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://hexo.io/" target="_blank" rel="noopener">Hexo&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Cada una de las opciones tiene diferentes caracteristicas, que no vamos a discutir en este post,
sin embargo las carteristicas que me convencieron de usar &lt;a href="https://gohugo.io/" title="Hugo" target="_blank" rel="noopener">Hugo&lt;/a> por encima de las otras alternativas fueron:&lt;/p>
&lt;ul>
&lt;li>Consta solamente de un binario, que comparado con las otras posibilidades hay que instalar todo un ambiente de desarrollo/producción.&lt;/li>
&lt;li>Es bastante rápido.&lt;/li>
&lt;li>Es Multi-plataforma&lt;/li>
&lt;li>Tiene diversos &lt;a href="https://themes.gohugo.io/" target="_blank" rel="noopener">temas&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="instruciones">Instruciones&lt;/h2>
&lt;h3 id="consideraciones-técnicas">Consideraciones técnicas&lt;/h3>
&lt;p>El ambiente consta de:&lt;/p>
&lt;ul>
&lt;li>1 servidor productivo donde esta instalado hugo, git y un servidor web (apache o nginx) , haremos todos los deployments usando el usuario admin, ojo que no es el usuario root.&lt;/li>
&lt;li>1 servidor/equipo de desarrollo, de igual forma que cuenta con hugo y git, en mi caso, es mi computadora personal y mi usuario es luiscachog.&lt;/li>
&lt;li>1 cuenta de &lt;a href="https://github.com" target="_blank" rel="noopener">github.com&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="autenticación-mediante-llaves-ssh">Autenticación mediante llaves SSH&lt;/h3>
&lt;p>El primer paso es realizar el intercambio de llaves SSH entre el equipo de desarrollo y el equipo productivo. Para ello seguimos los siguientes pasos:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Generar la llave SSH, tendrás que contestar algunas preguntas, entre las cuales está si quieres ponerle un password, a lo cual deberas dejarlo en blanco para que no te pida contraseña.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ ssh-keygen
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Copiar la llave SSH hacia el equipo productivo:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ ssh-copy-id admin@IP_servidor_productivo
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Verificar que te puedas conectar desde tu servidor de desarrollo, con tu usuario al servidor productivo, con el usuario que realizará los deployments.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ ssh admin@162.125.2.30 hostname
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>En este caso, debera de mostrarte el hostname del servidor productivo sin pedirte el password.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h3 id="configuración-sitio-con-hugo">Configuración sitio con Hugo&lt;/h3>
&lt;p>El siguiente paso es configurar nuestro ambiente de desarrollo con Hugo y Git.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Para instalar ambos en Ubuntu o derivados debes de ejecutar:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ sudo apt install hugo git
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Para tener la version más actualizada de hugo puedes seguir los pasos descritos en este &lt;a href="https://gohugo.io/getting-started/installing/" target="_blank" rel="noopener">link&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Vamos a crear un directorio de trabajo para nuestro sitio estatico&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ mkdir ~/sites
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ &lt;span class="nb">cd&lt;/span> ~/sites
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Crearemos un nuevo sitio usando el comando hugo&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ hugo new site luiscachog.io
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Congratulations! Your new Hugo site is created in /home/luiscachog/sites/luiscachog.io.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Just a few more steps and you&lt;span class="err">&amp;#39;&lt;/span>re ready to go:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1.- Download a theme into the same-named folder.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Choose a theme from https://themes.gohugo.io/, or
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> create your own with the &lt;span class="s2">&amp;#34;hugo new theme &amp;lt;THEMENAME&amp;gt;&amp;#34;&lt;/span> command.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2.- Perhaps you want to add some content. You can add single files
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> with &lt;span class="s2">&amp;#34;hugo new &amp;lt;SECTIONNAME&amp;gt;/&amp;lt;FILENAME&amp;gt;.&amp;lt;FORMAT&amp;gt;&amp;#34;&lt;/span>.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3.- Start the built-in live server via &lt;span class="s2">&amp;#34;hugo server&amp;#34;&lt;/span>.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Visit https://gohugo.io/ &lt;span class="k">for&lt;/span> quickstart guide and full documentation.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Cuando termine de correr el comando se podra apreciar los siguientes directorios y archivos&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ &lt;span class="nb">cd&lt;/span> luiscachog.io
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ ls
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">archetypes config.toml content data layouts static themes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ tree
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── archetypes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│   └── default.md
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── config.toml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── content
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── layouts
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── static
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└── themes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">6&lt;/span> directories, &lt;span class="m">2&lt;/span> files
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>El siguiente paso es agregar un tema, puedes encontrar uno que te guste en &lt;a href="https://themes.gohugo.io/" target="_blank" rel="noopener">https://themes.gohugo.io/&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">git init
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git submodule add https://github.com/budparr/gohugo-theme-ananke.git themes/ananke
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Edit your config.toml configuration file&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># and add the new theme.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;theme = &amp;#34;ananke&amp;#34;&amp;#39;&lt;/span> &amp;gt;&amp;gt; config.toml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Como recomendación adicional en este paso, puedes realizar un fork del tema que te guste en github para poder realizar modificaciones y proponer cambios al mismo,
contribuyendo de esa forma a su desarrollo, para hacerlo, sigue los pasos:&lt;/p>
&lt;ol>
&lt;li>Realizar un fork del tema, sigue esta &lt;a href="https://docs.github.com/en/get-started/quickstart/contributing-to-projects" target="_blank" rel="noopener">guia&lt;/a> para hacerlo.&lt;/li>
&lt;li>Al realizar el fork, tendras en tus repositorios de github el tema que quieras, por lo que tendras que ejecutar los mismos comandos del punto anterior,
pero el repositorio del tema apuntara a tu usario en github&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">git init
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git submodule add https://github.com/luiscachog/gohugo-theme-ananke.git themes/ananke
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Edit your config.toml configuration file&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># and add the new theme.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;theme = &amp;#34;ananke&amp;#34;&amp;#39;&lt;/span> &amp;gt;&amp;gt; config.toml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Vamos a crear un post de prueba para verificar que todo esta funcionando correctamente&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">hugo new posts/my-first-post.md
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;Hola Mundo&amp;#34;&lt;/span> &amp;gt;&amp;gt; content/posts/my-first-post.md
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>El comando anterior creara un archivo en la ruta content/posts/my-first-post.md, y el contenido será:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">title&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;My First Post&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="ld">2018-02-28T12:02:38&lt;/span>&lt;span class="m">-06&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">00&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">draft&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="l">Hola Mundo!!!&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Finalmente, probaremos que nuestro sitio estatico con nuestro post se muestren de manera local, en nuestro servidor de desarrollo.
Cabe mencionar, que por defecto el comando &amp;lsquo;hugo server&amp;rsquo; no mostrará los posts que tengan la opción &amp;lsquo;draft: true&amp;rsquo;, por ello se agrega la bandera -D&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ hugo server -D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;h3 id="configuración-del-repositorio-git-en-el-servidor-de-desarrollo-1ra-parte">Configuración del repositorio Git en el servidor de desarrollo 1ra parte&lt;/h3>
&lt;p>En el paso pasado, realizamos la inicialización del repositorio dentro del directorio del sitio estatico:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ &lt;span class="nb">pwd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/home/luiscachog/sites/luiscachog.io
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ git status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">On branch master
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Initial commit
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Changes to be committed:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">(&lt;/span>use &lt;span class="s2">&amp;#34;git rm --cached &amp;lt;file&amp;gt;...&amp;#34;&lt;/span> to unstage&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> new file: .gitmodules
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> new file: themes/ananke
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Untracked files:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">(&lt;/span>use &lt;span class="s2">&amp;#34;git add &amp;lt;file&amp;gt;...&amp;#34;&lt;/span> to include in what will be committed&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> archetypes/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> config.toml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> content/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> themes/ananke/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Ahora, para tener el repositorio publico, tenemos que &lt;a href="https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-new-repository" target="_blank" rel="noopener">crear&lt;/a> el repositorio
en &lt;a href="https://github.com" target="_blank" rel="noopener">github.com&lt;/a> y configurarlo como un repositorio remoto&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ git add *
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ git commit -m &lt;span class="s2">&amp;#34;First commit&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ git remote add origin https://github.com/luiscachog/luiscachog.io
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ git push -u origin master
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="configuración-del-repositorio-git-en-el-servidor-productivo">Configuración del repositorio Git en el servidor productivo&lt;/h3>
&lt;p>Para poder ocupar los hooks de git es necesario hacer una primera copia inicial del repositorio en el que vamos a trabajar, con la particularidad de que el repositorio clonado debe ser del tipo &lt;a href="http://www.saintsjd.com/2011/01/what-is-a-bare-git-repository/" target="_blank" rel="noopener">bare&lt;/a>.&lt;/p>
&lt;p>En nuestro servidor productivo haremos:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">admin@prod-server:~$ mkdir sites
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">admin@prod-server:~$ &lt;span class="nb">cd&lt;/span> sites
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">admin@prod-server:~$ git clone --bare https://github.com/luiscachog/luiscachog.io luiscachog.io.git
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="configuración-del-hook">Configuración del hook&lt;/h4>
&lt;ol>
&lt;li>
&lt;p>Ya que tenemos nuestro repositorio tipo bare en el servidor productivo vamos a crear el script que mandará a llamar el hook de git.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">admin@prod-server:~$ &lt;span class="nb">cd&lt;/span> sites/luiscachog.io.git/hooks
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">admin@prod-server:~$ vim post-update
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Y agregamos algo asi:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">GIT_REPO&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$HOME&lt;/span>/luiscachog.io.git
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">WORKING_DIRECTORY&lt;/span>&lt;span class="o">=&lt;/span>/var/www/vhosts/luiscachog.io/working_hugo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">PUBLIC_WWW&lt;/span>&lt;span class="o">=&lt;/span>/var/www/vhosts/luiscachog.io/public_html
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">BACKUP_WWW&lt;/span>&lt;span class="o">=&lt;/span>/var/www/vhosts/luiscachog.io/backup_html
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">MY_DOMAIN&lt;/span>&lt;span class="o">=&lt;/span>luiscachog.io
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">set&lt;/span> -e
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rm -rf &lt;span class="nv">$WORKING_DIRECTORY&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rsync -aqz &lt;span class="nv">$PUBLIC_WWW&lt;/span>/ &lt;span class="nv">$BACKUP_WWW&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">trap&lt;/span> &lt;span class="s2">&amp;#34;echo &amp;#39;A problem occurred. Reverting to backup.&amp;#39;; rsync -aqz --del &lt;/span>&lt;span class="nv">$BACKUP_WWW&lt;/span>&lt;span class="s2">/ &lt;/span>&lt;span class="nv">$PUBLIC_WWW&lt;/span>&lt;span class="s2">; rm -rf &lt;/span>&lt;span class="nv">$WORKING_DIRECTORY&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> EXIT
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone &lt;span class="nv">$GIT_REPO&lt;/span> &lt;span class="nv">$WORKING_DIRECTORY&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir -p &lt;span class="nv">$WORKING_DIRECTORY&lt;/span>/themes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rm -rf &lt;span class="nv">$PUBLIC_WWW&lt;/span>/*
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/home/admin/bin/hugo -v -s &lt;span class="nv">$WORKING_DIRECTORY&lt;/span> -d &lt;span class="nv">$PUBLIC_WWW&lt;/span> -b &lt;span class="s2">&amp;#34;http://&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">MY_DOMAIN&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">trap&lt;/span> - EXIT
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Damos permisos de ejecución al script&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">admin@prod-server:~$ chmod +x post-update
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Probamos que nuestro script funcione adecuadamente:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">admin@prod-server:~$ ~/sites/luiscachog.io.git/hooks/post-update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cloning into &lt;span class="s1">&amp;#39;/var/www/vhosts/luiscachog.io/working_hugo&amp;#39;&lt;/span>...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">0&lt;/span> draft content
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">0&lt;/span> future content
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">4&lt;/span> pages created
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">0&lt;/span> paginator pages created
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">0&lt;/span> tags created
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">1&lt;/span> categories created
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">in &lt;span class="m">26&lt;/span> ms
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Podras verificar tu nuevo post en la URL de su sitio:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">http://production_domain_or_IP
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;h3 id="configuración-del-repositorio-git-en-el-servidor-de-desarrollo-2da-parte">Configuración del repositorio Git en el servidor de desarrollo 2da parte&lt;/h3>
&lt;p>Una vez tenemos configurado nuestro repositorio en el servidor de producción, procedemos a agregarlo como repositorio remoto en nuestro servidor de desarrollo&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ &lt;span class="nb">cd&lt;/span> /home/luiscachog/sites/luiscachog.io
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ git remote add prod admin@IP_servidor_productivo:luiscachog.io
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ git ls-remote prod
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">d1b0b73528ab3117170ef74e133d0194dd2bc88a HEAD
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">d1b0b73528ab3117170ef74e133d0194dd2bc88a refs/heads/master
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Puedes verificar los repositorios remotos con el comando:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ git remote -v
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">origin git@github.com:luiscachog/luiscachog.io.git &lt;span class="o">(&lt;/span>fetch&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">origin git@github.com:luiscachog/luiscachog.io.git &lt;span class="o">(&lt;/span>push&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">prod admin@IP_servidor_productivo:luiscachog.io.git &lt;span class="o">(&lt;/span>fetch&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">prod admin@IP_servidor_productivo:luiscachog.io.git &lt;span class="o">(&lt;/span>push&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Ahora cada vez que realizemos un push hacia el remote llamado &amp;lsquo;prod&amp;rsquo; se llamara la función del hook.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ &lt;span class="nb">cd&lt;/span> /home/luiscachog/sites/luiscachog.io
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ hugo new posts/Testing-Deployment.md
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;Deployment Test&amp;#34;&lt;/span> &amp;gt;&amp;gt; content/posts/Testing-Deployment.md
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ git add *
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ git commit -m &lt;span class="s1">&amp;#39;Deployment test with git hooks&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Este es el comando que hace la magia:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">luiscachog@dev-server:~$ git push prod master
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Counting objects: 3, &lt;span class="k">done&lt;/span>.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Delta compression using up to &lt;span class="m">8&lt;/span> threads.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Compressing objects: 100% &lt;span class="o">(&lt;/span>3/3&lt;span class="o">)&lt;/span>, &lt;span class="k">done&lt;/span>.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Writing objects: 100% &lt;span class="o">(&lt;/span>3/3&lt;span class="o">)&lt;/span>, &lt;span class="m">310&lt;/span> bytes &lt;span class="p">|&lt;/span> &lt;span class="m">0&lt;/span> bytes/s, &lt;span class="k">done&lt;/span>.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Total &lt;span class="m">3&lt;/span> &lt;span class="o">(&lt;/span>delta 2&lt;span class="o">)&lt;/span>, reused &lt;span class="m">0&lt;/span> &lt;span class="o">(&lt;/span>delta 0&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">remote: Cloning into &lt;span class="s1">&amp;#39;/var/www/vhosts/luiscachog.io/working_hugo&amp;#39;&lt;/span>...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">remote: &lt;span class="k">done&lt;/span>.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">remote: Cloning into &lt;span class="s1">&amp;#39;/var/www/vhosts/luiscachog.io/working_hugo/themes/hugo-future-imperfect&amp;#39;&lt;/span>...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">remote: INFO 2018/03/01 03:12:34 Using config file: /var/www/vhosts/luiscachog.io/working_hugo/config.toml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">remote: Building sites … INFO 2018/03/01 03:12:34 syncing static files to /var/www/vhosts/luiscachog.io/public_html/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">remote:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">remote: &lt;span class="p">|&lt;/span> EN
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">remote: +------------------+----+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">remote: Pages &lt;span class="p">|&lt;/span> &lt;span class="m">10&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">remote: Paginator pages &lt;span class="p">|&lt;/span> &lt;span class="m">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">remote: Non-page files &lt;span class="p">|&lt;/span> &lt;span class="m">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">remote: Static files &lt;span class="p">|&lt;/span> &lt;span class="m">3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">remote: Processed images &lt;span class="p">|&lt;/span> &lt;span class="m">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">remote: Aliases &lt;span class="p">|&lt;/span> &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">remote: Sitemaps &lt;span class="p">|&lt;/span> &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">remote: Cleaned &lt;span class="p">|&lt;/span> &lt;span class="m">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">remote:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">remote: Total in &lt;span class="m">44&lt;/span> ms
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">To admin@IP_servidor_productivo:luiscachog.io.git
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> d5b0671..cvc4dee master -&amp;gt; master
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Listo ya podemos probar nuestro sitio&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">http://luiscachog.io
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Con esto el siguiente paso que realizare es hacer el deployment de mi servidor para el blog usando Ansible.&lt;/p>
&lt;p>Nos Vemos!!!&lt;/p>
&lt;p>&lt;strong>References:&lt;/strong>
Digital Ocean blog post &lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/p>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>&lt;a href="https://www.digitalocean.com/community/tutorials/how-to-deploy-a-hugo-site-to-production-with-git-hooks-on-ubuntu-14-04" target="_blank" rel="noopener">Digital Ocean&lt;/a>&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item></channel></rss>