Skip to content

Commit

Permalink
Add ability to select to prefer IPv4 addresses for ansible_ssh_host (a…
Browse files Browse the repository at this point in the history
…nsible#35584)

Currently Cloudforms can return a mix of IPv4 and IPv6 addresses in the
ipaddresses field and this mix comes in a "random" order (that is the
first entry may be IPv4 sometimes but IPv6 other times). If you wish to
always use IPv4 for the ansible_ssh_host value then this is problematic.

This change adds a new prefer_ipv4 flag which will look for the first
IPv4 address in the ipaddresses list and uses that instead of just the
first entry.
  • Loading branch information
rbywater authored and samdoran committed Feb 1, 2018
1 parent fe06704 commit 7dbcf75
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 1 deletion.
3 changes: 3 additions & 0 deletions contrib/inventory/cloudforms.ini
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ nest_tags = False
# Note: This suffix *must* include the leading '.' as it is appended to the hostname as is
# suffix = .example.org

# If true, will try and use an IPv4 address for the ansible_ssh_host rather than just the first IP address in the list
prefer_ipv4 = False

[cache]

# Maximum time to trust the cache in seconds
Expand Down
15 changes: 14 additions & 1 deletion contrib/inventory/cloudforms.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,11 @@ def read_settings(self):
else:
self.cloudforms_suffix = None

if config.has_option('cloudforms', 'prefer_ipv4'):
self.cloudforms_prefer_ipv4 = config.getboolean('cloudforms', 'prefer_ipv4')
else:
self.cloudforms_prefer_ipv4 = False

# Ansible related
try:
group_patterns = config.get('ansible', 'group_patterns')
Expand Down Expand Up @@ -362,7 +367,15 @@ def update_cache(self):

# Set ansible_ssh_host to the first available ip address
if 'ipaddresses' in host and host['ipaddresses'] and isinstance(host['ipaddresses'], list):
host['ansible_ssh_host'] = host['ipaddresses'][0]
# If no preference for IPv4, just use the first entry
if not self.cloudforms_prefer_ipv4:
host['ansible_ssh_host'] = host['ipaddresses'][0]
else:
# Before we search for an IPv4 address, set using the first entry in case we don't find any
host['ansible_ssh_host'] = host['ipaddresses'][0]
for currenthost in host['ipaddresses']:
if '.' in currenthost:
host['ansible_ssh_host'] = currenthost

# Create additional groups
for key in ('location', 'type', 'vendor'):
Expand Down

0 comments on commit 7dbcf75

Please sign in to comment.