I have been learning from this book Fabio Alessandro Locati, published under Packt>. The example can be found at https://github.com/PacktPublishing/Learning-Ansible-2.X-Third-Edition/tree/master/Chapter03

Basics
Today I am learning on working with Inventory Files. This time we are dealing with multiple hosts. These hosts have to be placed in the inventory file. An example is pasted here. In hosts.ini, we have
[Compute]
node01.example.com
node02.example.com
[Login]
login.example.com
To run the ansible playfile
ansible-playbook -i hosts.ini firstrun.yaml
firstrun.yaml is taken from the site listed. It is to ensure the ansible user exist, accept the SSH keys and provided with sudoers rights with no password.
hosts: all
user: vagrant
tasks:
- name: Ensure ansible user exists
user:
name: ansible
state: present
comment: Ansible
become: True
- name: Ensure ansible user accepts the SSH key
authorized_key:
user: ansible
key: https://github.com/fale.keys
state: present
become: True
- name: Ensure the ansible user is sudoer with no password required
lineinfile:
dest: /etc/sudoers
state: present
regexp: '^ansible ALL\='
line: 'ansible ALL=(ALL) NOPASSWD:ALL'
validate: 'visudo -cf %s'
become: True
Regular Expressions
If you have a larger number of servers with predictable names, you may want to consider the following expression. You can save 100 lines of listing the server with the following expression
[Compute]
node[01:100].example.com
[Login]
login.example.com
Group Variables
If you wish to set a variable for the whole group, you may want to set a variable that is valid for the whole group,. A quick note from the book is that the host variables will override the group variables if the same variable is declared in both spaces.
[Compute]
node[01:100].example.com
[compute:vars]
firewalld_enabled=false
[Login]
login.example.com
Working with iterates in Ansibles. For example in a un-iterates codes below
- name: Ensure the HTTP can pass the firewall
firewalld:
name: http
state: enabled
permament: True
immediate: True
- name: Ensure the HTTPS can pass the firewall
service:
name: https
state: enabled
enabled: True
become: True
The codes can be shortened with the following with_items
- name: Ensure HTTP and HTTPS can pass the firewall
firewalld:
service: '{{ item }}'
state: enabled
permanent: True
immediate: True
become: True
with_items:
- http
- https
Using nested loops – with_nested
If you need to iterate all elements of a list with all items from other lists. For example, you may want to create multiple folderw in multiple paths
---
- hosts: all
remote_user: ansible
vars:
users:
- alice
- bob
folders:
- mail
- public_html
tasks:
- name: Ensure the users exist
user:
name: '{{ item }}'
become: True
with_items:
- '{{ users }}'
- name: Ensure the folders exist
file:
path: '/home/{{ item.0 }}/{{ item.1 }}'
state: directory
become: True
with_nested:
- '{{ users }}'
- '{{ folders }}'
Fileglobs loop – with_fileglobs
If you want to perform an action on every file present in a certain folder like copying multiples files with similar names from one folder to another, you can do the following
---
- hosts: all
remote_user: ansible
tasks:
- name: Ensure the folder /tmp/iproute2 is present
file:
dest: '/tmp/iproute2'
state: directory
become: True
- name: Copy files that start with rt to the tmp folder
copy:
src: '{{ item }}'
dest: '/tmp/iproute2'
remote_src: True
become: True
with_fileglob:
- '/etc/iproute2/rt_*'