0
votes

I am deploying several Linux hosts to an openstack environment and attempting to configure them with ansible. I'm having some difficulty with the stock dynamic inventory script from https://github.com/ansible/ansible/blob/devel/contrib/inventory/openstack.py

If I run ansible with a static hosts file, everything works fine

# inventory/static-hosts
localhost   ansible_connection=local
linweb01    ansible_host=10.1.1.101
% ansible linweb01 -m ping -i ./inventory/static-hosts \
   --extra-vars="ansible_user=setup ansible_ssh_private_key_file=/home/ian/keys/setup.key"
linweb01 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

But if I use the dynamic inventory, the host isn't found

% ansible linweb01 -m ping -i ./inventory/openstack.py \
   --extra-vars="ansible_user=setup ansible_ssh_private_key_file=/home/ian/keys/setup.key"
linweb01 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname linweb01: Name or service not known\r\n",
    "unreachable": true
}

When I run the inventory script manually, the host is found and the address returned is correct

% ./inventory/openstack.py --host linweb01
[...]
"name": "linweb01",
"networks": {},
"os-extended-volumes:volumes_attached": [],
"power_state": 1,
"private_v4": "10.1.1.101",
[...]

My guess is that the inventory script doesn't know to use the "private_v4" value for the IP address, although I can't seem to find a reference for this.

How do I get ansible to use the "private_v4" value returned by the inventory script as the "ansible_host" value for the host?

1

1 Answers

1
votes

Quick look into the code suggests that ip address is expected to be in interface_ip key:

hostvars[key] = dict(
    ansible_ssh_host=server['interface_ip'],
    ansible_host=server['interface_ip'],
    openstack=server)

If you need a workaround, you can try to add this to you group_vars/all.yml:

ansible_host: "{{ private_v4 }}"