diff --git a/README.md b/README.md index 16c9fdf..0036c43 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +# Fork notes: + +This is a fork in order to develop some possible enhancements + # Ansible UpCloud Collection diff --git a/plugins/inventory/upcloud.py b/plugins/inventory/upcloud.py index fa10232..005b5df 100644 --- a/plugins/inventory/upcloud.py +++ b/plugins/inventory/upcloud.py @@ -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 @@ -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 + + 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"""