Inventory Files / Hosts Files in Ansible¶
An inventory file is a list of hosts and groups of hosts. These files are used to run Ansible playbooks on multiple hosts at a time.
Table of Contents¶
- Defining an Inventory using a Hosts File
- Example Host Files
- Testing a Hosts File
- Specifying Different Groups of Hosts (Grouping Hosts)
- View the Inventory in
yamlorjsonformat
Defining an Inventory using a Hosts File¶
You can use a hosts file to define a group of hosts.
By default, Ansible looks for /etc/ansible/hosts for the inventory file.
Specify an inventory file by using the -i option when running an Ansible command.
The file can be in ini format (most common) or yaml format.
-
hosts.ini: -
hosts.yaml:
Example Host Files¶
Using ini¶
Using ini format, hosts.ini:
# File: hosts.ini
# Define individual hosts
webserver ansible_host=192.168.1.10 ansible_user=ubuntu ansible_ssh_private_key_file=~/.ssh/id_rsa
dbserver ansible_host=192.168.1.20 ansible_user=root
# Define groups
[webservers]
web1 ansible_host=192.168.1.11
web2 ansible_host=192.168.1.12
[databases]
db1 ansible_host=192.168.1.21
db2 ansible_host=192.168.1.22
# Nested groups. The parent group will contain all hosts in all its child groups.
[all_servers:children]
webservers
databases
# Group variables (applied to all hosts in the group)
[webservers:vars]
ansible_user=deploy
ansible_port=2222
Host Entries:¶
Each line specifies a hostname or alias (e.g., webserver) and optional connection variables.
ansible_host: IP or domain name of the host.ansible_user: User to connect as.ansible_ssh_private_key_file: Path to the SSH private key.
Groups:¶
Group hosts together using descriptive names, like [webservers] or [databases].
Create nested groups with the :children suffix.
[all_servers:children] makes webservers and databases groups children of the all_servers group.
Group Variables:¶
Use the :vars suffix to define variables applied to all hosts in the group.
[webservers:vars] applies the variables to all hosts in the webservers group.
Using yaml¶
Using yaml format, hosts.yml:
# File: hosts.yml
all:
children:
webservers:
hosts:
web1:
ansible_host: 192.168.1.11
ansible_user: deploy
web2:
ansible_host: 192.168.1.12
databases:
hosts:
db1:
ansible_host: 192.168.1.21
ansible_user: root
yaml uses a nested structure.
all: The top-level group containing all hosts and subgroups.children: Subgroups under the all group.hosts: List of hosts with their variables.
Testing a Hosts File¶
Test the inventory you've specified by using ansible servers.
You can see how Ansible looks at your hosts file:
ansible-inventory -i /path/to/hosts --list
ansible-inventory -i /path/to/hosts --graph
# To see it in yaml format:
ansible-inventory -i /path/to/hosts --list -y
Translating an Inventory to Yaml¶
Just like checking your hosts file, you can use ansible-inventory to translate an
inventory to .yaml format.
By default, the --list option will output json.
You can also output in toml format with --toml.
Specifying Different Groups of Hosts (Grouping Hosts)¶
[servers]
controlplane
node01
[test_env]
controltest type=client
node01test type=server
[prod_env]
controlprod type=client
node01prod type=server
# Assign to a group
[non-prod:children]
servers
test_env
This makes both the servers and test_env groups part of the non-prod group.
Parent groups inherit all hosts from their children.
If I specify hosts as non-prod in a playbook, it will run on all hosts in
the servers and test_env groups.
Vizualize an Inventory¶
To see a graph of the hosts file:
We see that hosts file is interpreted by Ansible as:@all:
|--@non-prod:
| |--@servers:
| | |--controlplane
| | |--node01
| |--@test_env:
| | |--controltest
| | |--node01test
|--@prod_env:
| |--controlprod
| |--node01prod
|--@ungrouped:
View the Inventory in yaml or json format¶
You can specify the format of the output when using ansible-inventory to view the
inventory in json or yaml data.
By default, ansible-inventory --list will output in json.
Add -y/--yaml to see it in yaml format.
# View inventory in json
ansible-inventory -i hosts.ini --list
ansible-inventory -i hosts.ini --list
# For yaml format:
ansible-inventory -i hosts.ini --list --yaml
ansible-inventory -i hosts.ini --list -y
Targeting a Single Host by Limiting the Hosts with --limit¶
Using --limit, you can target a specific host by name from a hosts file.
ansible all: Targets all hosts in the inventory.-a: The argument to send to the host.
This will runecho Hello, worldonly onhost2(as it's defined inhosts.ini).
Ranges of IPs in Inventories¶
You can specify a range of IP addresses in inventory files.