Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# Fork notes:

This is a fork in order to develop some possible enhancements

Comment on lines +1 to +4
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be removed before merging this. Maybe it would be cleaner if you used non-default branch of your fork as the source for the pull request 🤔

# Ansible UpCloud Collection


Expand Down
60 changes: 37 additions & 23 deletions plugins/inventory/upcloud.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@
- constructed
options:
plugin:
description: marks this as an instance of the "upcloud" plugin
description: The name of the UpCloud Ansible inventory plugin
required: true
choices: ["upcloud"]
choices: ["community.upcloud.upcloud"]
username:
description: UpCloud API username.
required: false
Expand Down Expand Up @@ -219,31 +219,45 @@ def _set_server_attributes(self, server):
connect_with = self.get_option("connect_with")
if connect_with == "public_ipv4":
possible_addresses = list(set(ipv4_addrs) & set(publ_addrs))
if len(possible_addresses) == 0:
raise AnsibleError(
"No available public IPv4 addresses for server {0} ({1})".format(server.uuid, server.hostname)
)
self.inventory.set_variable(server.hostname, "ansible_host", to_native(possible_addresses[0]))
elif connect_with == "public_ipv6":
if len(possible_addresses) > 0:
self.inventory.set_variable(server.hostname, "ansible_host", to_native(possible_addresses[0]))
else:
connect_with = "private_ipv4" # Fallback to private_ipv4 if not any public address was found

if connect_with == "public_ipv6":
possible_addresses = list(set(ipv6_addrs) & set(publ_addrs))
if len(possible_addresses) == 0:
raise AnsibleError(
"No available public IPv6 addresses for server {0} ({1})".format(server.uuid, server.hostname)
)
self.inventory.set_variable(server.hostname, "ansible_host", to_native(possible_addresses[0]))
if len(possible_addresses) > 0:
self.inventory.set_variable(server.hostname, "ansible_host", to_native(possible_addresses[0]))
elif connect_with == "hostname":
self.inventory.set_variable(server.hostname, "ansible_host", to_native(server.hostname))
elif connect_with == "private_ipv4":
if self.get_option("network"):
for iface in server_details.networking["interfaces"]["interface"]:
if iface.network == self.network.uuid:
self.inventory.set_variable(
server.hostname,
"ansible_host",
to_native(iface["ip_addresses"]["ip_address"][0].get("address"))
)
connect_with = self.get_option("connect_with")
if connect_with == "public_ipv4":
possible_addresses = list(set(ipv4_addrs) & set(publ_addrs))
if len(possible_addresses) > 0:
self.inventory.set_variable(server.hostname, "ansible_host", to_native(possible_addresses[0]))
else:
raise AnsibleError("You can only connect with private IPv4 if you specify a network")
connect_with = "private_ipv4" # Fallback to private_ipv4 if not any public address was found
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe we could make this fallback configurable by accepting a list as a value for connect_with: #37


if connect_with == "public_ipv6":
possible_addresses = list(set(ipv6_addrs) & set(publ_addrs))
if len(possible_addresses) > 0:
self.inventory.set_variable(server.hostname, "ansible_host", to_native(possible_addresses[0]))
elif connect_with == "hostname":
self.inventory.set_variable(server.hostname, "ansible_host", to_native(server.hostname))
elif connect_with == "private_ipv4":
for iface in server_details.networking["interfaces"]["interface"]:
if self.get_option("network"):
if iface.network != self.network.uuid:
continue
else:
if iface.get("type") != "private":
continue
self.inventory.set_variable(
server.hostname,
"ansible_host",
to_native(iface["ip_addresses"]["ip_address"][0].get("address"))
)
break

def verify_file(self, path):
"""Return if a file can be used by this plugin"""
Expand Down