Implicit ‘localhost’
When you try to reference a localhost
and you don’t have it defined in inventory, Ansible will create an implicit one for you.:
- hosts: all
tasks:
- name: check that i have log file for all hosts on my local machine
stat: path=/var/log/hosts/{{inventory_hostname}}.log
delegate_to: localhost
In a case like this (or local_action
) when Ansible needs to contact a ‘localhost’ but you did not supply one, we create one for you. This host is defined with specific connection variables equivalent to this in an inventory:
...
hosts:
localhost:
vars:
ansible_connection: local
ansible_python_interpreter: "{{ansible_playbook_python}}"
This ensures that the proper connection and Python are used to execute your tasks locally.
You can override the built-in implicit version by creating a localhost
host entry in your inventory. At that point, all implicit behaviors are ignored; the localhost
in inventory is treated just like any other host. Group and host vars will apply, including connection vars, which includes the ansible_python_interpreter
setting. This will also affect delegate_to: localhost
and local_action
, the latter being an alias to the former.
Note
This host is not targetable with any group, however it will use vars from
host_vars
and from the ‘all’ group.Implicit localhost does not appear in the
hostvars
magic variable unless demanded, such as by"{{ hostvars['localhost'] }}"
.The
inventory_file
andinventory_dir
magic variables are not available for the implicit localhost as they are dependent on each inventory host.This implicit host also gets triggered by using
127.0.0.1
or::1
as they are the IPv4 and IPv6 representations of ‘localhost’.Even though there are many ways to create it, there will only ever be ONE implicit localhost, using the name first used to create it.
Having
connection: local
does NOT trigger an implicit localhost, you are just changing the connection for theinventory_hostname
.