Inventory
Ansible works against multiple systems in your infrastructure at the same time. You can specify a different inventory file using the -i
Hosts and Groups¶
The inventory file can be in one of many formats, depending on the inventory plugins you have. The default one is INI like.
The format for /etc/ansible/hosts is an INI-like format and looks like this:
mail.example.com
[webservers]
foo.example.com
bar.example.com
[dbservers]
one.example.com
two.example.com
three.example.com
[wwwservers]
www[01:50].example.com
A YAML version would like this
all:
hosts:
mail.example.com
children:
webservers:
hosts:
foo.example.com:
bar.example.com:
dbservers:
hosts:
one.example.com:
two.example.com:
three.example.com:
You can also select the connection type and user on a per host basis:
[targets]
localhost ansible_connection=local
other1.example.com ansible_connection=ssh ansible_user=mpdehaan
other2.example.com ansible_connection=ssh ansible_user=mdehaan
Assign Variables to hosts¶
It is easy to assign variables to hosts that will be used later in playbooks:
INI Way
[atlanta]
host1
host2
[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com
YAML Way
atlanta:
hosts:
host1:
host2:
vars:
ntp_server: ntp.atlanta.example.com
proxy: proxy.atlanta.example.com
Group of Groups and Group Variables¶
It is also possible to make groups of groups using the :children
suffix in INI or the children:
entry in YAML. You can apply variables using :vars
or vars:
[atlanta]
host1
host2
[raleigh]
host2
host3
[southeast:children]
atlanta
raleigh
[southeast:vars]
some_server=foo.southeast.example.com
halon_system_timeout=30
self_destruct_countdown=60
escape_pods=2
[usa:children]
southeast
northeast
southwest
northwest
all:
children:
usa:
children:
southeast:
children:
atlanta:
hosts:
host1:
host2:
raleigh:
hosts:
host2:
host3:
vars:
some_server: foo.southeast.example.com
halon_system_timeout: 30
self_destruct_countdown: 60
escape_pods: 2
northeast:
northwest:
southwest:
Default Groups¶
There are two default groups: all
and ungrouped
. all
contains every host. ungrouped
contains all hosts that don’t have another group aside from all.
Splitting Out Host and Group Specific Data¶
The preferred practice in Ansible is to not store variables in the main inventory file. The host and group variables can be stored in individual files relative to the inventory file. These variable files are in YAML format.
Assuming the inventory file path is /etc/ansible/hosts
:
If the host is named ‘foosball’, and in groups ‘raleigh’ and ‘webservers’, variables in YAML files at the following locations will be made available to the host:
/etc/ansible/group_vars/raleigh # can optionally end in '.yml', '.yaml', or '.json'
/etc/ansible/group_vars/webservers
/etc/ansible/host_vars/foosball
For instance, suppose you have hosts grouped by datacenter, and each datacenter uses some different servers. The data in the groupfile ‘/etc/ansible/group_vars/raleigh’ for the ‘raleigh’ group might look like:
---
ntp_server: acme.example.org
database_server: storage.example.org
It is okay if these files do not exist, as this is an optional feature.
As an advanced use case, you can create directories named after your groups or hosts, and Ansible will read all the files in these directories. An example with the ‘raleigh’ group:
/etc/ansible/group_vars/raleigh/db_settings
/etc/ansible/group_vars/raleigh/cluster_settings