Common Issue: "Gathering Facts" is really slow (FQDN lookup problem)
Like, 30 seconds kind of slow..!
I've encountered this when the system hostname is not fully-qualified, resulting in a DNS query (that seemingly times out after - you guessed it - 30 seconds) in attempt to figure out the hosts' Fully-Qualified Domain Name (FQDN).
The culprit in this case is a call to Python's socket.getfqdn()
, which can be found when Ansible is gathering the platform
facts at
You can test if this is an issue with the following terminal command:
time python -c 'import socket; print(socket.getfqdn())'
You want that to return really quickly, and should see something like:
$ time python -c 'import socket; print(socket.getfqdn())'
nrser-mbp.local
real 0m0.394s
user 0m0.015s
sys 0m0.021s
If it obviously takes a long time and you see result more like
$ time python -c 'import socket; print(socket.getfqdn())'
nrser-mbp
real 0m30.028s
user 0m0.013s
sys 0m0.008s
then it's definitely a problem and is single-handedly slowing fact gathering to a crawl.
The reason it's happening is because the system's HostName
is not fully-qualified - notice the nrser-mbp.local
output in the fast time and the nrser-mbp
in the slow one.
The remedy is to add the .local
to the HostName
:
sudo scutil --set HostName "$(scutil --get LocalHostName).local"
and you're all set!
This assumes you get something reasonable out of
scutil --get LocalHostName
... you can of course just manually stick your hostname in there too.
If you have a specific hostname/network setup where .local
doesn't make sense, you're of course going to have to do something more complicated, probably involving your local DNS resolution and/or network DNS, but the basic idea remains: get socket.getfqdn()
to go fast.
Credit where credit is due: