<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ansible | Luis Cacho</title><link>https://luiscachog.io/tag/ansible/</link><atom:link href="https://luiscachog.io/tag/ansible/index.xml" rel="self" type="application/rss+xml"/><description>Ansible</description><generator>Wowchemy (https://wowchemy.com)</generator><language>en-us</language><lastBuildDate>Thu, 22 Jun 2023 00:00:00 +0000</lastBuildDate><image><url>https://luiscachog.io/media/icon_hu4fa4dbbaafd6f1b45a88958b9b4a0dd0_11007_512x512_fill_lanczos_center_3.png</url><title>Ansible</title><link>https://luiscachog.io/tag/ansible/</link></image><item><title>How to find the last element in an array using jsonpath</title><link>https://luiscachog.io/garden/find-last-element-in-array-using-jsonpath/</link><pubDate>Thu, 22 Jun 2023 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/find-last-element-in-array-using-jsonpath/</guid><description>&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="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Get Operator StartingCSV - {{ operator_name }}&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">command&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">oc get packagemanifest {{ operator_name }} -n openshift-marketplace -o jsonpath=&amp;#39;{.status.channels[-1:].currentCSV}&amp;#39;&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">changed_when&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">false&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">register&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">reg_operator_csv&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Populate an Ansible Fact from a loop</title><link>https://luiscachog.io/garden/populate-fact-from-loop/</link><pubDate>Thu, 22 Jun 2023 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/populate-fact-from-loop/</guid><description>&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="nt">tasks&lt;/span>&lt;span class="p">:&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Get list of elements from list_vars&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">set_fact&lt;/span>&lt;span class="p">:&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">my_new_list&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ my_new_list | default([]) | union([item]) }}&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">loop&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ list_vars }}&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>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Get list of elements from list_vars &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">set_fact&lt;/span>&lt;span class="p">:&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">my_new_list&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ my_new_list | default([]) + [item] }}&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">loop&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ list_vars }}&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Sum numbers over loop</title><link>https://luiscachog.io/garden/sum-numbers-over-loop/</link><pubDate>Tue, 29 Nov 2022 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/sum-numbers-over-loop/</guid><description>&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="nt">set_fact&lt;/span>&lt;span class="p">:&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">total&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ total|default(0)|int + item|int }}&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">loop&lt;/span>&lt;span class="p">:&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="m">1&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="m">4&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="m">3&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>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>- &lt;span class="nt">debug&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">var=total&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>References:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> Sum numbers over loop&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://stackoverflow.com/questions/50543108/ansible-can-i-sum-numbers-over-loop" target="_blank" rel="noopener">https://stackoverflow.com/questions/50543108/ansible-can-i-sum-numbers-over-loop&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><item><title>Ansible variable with dot in name</title><link>https://luiscachog.io/garden/ansible-variables-with-dot-in-name/</link><pubDate>Wed, 09 Mar 2022 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/ansible-variables-with-dot-in-name/</guid><description>&lt;p>Given the next variable outoput, we want to get the value for &lt;code>user_namespace.enable&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">- debug:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> msg: &amp;#34;{{ ansible_cmdline }}&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Give us:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;msg&amp;#34;: {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;BOOT_IMAGE&amp;#34;: &amp;#34;/vmlinuz-...&amp;#34;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;LANG&amp;#34;: &amp;#34;...&amp;#34;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;crashkernel&amp;#34;: &amp;#34;...&amp;#34;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;namespace.unpriv_enable&amp;#34;: &amp;#34;...&amp;#34;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;quiet&amp;#34;: ...,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;rd.lvm.lv&amp;#34;: &amp;#34;...&amp;#34;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;rhgb&amp;#34;: ...,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;ro&amp;#34;: ...,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;root&amp;#34;: &amp;#34;...&amp;#34;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;user_namespace.enable&amp;#34;: &amp;#34;1&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>To access it we need to do:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">- debug:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> msg: &amp;#34;{{ ansible_cmdline[&amp;#39;user_namespace.enable&amp;#39;] }}&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>References:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> Stackoverflow solution&lt;/li>
&lt;li>&lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup> Ansible Documentation&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://stackoverflow.com/questions/52371537/ansible-get-variable-with-dots-in-key" target="_blank" rel="noopener">https://stackoverflow.com/questions/52371537/ansible-get-variable-with-dots-in-key&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.ansible.com/ansible/latest/reference_appendices/faq.html#ansible-supports-dot-notation-and-array-notation-for-variables-which-notation-should-i-use" target="_blank" rel="noopener">https://docs.ansible.com/ansible/latest/reference_appendices/faq.html#ansible-supports-dot-notation-and-array-notation-for-variables-which-notation-should-i-use&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;/ol>
&lt;/div></description></item><item><title>Jinja Loops</title><link>https://luiscachog.io/garden/jinja-loops/</link><pubDate>Wed, 25 Aug 2021 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/jinja-loops/</guid><description>&lt;ul>
&lt;li>Initial example&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-jinja" data-lang="jinja">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">{%&lt;/span> &lt;span class="k">set&lt;/span> &lt;span class="nv">count&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span> &lt;span class="cp">%}&lt;/span>&lt;span class="x">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="x">&lt;/span>&lt;span class="cp">{%&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="nv">i&lt;/span> &lt;span class="k">in&lt;/span> &lt;span class="nv">p&lt;/span> &lt;span class="cp">%}&lt;/span>&lt;span class="x">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="x"> &lt;/span>&lt;span class="cp">{{&lt;/span> &lt;span class="nv">count&lt;/span> &lt;span class="cp">}}&lt;/span>&lt;span class="x">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="x"> &lt;/span>&lt;span class="cp">{%&lt;/span> &lt;span class="k">set&lt;/span> &lt;span class="nv">count&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nv">count&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="m">1&lt;/span> &lt;span class="cp">%}&lt;/span>&lt;span class="x">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="x">&lt;/span>&lt;span class="cp">{%&lt;/span> &lt;span class="k">endfor&lt;/span> &lt;span class="cp">%}&lt;/span>&lt;span class="x">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>Ansible example to access each item within the output of a previous command:&lt;/li>
&lt;/ul>
&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="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Gather Nodes Status&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">ansible.builtin.command&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">oc get node {{ item }} -o=jsonpath=&amp;#39;{@.metadata.name}{range @.status.conditions[*]}{@.status}{end}&amp;#39;&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">changed_when&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">false&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">loop&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ ocp_nodes.stdout_lines }}&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">register&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ocp_nodes_status&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-jinja" data-lang="jinja">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">{%&lt;/span> &lt;span class="k">set&lt;/span> &lt;span class="nv">count&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">0&lt;/span> &lt;span class="cp">%}&lt;/span>&lt;span class="x">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="x">&lt;/span>&lt;span class="cp">{%&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="nv">i&lt;/span> &lt;span class="k">in&lt;/span> &lt;span class="nv">ocp_nodes_status.results&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="nf">map&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">attribute&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;stdout_lines&amp;#39;&lt;/span>&lt;span class="o">)&lt;/span> &lt;span class="cp">%}&lt;/span>&lt;span class="x">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="x"> &lt;/span>&lt;span class="cp">{%&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="nv">j&lt;/span> &lt;span class="k">in&lt;/span> &lt;span class="nv">ocp_nodes_status.results&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="nv">count&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="nv">.stdout_lines&lt;/span> &lt;span class="cp">%}&lt;/span>&lt;span class="x">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="x"> &lt;/span>&lt;span class="cp">{{&lt;/span> &lt;span class="nv">j&lt;/span> &lt;span class="cp">}}&lt;/span>&lt;span class="x">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="x"> &lt;/span>&lt;span class="cp">{%&lt;/span> &lt;span class="k">endfor&lt;/span> &lt;span class="cp">%}&lt;/span>&lt;span class="x">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="x"> &lt;/span>&lt;span class="cp">{%&lt;/span> &lt;span class="k">set&lt;/span> &lt;span class="nv">count&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nv">count&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="m">1&lt;/span> &lt;span class="cp">%}&lt;/span>&lt;span class="x">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="x">&lt;/span>&lt;span class="cp">{%&lt;/span> &lt;span class="k">endfor&lt;/span> &lt;span class="cp">%}&lt;/span>&lt;span class="x">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Select and Sum dictionary values selecting a pattern</title><link>https://luiscachog.io/garden/ansible-sum-dict-value/</link><pubDate>Tue, 24 Aug 2021 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/ansible-sum-dict-value/</guid><description>&lt;ul>
&lt;li>The Dictionary&lt;/li>
&lt;/ul>
&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="nt">FS&lt;/span>&lt;span class="p">:&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">nom_FS&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">/appm/oracle/product&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">nom_LV&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">lv_product&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">size_FS&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">5&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">owner_FS&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">oracle&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">group_FS&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">dba&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">vg_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">vgapplis&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>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">nom_FS&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">/appm/oracle/product/12.1.0.2&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">nom_LV&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">lv_12102&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">size_FS&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">15&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">owner_FS&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">oracle&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">group_FS&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">dba&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">vg_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">vgapplis&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>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">nom_FS&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">/apps/oracle/logs&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">nom_LV&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">lvlogs&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">size_FS&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">5&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">owner_FS&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">oracle&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">group_FS&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">dba&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">vg_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">vglogs&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>The ansible tasks&lt;/li>
&lt;/ul>
&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="nt">tasks&lt;/span>&lt;span class="p">:&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Calculate with selectattr, map and sum&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">debug&lt;/span>&lt;span class="p">:&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">msg&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ FS | selectattr(&amp;#39;vg_name&amp;#39;, &amp;#39;equalto&amp;#39;, &amp;#39;vgapplis&amp;#39;) | map(attribute=&amp;#39;size_FS&amp;#39;) | list | sum }}&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>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Calculate with json_query&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">vars&lt;/span>&lt;span class="p">:&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">sum_query&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;[?vg_name==&amp;#39;vgapplis&amp;#39;].size_FS | sum(@)&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">debug&lt;/span>&lt;span class="p">:&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">msg&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ FS | json_query(sum_query) }}&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>References:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> Use select and map with Ansible&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://serverfault.com/questions/972403/use-select-and-map-with-ansible" target="_blank" rel="noopener">https://serverfault.com/questions/972403/use-select-and-map-with-ansible&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><item><title>Ansible Environment variables</title><link>https://luiscachog.io/garden/ansible-environment-vars/</link><pubDate>Thu, 19 Aug 2021 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/ansible-environment-vars/</guid><description>&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="nt">hosts&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">localhost&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">vars&lt;/span>&lt;span class="p">:&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">kubeconfig_path&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ lookup(&amp;#39;env&amp;#39;,&amp;#39;KUBECONFIG&amp;#39;) }}&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">cloudflare_email&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ lookup(&amp;#39;env&amp;#39;,&amp;#39;CF_EMAIL&amp;#39;) }}&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&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">export&lt;/span> &lt;span class="nv">CF_EMAIL&lt;/span>&lt;span class="o">=&lt;/span>&amp;lt;your_cloudflare_email&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">KUBECONFIG&lt;/span>&lt;span class="o">=&lt;/span>~/.kube/config
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ansible-playbook playbook.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>References:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>How to Inject Environment Variables into Ansible Playbooks&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://graspingtech.com/ansible-environment-variables/" target="_blank" rel="noopener">https://graspingtech.com/ansible-environment-variables/&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><item><title>ansible-docs</title><link>https://luiscachog.io/garden/ansible-docs/</link><pubDate>Tue, 10 Aug 2021 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/ansible-docs/</guid><description>&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">ansible-doc -t &amp;lt;plugin type&amp;gt; -l
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ansible-doc inventory -l
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ansible-doc -t inventory host_list
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>ansible-inventories</title><link>https://luiscachog.io/garden/ansible-inventories/</link><pubDate>Tue, 10 Aug 2021 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/ansible-inventories/</guid><description>&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">ansible-inventory -i &amp;lt;inventory file&amp;gt; --host_list
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ansible-inventory --yaml -i &amp;lt;inventory file&amp;gt; --list --output inventory.yaml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Print variable results</title><link>https://luiscachog.io/garden/ansible-print-variable-results/</link><pubDate>Tue, 10 Aug 2021 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/ansible-print-variable-results/</guid><description>&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="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Print output from a variable results using jinja&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">debug&lt;/span>&lt;span class="p">:&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">msg&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{% for result in ocp_etcd_cert_file.results %}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> {{ result.stdout }}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> {% endfor %}&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>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Another way to print a variable results&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">debug&lt;/span>&lt;span class="p">:&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">msg&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ ocp_etcd_cert_file.results | map(attribute=&amp;#39;stdout&amp;#39;) | list }}&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Using the Ansible Stat Module on a Loop</title><link>https://luiscachog.io/using-the-ansible-stat-module-on-a-loop/</link><pubDate>Sun, 12 Apr 2020 00:00:00 +0000</pubDate><guid>https://luiscachog.io/using-the-ansible-stat-module-on-a-loop/</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="#using-the-ansible-stat-module-on-a-loop">Using the Ansible stat module on a loop&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#problem">Problem&lt;/a>&lt;/li>
&lt;li>&lt;a href="#solution">Solution&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/nav>
&lt;/details>
&lt;h2 id="using-the-ansible-stat-module-on-a-loop">Using the Ansible stat module on a loop&lt;/h2>
&lt;p>Hi again, it&amp;rsquo;s been a while since I wrote something on this blog.
This time I was working on a Ansible playbook and I get this:&lt;/p>
&lt;h3 id="problem">Problem&lt;/h3>
&lt;p>I want to verify if a file exists. Depending on the registered output I want to perform some other actions.
On my specific use case, I want to use in in conjunct with the &lt;code>file&lt;/code> module to define the state on my next task.&lt;/p>
&lt;div class="mermaid">graph TD;
A(Stat over file) --> B{Does the file exists?};
B -->|Yes| C[state: file];
B -->|No| D[state: touch];
&lt;/div>
&lt;h3 id="solution">Solution&lt;/h3>
&lt;p>Here is the solution that worked for me, using &lt;code>loops&lt;/code>, &lt;code>loop_control&lt;/code>,and &lt;code>jinja2&lt;/code> filters.&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="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Stat over the files&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">stat&lt;/span>&lt;span class="p">:&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">path&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ my_loop }}&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">loop&lt;/span>&lt;span class="p">:&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">/etc/cron.allow&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">/etc/at.allow&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">loop_control&lt;/span>&lt;span class="p">:&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">loop_var&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">my_loop&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">register&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">my_stat_var&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>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Create a file if not exists&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">file&lt;/span>&lt;span class="p">:&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">path&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ item.my_loop }}&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">owner&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">root&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">group&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">root&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">mode&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">og-rwx&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">state&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ &amp;#39;file&amp;#39; if item.stat.exists else &amp;#39;touch&amp;#39; }}&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">loop&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ my_stat_var.results }}&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Basically, I&amp;rsquo;m using the new &lt;code>loop&lt;/code> &lt;a href="https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_loops.html" target="_blank" rel="noopener">syntax&lt;/a> to iterate over all the files that I want to check.&lt;/p>
&lt;p>In order to avoid some warnings about the loop using &lt;code>item&lt;/code> I implement the &lt;code>loop_control&lt;/code> and &lt;code>loop_var&lt;/code> syntax to control the loop behavior and on this specific case,
instead of using the word &lt;code>item&lt;/code> I will substitute it with the one that I define as my &lt;code>loop_var&lt;/code> in this case is called &lt;code>my_loop&lt;/code> (Remember this, I will use it on the next task).&lt;/p>
&lt;p>I&amp;rsquo;m registering the result of the stat task on a variable, for this case is &lt;code>my_stat_var&lt;/code>&lt;/p>
&lt;p>Here is an example of the output, when the 2 files &lt;strong>do not exists:&lt;/strong>&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="err">ok:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="err">instance-amazon&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="err">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;my_loop&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;changed&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;msg&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;All items completed&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;results&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&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;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;ansible_loop_var&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;my_loop&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;at_cron_restricted_touch&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;/etc/cron.allow&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;changed&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;failed&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;invocation&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;module_args&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;checksum_algorithm&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;sha1&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;follow&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;get_attributes&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;get_checksum&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;get_md5&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;get_mime&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;path&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;/etc/cron.allow&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;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;stat&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;exists&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&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;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="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;ansible_loop_var&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;my_loop&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;at_cron_restricted_touch&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;/etc/at.allow&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;changed&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;failed&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;invocation&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;module_args&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;checksum_algorithm&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;sha1&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;follow&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;get_attributes&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;get_checksum&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;get_md5&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;get_mime&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;path&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;/etc/at.allow&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;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;stat&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;exists&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&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;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="p">]&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;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>On the next task I access the results of the registered variable &lt;code>my_stat_var&lt;/code> using, according to the previous output,
I need to use the &lt;code>results&lt;/code> variable to access it and gives me 2 arrays (each one for each file)&lt;/p>
&lt;p>Also, I extract the &lt;code>path&lt;/code> from the same variable &lt;code>my_stat_var.results&lt;/code> &lt;strong>but&lt;/strong> as it is part of a loop,
I will access it using &lt;code>item.my_loop&lt;/code> as on the the second task loop I&amp;rsquo;m not using a &lt;code>loop_control&lt;/code>,
also I can access it using &lt;code>item.item&lt;/code> but I prefer the first syntax.
In case you implement a &lt;code>loop_control&lt;/code> on you can access it as &lt;code>my_second_loop.my_loop&lt;/code>&lt;/p>
&lt;p>Also, I extract if the file exists with the variable &lt;code>item.stat.exists&lt;/code> &lt;strong>but&lt;/strong> I&amp;rsquo;m putting that on a &lt;code>jinja2&lt;/code> filter, that way it will evaluate and set the correct option on the &lt;code>state&lt;/code>&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="c"># When the file exists&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">state&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">file&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="c"># When the file does not exists&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">state&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">touch&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This behavior also brings idempotency to your task, because:&lt;/p>
&lt;ul>
&lt;li>If the files does not exists on the first iteration it will be created and,&lt;/li>
&lt;li>The next time you run the tasks as the files already exists it will works as a &lt;code>stat&lt;/code> and will return the current state of &lt;code>path&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>That is all for now. See you soon!&lt;/p></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>Improve Ansible Roles with Molecule</title><link>https://luiscachog.io/talk/improve-ansible-roles-with-molecule/</link><pubDate>Thu, 07 Mar 2019 16:00:00 +0000</pubDate><guid>https://luiscachog.io/talk/improve-ansible-roles-with-molecule/</guid><description>&lt;div class="alert alert-note">
&lt;div>
Click on the &lt;strong>Slides&lt;/strong> button above to view the built-in slides feature.
&lt;/div>
&lt;/div>
&lt;p>On this talk I share some best practices to perform test driven on your Ansible Roles.&lt;/p>
&lt;p>I explain how workflow with molecule will help you to improve the development speed for your Ansible Roles.&lt;/p>
&lt;p>I show an example of how to integrate molecule on an Ansible Role that does not have it.&lt;/p></description></item><item><title>Improve Ansible Roles with Molecule</title><link>https://luiscachog.io/slides/molecule-ansible/</link><pubDate>Thu, 07 Mar 2019 00:00:00 +0000</pubDate><guid>https://luiscachog.io/slides/molecule-ansible/</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="improve-ansible-roles-with-molecule">Improve Ansible Roles with Molecule&lt;/h1>
&lt;hr>
&lt;h2 id="luis-cacho">Luis Cacho&lt;/h2>
&lt;h3 id="security-systems-administrator">Security Systems Administrator&lt;/h3>
&lt;h4 id="rackspacehttpsrackspacecom">&lt;a href="https://rackspace.com" target="_blank" rel="noopener">@Rackspace&lt;/a>&lt;/h4>
&lt;p>&lt;a href="https://luiscachog.io" target="_blank" rel="noopener">luiscachog.io&lt;/a> | &lt;a href="https://twitter.com/luiscachog" target="_blank" rel="noopener">@luiscachog&lt;/a> | &lt;a href="https://github.com/luiscachog" target="_blank" rel="noopener">github.com/luiscachog&lt;/a>&lt;/p>
&lt;hr>
&lt;section data-noprocess data-shortcode-slide
data-background-image="backgrounds/background1.jpg"
>
&lt;hr>
&lt;h2 id="agenda">Agenda&lt;/h2>
&lt;ul>
&lt;li>Ansible Review
&lt;ul>
&lt;li>YAML Review&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Test Automation
&lt;ul>
&lt;li>Testing options for Ansible&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Molecule&lt;/li>
&lt;li>Demo!!&lt;/li>
&lt;/ul>
&lt;hr>
&lt;section data-noprocess data-shortcode-slide
data-background-image="backgrounds/backgroundAnsible.png"
>
&lt;hr>
&lt;section data-shortcode-section>
&lt;h2 id="ansible-14">Ansible (1/4)&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;strong>Use Cases&lt;/strong>&lt;/th>
&lt;th>&lt;strong>Attributes&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Configuration Management&lt;/td>
&lt;td>Simple&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Software Provisioning&lt;/td>
&lt;td>Powerful&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Security and Compliance&lt;/td>
&lt;td>Agentless&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Application Deployment&lt;/td>
&lt;td>Cross Platform&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Orchestration&lt;/td>
&lt;td>Over 450 Modules&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Continuous Delivery&lt;/td>
&lt;td>Big Community&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;aside class="notes">
&lt;ul>
&lt;li>
&lt;p>Press &lt;code>S&lt;/code> key to view -
Ansible es una herramienta de automatización open-source escrita en python.
Nos ayuda a configurar hosts remotos, aprovisionar software, e inclusive orquestar tareas mas complicadas como Continuos Deployment o Rolling Updates con Cero Downtime.
En lugar de tener scripts para cada tarea.
Ansible es:&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Simple&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Poderoso&lt;/p>
&lt;/li>
&lt;li>
&lt;p>No necesita agente&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Multiplataforma&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Cuenta con mas de 450 Modulos&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Gran comunidad alrededor del proyecto&lt;/p>
&lt;/li>
&lt;/ul>
&lt;/aside>
&lt;hr>
&lt;h2 id="ansible-24">Ansible (2/4)&lt;/h2>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/molecule-ansible/AnsibleArch_hu9b05440d76c0d355a47a803f97985562_45828_6d02e9de9a6dc8768bf34eda051f62df.webp 400w,
/media/slides/molecule-ansible/AnsibleArch_hu9b05440d76c0d355a47a803f97985562_45828_6b5dc1ed0e7e68d18ae6d0c539aee3f1.webp 760w,
/media/slides/molecule-ansible/AnsibleArch_hu9b05440d76c0d355a47a803f97985562_45828_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://luiscachog.io/media/slides/molecule-ansible/AnsibleArch_hu9b05440d76c0d355a47a803f97985562_45828_6d02e9de9a6dc8768bf34eda051f62df.webp"
width="90%"
height="454"
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>Revisando la arquitectura de Ansible tenemos:&lt;/p>
&lt;ul>
&lt;li>Playbook: &amp;ldquo;El libro de jugadas&amp;rdquo; que contiene las tareas a ejecutar.&lt;/li>
&lt;li>Inventario:donde se definen los hosts con los cuales va a interactuar ansible, esta formato INI. Se definen grupos de hosts y algunas variables opcionales ()IP, hostname, ssh user, key file)&lt;/li>
&lt;li>Modulos son pequenos programas que ejecuta Ansible de manera remota.&lt;/li>
&lt;li>API: Aun esta en construccion pero hay plugins que ya la usan (ansible tower)&lt;/li>
&lt;li>Plugins: Agregan funcionabilidad adicional al core de Ansible (ARA)&lt;/li>
&lt;/ul>
&lt;p>Todo esto se se aplica a los hosts remotos o a los dispositivos de red.&lt;/p>
&lt;/aside>
&lt;hr>
&lt;h2 id="ansible-34">Ansible (3/4)&lt;/h2>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/molecule-ansible/Ansible_Playbook_hu71a4b655fa9e885678be627396d3dcbe_40547_a237b04b0a723423825c1ab98dea09b7.webp 400w,
/media/slides/molecule-ansible/Ansible_Playbook_hu71a4b655fa9e885678be627396d3dcbe_40547_65deb39ea253a26177ae0ed44ea5b6a4.webp 760w,
/media/slides/molecule-ansible/Ansible_Playbook_hu71a4b655fa9e885678be627396d3dcbe_40547_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://luiscachog.io/media/slides/molecule-ansible/Ansible_Playbook_hu71a4b655fa9e885678be627396d3dcbe_40547_a237b04b0a723423825c1ab98dea09b7.webp"
width="70%"
height="622"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;aside class="notes">
&lt;ul>
&lt;li>
&lt;p>Press &lt;code>S&lt;/code> key to view -
Los componentes de un playbook son, revisando desde la unidad mas pequena son:&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Tasks, que ejecutan el modulo de Ansible&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Al conjunto de varias tasks relacionadas, se le llama Play&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Al conjunto de diferentes Plays/jugadas se le llama Playbook.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;/aside>
&lt;hr>
&lt;h2 id="ansible-44">Ansible (4/4)&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Playbooks&lt;/strong> contain/connect &lt;strong>roles&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Roles&lt;/strong> contain &lt;strong>plays&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Plays&lt;/strong> contain &lt;strong>tasks&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Tasks&lt;/strong> execute a &lt;strong>module&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Tasks&lt;/strong> run sequencially&lt;/li>
&lt;li>&lt;strong>Handlers&lt;/strong> are triggered by &lt;strong>tasks&lt;/strong>, runs once at the end of the &lt;strong>play&lt;/strong>&lt;/li>
&lt;/ul>
&lt;aside class="notes">
&lt;ul>
&lt;li>Press &lt;code>S&lt;/code> key to view -
Entonces, podemos decir que desde la unidad mas grande tenemos
Role is a list of tasks reusable
Playbook conecta los roles con los hosts&lt;/li>
&lt;/ul>
&lt;/aside>
&lt;/section>
&lt;hr>
&lt;section data-noprocess data-shortcode-slide
data-background-image="backgrounds/backgroundTest.png"
>
&lt;aside class="notes">
&lt;ul>
&lt;li>Press &lt;code>S&lt;/code> key to view -
Por que es importante la automatizacion de pruebas?&lt;/li>
&lt;/ul>
&lt;/aside>
&lt;hr>
&lt;section data-shortcode-section>
&lt;h3 id="test-automation-12">Test Automation (1/2)&lt;/h3>
&lt;ul>
&lt;li>Reliable Code&lt;/li>
&lt;li>Quality (Fast feedback)&lt;/li>
&lt;li>Time and cost saving&lt;/li>
&lt;li>Faster Development Cycle (CI/CD)&lt;/li>
&lt;li>Repeatability (Test same change accross multiple environments (OS, Providers); multiple data sets)&lt;/li>
&lt;/ul>
&lt;aside class="notes">
&lt;ul>
&lt;li>
&lt;p>Press &lt;code>S&lt;/code> key to view -
La automatizacion de las pruebas nos ayuda a:&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Tener un codigo mas seguro y confiable&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Mejora la calidad de nuestro codigo ya que permiten que se ejecuten más pruebas en menos tiempo, aumentando la cobertura de las pruebas, y realizando más exigentes.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Reducimos el tiempo y el costo de un desarrollo&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Nos ayuda a tener un ciclo de desarrollo mas rapido ya que lo podemos/debemos integrar con alguna herramienta de CI/CD&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Repetibilidad, con lo cual podemos probar el mismo cambio en multples ambientes, sistemas operativos, o provides, o con diferentes data sets&lt;/p>
&lt;/li>
&lt;/ul>
&lt;/aside>
&lt;hr>
&lt;h3 id="test-automation-22">Test Automation (2/2)&lt;/h3>
&lt;h4 id="testing-options-for-ansible">Testing options for Ansible&lt;/h4>
&lt;ul>
&lt;span class="fragment " >
&lt;li>&lt;strong>Ansible tasks&lt;/strong>&lt;i> - Test Ansible w/ Ansible&lt;/i>&lt;/li>
&lt;/span>
&lt;span class="fragment " >
&lt;li>&lt;strong>Test Kitchen&lt;/strong>&lt;i> - Test Ansible w/ Ruby&lt;/i>&lt;/li>
&lt;/span>
&lt;span class="fragment " >
&lt;li>&lt;strong>ansible-test&lt;/strong>&lt;i> - Test Ansible w/ Unmaintained Python&lt;/i>&lt;/li>
&lt;/span>
&lt;span class="fragment " >
&lt;li>&lt;strong>Molecule&lt;/strong>&lt;i> - Test Ansible w/ Python&lt;/i>&lt;/li>
&lt;/span>
&lt;/ul>
&lt;aside class="notes">
&lt;ul>
&lt;li>Press &lt;code>S&lt;/code> key to view -
Algunas herramientas que revise, despues de ver la conferencia de Elana Hashman en en Ansible Fest 2017 son:&lt;/li>
&lt;/ul>
&lt;p>Testing Ansible with Ansible Tasks -&amp;gt; Test ansible with Ansible tasks
Benefits:&lt;/p>
&lt;ul>
&lt;li>As flexible and powerful as you need it
Issues:&lt;/li>
&lt;li>High development cost&lt;/li>
&lt;li>Ansible can&amp;rsquo;t detect ansible bugs&lt;/li>
&lt;li>Need to write your own provisioner&lt;/li>
&lt;/ul>
&lt;p>Testing Ansible with ansible-test -&amp;gt;
Benefits:&lt;/p>
&lt;ul>
&lt;li>Written in Python&lt;/li>
&lt;li>Solves the provisioning problem in &amp;ldquo;Test ansible with Ansible&amp;rdquo;&lt;/li>
&lt;li>Simple tool with small codebase
Issues:&lt;/li>
&lt;li>Onlys support docker provisioner on debian-based images&lt;/li>
&lt;li>Does not apear to be actively maintained&lt;/li>
&lt;/ul>
&lt;p>Testing Ansible with Test Kitchen -&amp;gt;
Benefits:&lt;/p>
&lt;ul>
&lt;li>Large community&lt;/li>
&lt;li>Supports Ansible&lt;/li>
&lt;li>Supportw windows testing for Ansible
Issues:&lt;/li>
&lt;li>Written in Ruby&lt;/li>
&lt;li>Verifiers are Ruby or bash based&lt;/li>
&lt;li>Installs Ansible on the target host and runs it locally&lt;/li>
&lt;/ul>
&lt;/aside>
&lt;/section>
&lt;hr>
&lt;section data-noprocess data-shortcode-slide
data-background-image="backgrounds/backgroundMolecule.png"
>
&lt;hr>
&lt;section data-shortcode-section>
&lt;h3 id="molecule-15">Molecule (1/5)&lt;/h3>
&lt;h4 id="testing-ansible-with-molecule">Testing Ansible with Molecule&lt;/h4>
&lt;ul>
&lt;li>Tool designed to aid in the development and testing of Ansible roles.&lt;/li>
&lt;li>Provides support for testing with multiple instances, operating systems, providers, test frameworks and testing scenarios.&lt;/li>
&lt;li>Encourages an approach that results in consistently developed roles that are well-written, easily understood and maintained.&lt;/li>
&lt;/ul>
&lt;p>&lt;a href="https://github.com/ansible/molecule" target="_blank" rel="noopener">github.com/ansible/molecule&lt;/a> | &lt;a href="https://molecule.readthedocs.io/" target="_blank" rel="noopener">molecule.readthedocs.io&lt;/a>&lt;/p>
&lt;aside class="notes">
&lt;ul>
&lt;li>Press &lt;code>S&lt;/code> key to view -&lt;/li>
&lt;/ul>
&lt;p>De acuerdo a la propia documentacion de Molecule, se define como una herramienta disenada para ayudar en el desarrollo y pruebas de los roles de ansible.
Brinda soporte para probar con diferentes instancias, OS, Providers, scenarios
Se enfoca en generar los mejores roles posibles, tanto bien escritos como faciles de mantener
&lt;/aside>
&lt;hr>
&lt;h3 id="molecule-25">Molecule (2/5)&lt;/h3>
&lt;h4 id="testing-ansible-with-molecule-1">Testing Ansible with Molecule&lt;/h4>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;strong>Pros&lt;/strong>&lt;/th>
&lt;th>&lt;strong>Cons&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>- Written in Python&lt;/td>
&lt;td>- No Windows support&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>- Ansible-Native&lt;/td>
&lt;td>- No Dinamyc Inventory support&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>- Established community&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>- Open-Source&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;aside class="notes">
&lt;ul>
&lt;li>Press &lt;code>S&lt;/code> key to view -&lt;/li>
&lt;li>Escrito en python,&lt;/li>
&lt;li>Desarrollado e integrado para ansible&lt;/li>
&lt;li>Comunidad Madura&lt;/li>
&lt;li>Open-Source&lt;/li>
&lt;/ul>
&lt;/aside>
&lt;hr>
&lt;h3 id="molecule-35">Molecule (3/5)&lt;/h3>
&lt;h4 id="testing-ansible-with-molecule-2">Testing Ansible with Molecule&lt;/h4>
&lt;ul>
&lt;li>Creates nodes for testing&lt;/li>
&lt;li>Run the playbook on the nodes&lt;/li>
&lt;li>Run the playbook again to test idempotence&lt;/li>
&lt;li>Lints the Ansible code with ansible-lint&lt;/li>
&lt;li>Lint the Python code with flake8&lt;/li>
&lt;li>Runs the verifier tests on the nodes to ensure the desired state&lt;/li>
&lt;/ul>
&lt;aside class="notes">
&lt;ul>
&lt;li>Press &lt;code>S&lt;/code> key to view -
A grandes rasgos las actividades que hace molecule son:&lt;/li>
&lt;li>Creamos los nodos para probar, dependiendo del provisioner puede ser Docker, Vagrant, AWS, Azure, etc&lt;/li>
&lt;li>Se ejecutaran los playbooks en los nodos creados&lt;/li>
&lt;li>Volvera a correr el playbook, para probar idempotencia, es decir, que el tarea se aplique varias veces sin cambiar el resultado de primera vez.&lt;/li>
&lt;li>Buscaran problemas de estilo en el codigo de ansible usando ansible-lint&lt;/li>
&lt;li>Buscaran problemas en el codigo de python con flake8&lt;/li>
&lt;li>El verificador realizara loas pruebas para asegurar el estado deseado&lt;/li>
&lt;/ul>
&lt;/aside>
&lt;hr>
&lt;h3 id="molecule-45">Molecule (4/5)&lt;/h3>
&lt;h4 id="testing-ansible-with-molecule-3">Testing Ansible with Molecule&lt;/h4>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/molecule-ansible/MoleculeProcess_hu0d810c2dbb019e53116861ccfaf3b4fa_79590_00a0eb31096fefab04a629dc11b92309.webp 400w,
/media/slides/molecule-ansible/MoleculeProcess_hu0d810c2dbb019e53116861ccfaf3b4fa_79590_377ed47f0999a4611fbc9ad55dccc118.webp 760w,
/media/slides/molecule-ansible/MoleculeProcess_hu0d810c2dbb019e53116861ccfaf3b4fa_79590_1200x1200_fit_q90_h2_lanczos.webp 1200w"
src="https://luiscachog.io/media/slides/molecule-ansible/MoleculeProcess_hu0d810c2dbb019e53116861ccfaf3b4fa_79590_00a0eb31096fefab04a629dc11b92309.webp"
width="50%"
height="760"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;hr>
&lt;h3 id="molecule-55">Molecule (5/5)&lt;/h3>
&lt;h4 id="testing-ansible-with-molecule-4">Testing Ansible with Molecule&lt;/h4>
&lt;ul>
&lt;li>What can I test?
&lt;ul>
&lt;li>Files exists and permissions&lt;/li>
&lt;li>Service are running&lt;/li>
&lt;li>User exists and is member of the correct groups&lt;/li>
&lt;li>Package installed&lt;/li>
&lt;li>Basic Software interaction (Test web server basic authentication)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/section>
&lt;hr>
&lt;section data-noprocess data-shortcode-slide
data-background-image="backgrounds/background1.jpg"
>
&lt;hr>
&lt;section data-shortcode-section>
&lt;h3 id="molecule-demo-13">Molecule Demo (1/3)&lt;/h3>
&lt;ul>
&lt;li>Let&amp;rsquo;s try it!!
&lt;ul>
&lt;li>Creates 2 nodes&lt;/li>
&lt;li>Converge both nodes&lt;/li>
&lt;li>Check for idempotence&lt;/li>
&lt;li>Lint the Ansible and Python code&lt;/li>
&lt;li>Verify the role against some tests&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Github Repo: &lt;a href="https://github.com/luiscachog/elastic_stack" target="_blank" rel="noopener">github.com/luiscachog/elastic_stack&lt;/a> &lt;span class="fragment " >
&lt;em>(Thanks to GaRaGeD for provide a playbook to test)&lt;/em>
&lt;/span>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="molecule-demo-23">Molecule Demo (2/3)&lt;/h3>
&lt;span class="fragment " >
&lt;h5 id="terminal-time">Terminal time!!&lt;/h5>
&lt;/span>
&lt;hr>
&lt;h3 id="molecule-demo-33">Molecule Demo (3/3)&lt;/h3>
&lt;h4 id="to-do">TO-DO&lt;/h4>
&lt;ul>
&lt;li>Ansible-Vault implementation&lt;/li>
&lt;li>Integrating Molecule into Travis CI, Circle CI, Jenkins, etc&lt;/li>
&lt;/ul>
&lt;/section>
&lt;hr>
&lt;section data-noprocess data-shortcode-slide
data-background-image="backgrounds/backgroundConclusion.jpg"
>
&lt;hr>
&lt;section data-shortcode-section>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;ul>
&lt;li>There are different testing solutions for Ansible, but Molecule is an Ansible-native and the robust option.&lt;/li>
&lt;li>Molecule allows you to create, converge, check idempotence, lint and verify your Ansible code.&lt;/li>
&lt;li>Molecule help you to create the best playbooks possible.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="questions">Questions?&lt;/h2>
&lt;p>&lt;em>Talk links, references and resources can be found at:&lt;/em> &lt;a href="https://luiscachog.io/talk/improve-ansible-roles-with-molecule" target="_blank" rel="noopener">luiscachog.io/talk/improve-ansible-roles-with-molecule&lt;/a>&lt;/p>
&lt;hr>
&lt;h2 id="thank-you">Thank you&lt;/h2>
&lt;p>&lt;em>You can find me on:&lt;/em>&lt;/p>
&lt;p>&lt;a href="mailto:luiscachog@gmail.com">luiscachog [at] gmail.com&lt;/a> | &lt;a href="https://luiscachog.io" target="_blank" rel="noopener">luiscachog.io&lt;/a> | &lt;a href="https://github.com/luiscachog" target="_blank" rel="noopener">github.com/luiscachog&lt;/a> | &lt;a href="https://twitter.com/luiscachog" target="_blank" rel="noopener">@luiscachog&lt;/a>&lt;/p>
&lt;/section></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></channel></rss>