Tasks are run against target servers. Some Ansible documentation refers to the target servers as "hosts".
- Using the hosts parameter in your playbook (ansible-playbook command only)
- 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 (this article)
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. For example, ansible.cfg may have the following.
enable_plugins = host_list, yaml, 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.
Here is how you can run the example.yml playbook using the target systems specified in inventory.yml.
ansible-playbook example.yml --inventory /path/to/inventory.yml
In this example, --limit server1.example.com is used so that the ansible ad hoc command would only be run against server1.
Unlike the -i or --inventory command line option, when using --limit, the target server must exist in your default hosts file or your own inventory file.
Optionally, you can define host aliases in your default hosts file or your own inventory file, such as server1 and SERVER1 for server1.example.com, if you would like.
ansible all --module-name ping --limit server1.example.com
And here is a similar example using the ansible-playbook command.
ansible-playbook foo.yml --limit server1.example.com
Or, you can have a comma separated list of managed nodes.
ansible-playbook foo.yml --limit server1.example.com,server2.example.com
Or, the limit option can be used to run a play against a group of managed hosts in your inventory. In this example, the playbook will be run against the "linux" hosts in default hosts file or your own inventory file.
ansible-playbook foo.yml --limit linux
ansible-playbook foo.yml --limit "linux windows"
Or, you could create a file that contains some of the managed nodes. Let's host limit.txt contains the following.
Here is how you would run the playbook against the hosts defined in limit.txt. This is commonly used with the .retry file.
ansible-playbook foo.yml --limit @limit.txt
play_hosts can be used to store the server in a variable.
If you are running version 2.5 or higher of Ansible, fail can be used to fail a play when the -l or --limit command line option was not used, meaning the ansible_limit magic variable is not defined, like this.
- name: fail when the -l or --limit option is not used on the command line
msg: the -l or --limit option was not used on the command line
when: ansible_limit is undefined
The following magic variables can be used to output the managed hosts the play is being run against: