What is the difference between ansible_hostname vs inventory_hostname?
These two ansible internal variables sometimes confuse one for another but they’re fundamentally different. I’m Luca Berton and welcome to today’s episode of Ansible Pilot.
ansible_hostname and ansible_fqdn
Read from the target machine hostname from the facts:
ansible_hostname
read the hostname from the facts collected during thegather_facts
- Same as the
uname -n
orhostname
command-line - Need
gather_facts
enabled, otherwise theansible_facts
variable would be unavailable to use in your playbook - Same as hostname of the target host
- As this is based on the
gather_facts
step. ansible_hostname not available in ad-hoc command
inventory_hostname
Read from Ansible inventory or hosts files:
inventory_hostname
read the hostname from the inventory configuration or the hosts file. Could be different from the hostname configuration of the remote system. It could be only a name on the controller machineinventory_hostname
is always available to use in your playbook.- Could be different from the hostname of the target host
- Available for both playbook and ad-hoc command
Playbook
Let me show you the difference between ansible_hostname
vs inventory_hostname
vs ansible_fqdn
internal variables in a simple Ansible Playbook.
code
- hostnames.yml
---
- name: hostnames Playbook
hosts: all
gather_facts: true
tasks:
- name: print inventory_hostname
ansible.builtin.debug:
var: inventory_hostname
- name: print ansible_hostname
ansible.builtin.debug:
var: ansible_hostname
- name: print ansible_fqdn
ansible.builtin.debug:
var: ansible_fqdn
- inventory
foo.example.com ansible_host=192.168.0.190
[all:vars]
ansible_connection=ssh
ansible_user=devops
ansible_ssh_private_key_file=~/.ssh/id_rsa
execution
ansible-pilot $ ansible-playbook -i ansible\ statements/inventory ansible\ statements/hostnames.yml
PLAY [hostnames Playbook] *****************************************************************************
TASK [Gathering Facts] ****************************************************************************
ok: [foo.example.com]
TASK [print inventory_hostname] *******************************************************************
ok: [foo.example.com] => {
"inventory_hostname": "foo.example.com"
}
TASK [print ansible_hostname] *********************************************************************
ok: [foo.example.com] => {
"ansible_hostname": "Playbook"
}
TASK [print ansible_fqdn] *************************************************************************
ok: [foo.example.com] => {
"ansible_fqdn": "demo.example.com"
}
PLAY RECAP ****************************************************************************************
foo.example.com : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ansible-pilot $
idempotency
ansible-pilot $ ansible-playbook -i ansible\ statements/inventory ansible\ statements/hostnames.yml
PLAY [hostnames Playbook] *****************************************************************************
TASK [Gathering Facts] ****************************************************************************
ok: [foo.example.com]
TASK [print inventory_hostname] *******************************************************************
ok: [foo.example.com] => {
"inventory_hostname": "foo.example.com"
}
TASK [print ansible_hostname] *********************************************************************
ok: [foo.example.com] => {
"ansible_hostname": "Playbook"
}
TASK [print ansible_fqdn] *************************************************************************
ok: [foo.example.com] => {
"ansible_fqdn": "demo.example.com"
}
PLAY RECAP ****************************************************************************************
foo.example.com : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ansible-pilot $
before execution
ansible-pilot $ ssh [email protected]
[devops@demo ~]$ uname -a
Linux demo.example.com 4.18.0-348.el8.x86_64 #1 SMP Mon Oct 4 12:17:22 EDT 2021 x86_64 x86_64 x86_64 GNU/Linux
[devops@demo ~]$ uname -n
demo.example.com
[devops@demo ~]$ hostname
demo.example.com
[devops@demo ~]$
Conclusion
Now you know more about the Ansible internal variables ansible_hostname
, inventory_hostname
and ansible_fqdn
.
You know how to use it based on your use case.
Academy
Learn the Ansible automation technology with some real-life examples in my Udemy 300+ Lessons Video Course.
My book Ansible By Examples: 200+ Automation Examples For Linux and Windows System Administrator and DevOps
Donate
Want to keep this project going? Please donate