Tasks are run against target servers. Some Ansible documentation refers to the target servers as "hosts".
There are a few ways to run an ansible ad hoc command or the ansible-playbook command against certain target servers.
- Using the hosts parameter in your playbook (ansible-playbook command only) (this article)
- Using the when parameter in your playbook (ansible-playbook command only)
- Using the -i or --inventory command line option
- Using the --limit command line option
After a clean install of Ansible, the "inventory" directive in ansible.cfg is commented out, like this.
#inventory = /path/to/hosts
In this scenario, the default hosts file is /etc/ansible/hosts and the default hosts file is completely commented out. If you were to issue command ansible all -m ping, the following would be displayed. Likewise, if you were to uncomment the "inventory" directive in ansible.cfg without defining your inventory, the following would be displayed.
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
Typically, target servers are defined in the default hosts file or your own inventory file. Sometimes, the "inventory" directive in ansible.cfg is uncommented and updated to point to the directory where the default hosts file or your own inventory file will be located.
Additionally, Ansible uses inventory plugins to parse inventory. The ansible-doc command can be used to list the inventory plugins that can be used with the version of Ansible you are using.
~]$ ansible-doc --type inventory --list
ansible.builtin.advanced_host_list Parses a 'host list' with ranges
ansible.builtin.auto Loads and executes an inventory plugin specified in a YAML config
ansible.builtin.constructed Uses Jinja2 to construct vars and groups based on existing inventory
ansible.builtin.generator Uses Jinja2 to construct hosts and groups from patterns
ansible.builtin.host_list Parses a 'host list' string
ansible.builtin.ini Uses an Ansible INI file as inventory source
ansible.builtin.script Executes an inventory script that returns JSON
ansible.builtin.toml Uses a specific TOML file as an inventory source
ansible.builtin.yaml Uses a specific YAML file as an inventory source
For example, ansible.cfg may have the following.
[inventory]
enable_plugins = ansible.builtin.host_list, ansible.builtin.yaml, ansible.builtin.ini
For example, the yaml inventory_plugin allows you to define target servers in a YAML default hosts file or your own inventory file. For example, let's say you have a default hosts file or your own inventory file named inventory.yml that contains target systems, perhaps something like this.
windows:
hosts:
server1.example.com:
server2.example.com:
linux:
hosts:
server3.example.com:
server4.example.com:
In this example, the playbook has hosts: all, meaning the playbook would be run against "all" hosts in your default hosts file or your own inventory file.
---
- hosts: all
tasks:
- name: create /tmp/foo.txt
file:
path: /tmp/foo.txt
state: touch
...
If you were to instead use hosts: windows, the playbook would only be run against server1 and server2.
Or, if hosts: linux were used, the playbook would only be run against server3 and server4.
---
- hosts: linux
tasks:
- name: create /tmp/foo.txt
file:
path: /tmp/foo.txt
state: touch
...
Here is an example of how you could run the playbook against the target servers in two or more groups.
---
- hosts:
- linux
- windows
tasks:
- name: create /tmp/foo.txt
file:
path: /tmp/foo.txt
state: touch
...
Let's say you want to run the playbook against only the first host. In this scenario you can use - hosts: all[0] to target only the first host.
---
- hosts: all[0]
tasks:
- name: create /tmp/foo.txt
file:
path: /tmp/foo.txt
state: touch
...
The ~ character can be used to use a regular expression to match one or more target servers. In this example, the regular expression should match server2.example.com.
---
- hosts: ~.*2.*
tasks:
- name: create /tmp/foo.txt
file:
path: /tmp/foo.txt
state: touch
...
In this example, the regular expression should match each host that does not contain "2".
---
- hosts: !~.*2.*
tasks:
- name: create /tmp/foo.txt
file:
path: /tmp/foo.txt
state: touch
...
Did you find this article helpful?
If so, consider buying me a coffee over at