Radek Sprta (Posts about orchestration)https://radeksprta.eu/categories/orchestration.atom2024-01-07T02:28:55ZRadek SprtaNikolaMake Ansible Playbook Distribution Agnostichttps://radeksprta.eu/posts/make-ansible-playbook-distribution-agnostic/2017-07-25T18:53:27+02:002017-07-25T18:53:27+02:00Radek Sprta<div><p>I've been thinking about switching to a rolling distribution on my working
machine for quite some time. Because the packages in Ubuntu repositories are
just too outdated for my needs and I want to save myself the headache of PPAs.
And when <a href="https://insights.ubuntu.com/2017/04/05/growing-ubuntu-for-cloud-and-iot-rather-than-phone-and-convergence/">Ubuntu announced dropping Unity in favor of
Gnome</a>,
my mind was made up. I would use a
rolling distro on my main computer and Ubuntu 16.04 elsewhere.</p>
<h3>Unify package installation</h3>
<p>In the end, I decided to go for OpenSuse. Since I use an <a href="https://radeksprta.eu/posts/automatically-setup-computer-ansible-playbook/">Ansible playbook to
setup my machines</a>,
it would take no time to have it up an running. Or so I
thought. However, there was a little caveat. As my playbook used the apt
module to install software, it would obviously not run on OpenSuse. Luckily,
since the version 2.0, Ansible provides a platform-agnostic package manager
module. It is called simply <code>package</code>. As a result, installing packages across
different distributions is as easy as running:</p>
<div class="code"><pre class="code literal-block"><span class="nn">---</span>
<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Install packages</span>
<span class="w"> </span><span class="nt">become</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">yes</span>
<span class="w"> </span><span class="nt">package</span><span class="p">:</span>
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">git</span>
<span class="w"> </span><span class="nt">state</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">present</span>
</pre></div>
<p>Or is it?
While it may work in the case of Git, not all packages have a same name in
different Linux distributions. So you have to set up variables for those:
First of all, defaults in <code>vars/default.yml</code>:</p>
<div class="code"><pre class="code literal-block"><span class="nt">apache_package</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">apache2</span>
</pre></div>
<p>Then, for Debian family <code>vars/Debian.yml</code></p>
<div class="code"><pre class="code literal-block"><span class="nn">---</span>
<span class="nt">apache_package</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">apache2</span>
</pre></div>
<p>And for Redhat family <code>vars/Redhat.yml</code></p>
<div class="code"><pre class="code literal-block"><span class="nn">---</span>
<span class="nt">apache_package</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">httpd</span>
</pre></div>
<p>Afterwards, just include
them in your tasks:</p>
<div class="code"><pre class="code literal-block"><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">include_vars</span><span class="p">:</span><span class="w"> </span><span class="s">"{{</span><span class="nv"> </span><span class="s">item</span><span class="nv"> </span><span class="s">}}"</span>
<span class="w"> </span><span class="nt">with_first_found</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">"{{</span><span class="nv"> </span><span class="s">ansible_os_family</span><span class="nv"> </span><span class="s">}}.yml"</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">"default.yml"</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Install Apache</span>
<span class="w"> </span><span class="nt">become</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">yes</span>
<span class="w"> </span><span class="nt">package: name</span><span class="p">:</span><span class="w"> </span><span class="s">"{{</span><span class="nv"> </span><span class="s">apache_package</span><span class="nv"> </span><span class="s">}}"</span>
<span class="w"> </span><span class="nt">state</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">present</span>
</pre></div>
<p><a href="https://radeksprta.eu/posts/make-ansible-playbook-distribution-agnostic/">Read moreā¦</a> (1 min remaining to read)</p></div>