After testing several SMCs (Software configuration management), we have decided to choose Ansible as it is the most lightweight option and does not require a client-server implementation.
So, let’s get started and see how it works.
We set up ansible on the local machine. Personally, I am using Fedora release 22.
1 | <span class="pln"><span class="pln">dnf install ansible</span></span> |
DNFÂ is a new package manager, designed to replace yum.
The simplest thing Ansible can do, is running commands on servers. To do this, let’s write in the command line:
1 | <span class="pln"><span class="pln">ansible all </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">i inventories</span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">test</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">ini </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">u roman </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">m ping</span></span> |
all  a command running for servers in the inventory file
-i   a path to the inventory file
-u   a user, under which we will access the servers
-m  module
You can also run any arbitrary command:
1 | <span class="pln"><span class="pln">ansible all </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">i inventories</span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">test</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">ini </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">u roman </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">a </span></span><span class="str"><span class="str">'date'</span></span> |
Displaying:
62.244.31.234 | success | rc=0 >>Â
Wed Jun 29 06:20:19 EDT 2015Â
62.244.31.235 | success | rc=0 >>
Wed Jun 29 06:20:19 EDT 2015
-a arbitrary command
The inventory file is a list of servers and groups
1 2 3 4 5 6 | <span class="pln"><span class="pln">cat inventories</span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">test</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">ini </span></span><span class="pun"><span class="pun">[</span></span><span class="pln"><span class="pln">test1</span></span><span class="pun"><span class="pun">]</span></span> <span class="lit"><span class="lit">62.244</span></span><span class="pun"><span class="pun">.</span></span><span class="lit"><span class="lit">31.234</span></span> <span class="pun"><span class="pun">[</span></span><span class="pln"><span class="pln">test2</span></span><span class="pun"><span class="pun">]</span></span> <span class="lit"><span class="lit">62.244</span></span><span class="pun"><span class="pun">.</span></span><span class="lit"><span class="lit">31.235</span></span> |
ip, domaine     List of Servers
test1, test2Â Â Â Â Â Groups
If you run:
1 | <span class="pln"><span class="pln">ansible test1 </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">i inventories</span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">test</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">ini </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">u roman </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">a </span></span><span class="str"><span class="str">'date'</span></span> |
You see:
62.244.31.234 | success | rc=0 >>
Wed Jun 29 06:31:10 EDT 2015
The command applies only to the servers of a certain group.
A playbook is one of the main concepts in Ansible. This is a YAML file where we specify what actions must be done on the servers
1 2 3 4 5 6 7 8 9 | <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> hosts</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> docker </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> name</span></span><span class="pun"><span class="pun">:</span></span> <span class="typ"><span class="typ">Installing</span></span> <span class="typ"><span class="typ">Docker</span></span><span class="pln"><span class="pln"> yum</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> name</span></span><span class="pun"><span class="pun">=</span></span><span class="pln"><span class="pln">docker state</span></span><span class="pun"><span class="pun">=</span></span><span class="pln"><span class="pln">latest become</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> yes </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> name</span></span><span class="pun"><span class="pun">:</span></span> <span class="typ"><span class="typ">Uninstaling</span></span> <span class="typ"><span class="typ">Software</span></span><span class="pln"><span class="pln"> yum</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> name</span></span><span class="pun"><span class="pun">=</span></span><span class="pln"><span class="pln">sendmail state</span></span><span class="pun"><span class="pun">=</span></span><span class="pln"><span class="pln">absent become</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> yes</span></span> |
In the example above we will install the docker package for docker hosts group and remove sendmail packages
name      An arbitrary designation of the task
yum        yum module
become    Switching user to superuser
If the playbook becomes large, and we need to run an action located somewhere in the end of the file,then we’d have to wait for quite a while.
To shorten the waiting time, ansible offers tags
1 2 3 4 | <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> name</span></span><span class="pun"><span class="pun">:</span></span> <span class="typ"><span class="typ">Copying</span></span><span class="pln"><span class="pln"> docker</span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">storage config copy</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> src</span></span><span class="pun"><span class="pun">={{</span></span><span class="pln"><span class="pln"> files_path </span></span><span class="pun"><span class="pun">}}/</span></span><span class="pln"><span class="pln">docker</span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">docker</span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">storage dest</span></span><span class="pun"><span class="pun">=</span></span><span class="str"><span class="str">/etc/</span></span><span class="pln"><span class="pln">sysconfig</span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">docker</span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">storage become</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> yes tags</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> copy_config</span></span> |
Write in the command line:
1 | <span class="pln"><span class="pln">ansible</span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">playbook </span></span><span class="pun"><span class="pun">--</span></span><span class="pln"><span class="pln">check inventories</span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">docker</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">yml </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">i inventory</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">ini </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">t copy_config</span></span> |
PLAY [docker] *****************************************************************
GATHERING FACTS ***************************************************************
ok: [docker_ci]
TASK: [Copying docker-storage config] *****************************************
ok: [docker_ci]
PLAY RECAP ********************************************************************
docker_ci : ok=2 changed=0 unreachable=0 failed=0
1 | <span class="pln"><span class="pln">ansible</span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">playbook </span></span><span class="pun"><span class="pun">--</span></span><span class="pln"><span class="pln">check docker</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">yml </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">i inventory</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">ini </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">t copy_config </span></span><span class="pun"><span class="pun">--</span></span><span class="pln"><span class="pln">skip</span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">tags</span></span> |
-check      Check, but do not apply changes
-t           Tag
-skip-tags    Will perform all tasks except those that are specified
Tags can be also specified as follows:
1 2 3 4 | <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> name</span></span><span class="pun"><span class="pun">:</span></span> <span class="typ"><span class="typ">Copying</span></span><span class="pln"><span class="pln"> docker</span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">storage config copy</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> src</span></span><span class="pun"><span class="pun">={{</span></span><span class="pln"><span class="pln"> files_path </span></span><span class="pun"><span class="pun">}}/</span></span><span class="pln"><span class="pln">docker</span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">docker</span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">storage dest</span></span><span class="pun"><span class="pun">=</span></span><span class="str"><span class="str">/etc/</span></span><span class="pln"><span class="pln">sysconfig</span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">docker</span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">storage become</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> yes tags</span></span><span class="pun"><span class="pun">:</span></span> <span class="pun"><span class="pun">[</span></span><span class="pln"><span class="pln">docker</span></span><span class="pun"><span class="pun">,</span></span><span class="pln"><span class="pln"> config</span></span><span class="pun"><span class="pun">]</span></span> |
Sometimes, having performed some changes, you need to restart the service. For this, ansible has handlers. Handlers are performed at the very end of the playbook, because playbook can have a lot of tasks that will restart the service
1 2 3 4 5 6 7 8 9 10 11 | <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> name</span></span><span class="pun"><span class="pun">:</span></span> <span class="typ"><span class="typ">Copying</span></span><span class="pln"><span class="pln"> nginx config </span></span><span class="kwd"><span class="kwd">template</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> src</span></span><span class="pun"><span class="pun">={{</span></span><span class="pln"><span class="pln"> templates_path </span></span><span class="pun"><span class="pun">}}/</span></span><span class="pln"><span class="pln">nginx</span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">nginx</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">conf</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">j2 dest</span></span><span class="pun"><span class="pun">=</span></span><span class="str"><span class="str">/etc/</span></span><span class="pln"><span class="pln">nginx</span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">nginx</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">conf become</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> yes notify</span></span><span class="pun"><span class="pun">:</span></span> <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> nginx restart tags</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> copy_nginx_config handlers</span></span><span class="pun"><span class="pun">:</span></span> <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> name</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> nginx restart service</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> name</span></span><span class="pun"><span class="pun">=</span></span><span class="pln"><span class="pln">nginx state</span></span><span class="pun"><span class="pun">=</span></span><span class="pln"><span class="pln">restarted become</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> yes</span></span> |
notify Specifies the name of the handler
Ansible has the variables. To omit the same values, let’s ​​define the variables:
1 2 3 4 5 6 7 | <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> hosts</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> docker vars</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> files_path</span></span><span class="pun"><span class="pun">:</span></span> <span class="str"><span class="str">/path/</span></span><span class="pln"><span class="pln">to</span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">file </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> name</span></span><span class="pun"><span class="pun">:</span></span> <span class="typ"><span class="typ">Copying</span></span><span class="pln"><span class="pln"> docker</span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">storage config copy</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> src</span></span><span class="pun"><span class="pun">={{</span></span><span class="pln"><span class="pln"> files_path </span></span><span class="pun"><span class="pun">}}/</span></span><span class="pln"><span class="pln">docker</span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">docker</span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">storage dest</span></span><span class="pun"><span class="pun">=</span></span><span class="str"><span class="str">/etc/</span></span><span class="pln"><span class="pln">sysconfig</span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">docker</span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">storage become</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> yes</span></span> |
{{}}Â Variables are defined in such brackets
Ansible has such a concept as facts, a set of information about the servers. To see the facts about a certain machine, let’s write:
1 | <span class="pln"><span class="pln">ansible test1 </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">i inventories</span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">test</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">ini </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">m setup</span></span> |
62.244.31.234 | success >> {
«ansible_facts»: {
«ansible_all_ipv4_addresses»: [
«62.244.31.234»
],
«ansible_all_ipv6_addresses»: [],
«ansible_architecture»: «x86_64»,
«ansible_bios_date»: «NA»,
«ansible_bios_version»: «NA»,
«ansible_cmdline»: {
«quiet»: true
},
«ansible_date_time»: {
«date»: «2015-08-25»,
«day»: «25»,
«epoch»: «1440503957»,
«hour»: «07»,
«iso8601»: «2015-08-25T11:59:17Z»,
«iso8601_micro»: «2015-08-25T11:59:17.235193Z»,
«minute»: «59»,
«month»: «08»,
«second»: «17»,
«time»: «07:59:17»,
«tz»: «EDT»,
«tz_offset»: «-0400»,
«weekday»: «Вторник»,
«year»: «2015»
}
……………..
Facts are collected every time Ansible runs. If you put gather_facts:no in playbook, the facts will not be collected:
1 2 3 4 5 6 7 8 9 10 | <span class="pun"><span class="pun">---</span></span> <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> hosts</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> docker gather_facts</span></span><span class="pun"><span class="pun">:</span></span> <span class="kwd"><span class="kwd">no</span></span><span class="pln"><span class="pln"> tasks</span></span><span class="pun"><span class="pun">:</span></span> <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> name</span></span><span class="pun"><span class="pun">:</span></span> <span class="typ"><span class="typ">Adding</span></span><span class="pln"><span class="pln"> epel repo copy</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> src</span></span><span class="pun"><span class="pun">={{</span></span><span class="pln"><span class="pln"> files_path </span></span><span class="pun"><span class="pun">}}/</span></span><span class="pln"><span class="pln">repo</span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">epel</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">repo dest</span></span><span class="pun"><span class="pun">={{</span></span><span class="pln"><span class="pln"> repos </span></span><span class="pun"><span class="pun">}}/</span></span><span class="pln"><span class="pln">epel</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">repo become</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> yes </span></span><span class="kwd"><span class="kwd">when</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> ansible_distribution </span></span><span class="pun"><span class="pun">==</span></span> <span class="str"><span class="str">"CentOS"</span></span> <span class="kwd"><span class="kwd">and</span></span><span class="pln"><span class="pln"> ansible_distribution_major_version </span></span><span class="pun"><span class="pun">==</span></span> <span class="str"><span class="str">"7"</span></span><span class="pln"><span class="pln"> tags</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> epel_repo</span></span> |
Let’s consider the cycles, as quite often you need to install lots of packages, which overwhelms playbook with similar tasks. For this, there is the key with_items:
1 2 3 4 5 6 7 8 | <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> name</span></span><span class="pun"><span class="pun">:</span></span> <span class="typ"><span class="typ">Installing</span></span><span class="pln"><span class="pln"> basic packages yum</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> name</span></span><span class="pun"><span class="pun">={{</span></span><span class="pln"><span class="pln"> item </span></span><span class="pun"><span class="pun">}}</span></span><span class="pln"><span class="pln"> state</span></span><span class="pun"><span class="pun">=</span></span><span class="pln"><span class="pln">latest with_items</span></span><span class="pun"><span class="pun">:</span></span> <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> mc </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> nano </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> atop </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> htop </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> iptraf</span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">ng</span></span> |
There is another option of usage, by applying several parameters:
1 2 3 4 5 6 7 | <span class="pln"><span class="pln">tasks</span></span><span class="pun"><span class="pun">:</span></span> <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> name</span></span><span class="pun"><span class="pun">:</span></span> <span class="typ"><span class="typ">Adding</span></span><span class="pln"><span class="pln"> users user</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> name</span></span><span class="pun"><span class="pun">={{</span></span><span class="pln"><span class="pln"> item</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">name </span></span><span class="pun"><span class="pun">}}</span></span><span class="pln"><span class="pln"> state</span></span><span class="pun"><span class="pun">=</span></span><span class="pln"><span class="pln">present </span></span><span class="kwd"><span class="kwd">group</span></span><span class="pun"><span class="pun">={{</span></span><span class="pln"><span class="pln"> item</span></span><span class="pun"><span class="pun">.</span></span><span class="kwd"><span class="kwd">group</span></span> <span class="pun"><span class="pun">}}</span></span><span class="pln"><span class="pln"> with_items</span></span><span class="pun"><span class="pun">:</span></span> <span class="pun"><span class="pun">-</span></span> <span class="pun"><span class="pun">{</span></span><span class="pln"><span class="pln"> name</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> testuser1</span></span><span class="pun"><span class="pun">,</span></span> <span class="kwd"><span class="kwd">group</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> test </span></span><span class="pun"><span class="pun">}</span></span> <span class="pun"><span class="pun">-</span></span> <span class="pun"><span class="pun">{</span></span><span class="pln"><span class="pln"> name</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> testuser2</span></span><span class="pun"><span class="pun">,</span></span> <span class="kwd"><span class="kwd">group</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> test </span></span><span class="pun"><span class="pun">}</span></span><span class="pln"><span class="pln"> become</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> yes</span></span> |
Also, Ansible has conditions. If the condition matches, then the task runs:
1 2 3 4 5 6 7 8 9 10 | <span class="pln"><span class="pln">tasks</span></span><span class="pun"><span class="pun">:</span></span> <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> name</span></span><span class="pun"><span class="pun">:</span></span> <span class="str"><span class="str">"shutdown Debian flavored systems"</span></span><span class="pln"><span class="pln"> command</span></span><span class="pun"><span class="pun">:</span></span> <span class="str"><span class="str">/sbin/</span></span><span class="pln"><span class="pln">shutdown </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">t now </span></span><span class="kwd"><span class="kwd">when</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> ansible_os_family </span></span><span class="pun"><span class="pun">==</span></span> <span class="str"><span class="str">"Debian"</span></span><span class="pln"><span class="pln"> tasks</span></span><span class="pun"><span class="pun">:</span></span> <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> name</span></span><span class="pun"><span class="pun">:</span></span> <span class="str"><span class="str">"shutdown CentOS 6 and 7 systems"</span></span><span class="pln"><span class="pln"> command</span></span><span class="pun"><span class="pun">:</span></span> <span class="str"><span class="str">/sbin/</span></span><span class="pln"><span class="pln">shutdown </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln">t now </span></span><span class="kwd"><span class="kwd">when</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> ansible_distribution </span></span><span class="pun"><span class="pun">==</span></span> <span class="str"><span class="str">"CentOS"</span></span> <span class="kwd"><span class="kwd">and</span></span> <span class="pun"><span class="pun">(</span></span><span class="pln"><span class="pln">ansible_distribution_major_version </span></span><span class="pun"><span class="pun">==</span></span> <span class="str"><span class="str">"6"</span></span> <span class="kwd"><span class="kwd">or</span></span><span class="pln"><span class="pln"> ansible_distribution_major_version </span></span><span class="pun"><span class="pun">==</span></span> <span class="str"><span class="str">"7"</span></span><span class="pun"><span class="pun">)</span></span> |
when    condition
Ansible also has filters:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <span class="pun"><span class="pun">---</span></span> <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> hosts</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> localhost vars</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> numbers</span></span><span class="pun"><span class="pun">:</span></span> <span class="pun"><span class="pun">[</span></span> <span class="lit"><span class="lit">4</span></span><span class="pun"><span class="pun">,</span></span> <span class="lit"><span class="lit">9</span></span><span class="pun"><span class="pun">,</span></span> <span class="lit"><span class="lit">6</span></span><span class="pun"><span class="pun">,</span></span> <span class="lit"><span class="lit">8</span></span><span class="pun"><span class="pun">,</span></span> <span class="lit"><span class="lit">2</span></span><span class="pun"><span class="pun">,</span></span> <span class="lit"><span class="lit">9</span></span> <span class="pun"><span class="pun">]</span></span><span class="pln"><span class="pln"> path</span></span><span class="pun"><span class="pun">:</span></span> <span class="str"><span class="str">/etc/</span></span><span class="pln"><span class="pln">passwd tasks</span></span><span class="pun"><span class="pun">:</span></span> <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> debug</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> msg</span></span><span class="pun"><span class="pun">={{</span></span><span class="pln"><span class="pln">numbers </span></span><span class="pun"><span class="pun">|</span></span><span class="pln"><span class="pln"> min </span></span><span class="pun"><span class="pun">}}</span></span> <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> debug</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> msg</span></span><span class="pun"><span class="pun">={{</span></span><span class="pln"><span class="pln">numbers </span></span><span class="pun"><span class="pun">|</span></span><span class="pln"><span class="pln"> max </span></span><span class="pun"><span class="pun">}}</span></span> <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> debug</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> msg</span></span><span class="pun"><span class="pun">={{</span></span><span class="pln"><span class="pln">numbers </span></span><span class="pun"><span class="pun">|</span></span><span class="pln"><span class="pln"> unique </span></span><span class="pun"><span class="pun">}}</span></span> <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> debug</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> msg</span></span><span class="pun"><span class="pun">={{</span></span> <span class="pun"><span class="pun">[</span></span><span class="str"><span class="str">'a'</span></span><span class="pun"><span class="pun">,</span></span> <span class="str"><span class="str">'b'</span></span><span class="pun"><span class="pun">,</span></span> <span class="str"><span class="str">'c'</span></span> <span class="pun"><span class="pun">]</span></span> <span class="pun"><span class="pun">|</span></span><span class="pln"><span class="pln"> random </span></span><span class="pun"><span class="pun">}}</span></span> <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> debug</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> msg</span></span><span class="pun"><span class="pun">={{</span></span><span class="pln"><span class="pln"> path </span></span><span class="pun"><span class="pun">|</span></span><span class="pln"><span class="pln"> basename </span></span><span class="pun"><span class="pun">}}</span></span> <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> debug</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> msg</span></span><span class="pun"><span class="pun">={{</span></span><span class="pln"><span class="pln"> path </span></span><span class="pun"><span class="pun">|</span></span><span class="pln"><span class="pln"> dirname </span></span><span class="pun"><span class="pun">}}</span></span> <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> debug</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> msg</span></span><span class="pun"><span class="pun">={{</span></span> <span class="str"><span class="str">"~/Documents"</span></span> <span class="pun"><span class="pun">|</span></span><span class="pln"><span class="pln"> expanduser </span></span><span class="pun"><span class="pun">}}</span></span> |
GATHERING FACTS ***************************************************************
ok: [localhost]
TASK: [debug msg={{numbers | min }}] ******************************************
ok: [localhost] => {
«msg»: «2»
}
TASK: [debug msg={{numbers | max }}] ******************************************
ok: [localhost] => {
«msg»: «9»
}
TASK: [debug msg={{numbers | unique }}] ***************************************
ok: [localhost] => {
«msg»: «[4,»
}
TASK: [debug msg=b] ***********************************************************
ok: [localhost] => {
«msg»: «a»
}
TASK: [debug msg={{ path | basename }}] ***************************************
ok: [localhost] => {
«msg»: «passwd»
}
TASK: [debug msg={{ path | dirname }}] ****************************************
ok: [localhost] => {
«msg»: «/etc»
}
TASK: [debug msg=/home/roman/Documents] ***************************************
ok: [localhost] => {
«msg»: «/home/roman/Documents»
}
min           Displays the minimum value
max          Displays the maximum value
unique        Displays the unique value
random       Displays a random value
basename     Displays the file name
dirname      Displays the directory name
expanduser   Discloses tildes
Registration of the results:
1 2 3 4 5 | <span class="pln"><span class="pln">tasks</span></span><span class="pun"><span class="pun">:</span></span> <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> shell</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> ls </span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">home </span></span><span class="kwd"><span class="kwd">register</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> home_dirs </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> debug</span></span><span class="pun"><span class="pun">:</span></span> <span class="kwd"><span class="kwd">var</span></span><span class="pun"><span class="pun">=</span></span><span class="pln"><span class="pln">home_dirs</span></span> |
TASK: [debug var=home_dirs] ***************************************************
ok: [localhost] => {
«var»: {
«home_dirs»: {
«changed»: true,
«cmd»: «ls /home»,
«delta»: «0:00:00.004283»,
«end»: «2015-08-25 16:35:28.429512»,
«invocation»: {
«module_args»: «ls /home»,
«module_name»: «shell»
},
«rc»: 0,
«start»: «2015-08-25 16:35:28.425229»,
«stderr»: «»,
«stdout»: «lost+foundnromanntestntestuser1ntestuser2»,
«stdout_lines»: [
«lost+found»,
«roman»,
«test»,
«testuser1»,
«testuser2»
],
«warnings»: [] }
}
}
Now we take the value from stdout_lines
1 2 3 4 5 6 7 8 9 | <span class="pln"><span class="pln"> tasks</span></span><span class="pun"><span class="pun">:</span></span> <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> shell</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> ls </span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">home </span></span><span class="kwd"><span class="kwd">register</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> home_dirs </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> debug</span></span><span class="pun"><span class="pun">:</span></span> <span class="kwd"><span class="kwd">var</span></span><span class="pun"><span class="pun">=</span></span><span class="pln"><span class="pln">home_dirs </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> name</span></span><span class="pun"><span class="pun">:</span></span> <span class="typ"><span class="typ">Adding</span></span><span class="pln"><span class="pln"> home dirs to cron cron</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> name</span></span><span class="pun"><span class="pun">=</span></span><span class="str"><span class="str">"Backup"</span></span><span class="pln"><span class="pln"> minute</span></span><span class="pun"><span class="pun">=</span></span><span class="str"><span class="str">"0"</span></span><span class="pln"><span class="pln"> hour</span></span><span class="pun"><span class="pun">=</span></span><span class="str"><span class="str">"6,3"</span></span><span class="pln"><span class="pln"> job</span></span><span class="pun"><span class="pun">=</span></span><span class="str"><span class="str">"backup_dir /home/{{ item }}"</span></span><span class="pln"><span class="pln"> with_items</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> home_dirs</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">stdout_lines</span></span> |
When the playbook becomes huge, you can remove pieces to other files:
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="pun"><span class="pun">---</span></span> <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> hosts</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> docker vars_files</span></span><span class="pun"><span class="pun">:</span></span> <span class="pun"><span class="pun">-</span></span> <span class="pun"><span class="pun">../</span></span><span class="pln"><span class="pln">vars</span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">basic_vars</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">yml tasks</span></span><span class="pun"><span class="pun">:</span></span> <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> include</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> includes</span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">basic</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">yml handlers</span></span><span class="pun"><span class="pun">:</span></span> <span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> include</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> includes</span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">handlers</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">yml </span></span><span class="pun"><span class="pun">-</span></span><span class="pln"><span class="pln"> include</span></span><span class="pun"><span class="pun">:</span></span><span class="pln"><span class="pln"> includes</span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">httpd_servers</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">yml</span></span> |
The inclusions are an ordinary YAML file:
1 | <span class="pln"><span class="pln">cat includes</span></span><span class="pun"><span class="pun">/</span></span><span class="pln"><span class="pln">basic</span></span><span class="pun"><span class="pun">.</span></span><span class="pln"><span class="pln">yml</span></span> |
— name: Uninstaling Software
yum: name={{ item }} state=absent
with_items:
— sendmail
— exim
— httpd
become: yes
Add comment