6262 - public_ipv4
6363 choices:
6464 - public_ipv4
65- - private_ipv4
65+ - vpc_ipv4
66+ - vpc_ipv6
6667 - public_ipv6
6768 - hostname
6869 - id
7677 - " - C(state): The server state."
7778 - " - C(hostname): The server hostname."
7879 - " - C(public_ipv4): The server public ipv4."
79- - " - C(private_ipv4 ): The server private ipv4."
80- - " - C(public_ipv6 ): The server public ipv6."
80+ - " - C(vpc_ipv4 ): The server private ipv4."
81+ - " - C(vpc_ipv6 ): The server public ipv6."
8182 - " - C(public_dns): The server public dns."
8283 - " - C(private_dns): The server private dns."
8384 - "If the variable is not found, the host will be ignored."
100101
101102import os
102103from dataclasses import dataclass , field
103- from types import SimpleNamespace
104- from typing import List
104+ from typing import List , Optional
105105
106106from ansible .errors import AnsibleError
107+ from ansible .inventory .data import Host
107108from ansible .module_utils .basic import missing_required_lib
108109from ansible .plugins .inventory import BaseInventoryPlugin , Cacheable , Constructable
109110
111+ from ..module_utils .instance import get_instance_private_ips
112+
110113try :
111- from scaleway_core .bridge import Zone
112114 from scaleway import Client , ScalewayException
113115 from scaleway .applesilicon .v1alpha1 import ApplesiliconV1Alpha1API
114116 from scaleway .applesilicon .v1alpha1 import Server as ApplesiliconServer
115- from scaleway .baremetal .v1 import BaremetalV1API , IPVersion as BaremetalIPVersion
117+ from scaleway .baremetal .v1 import BaremetalV1API
118+ from scaleway .baremetal .v1 import IPVersion as BaremetalIPVersion
116119 from scaleway .baremetal .v1 import Server as BaremetalServer
120+ from scaleway .dedibox .v1 import DediboxV1API
121+ from scaleway .dedibox .v1 import IPVersion as DediboxIPVersion
122+ from scaleway .dedibox .v1 import ServerSummary as DediboxServer
117123 from scaleway .instance .v1 import InstanceV1API , ServerState
118124 from scaleway .instance .v1 import Server as InstanceServer
119- from scaleway .dedibox .v1 import DediboxV1API , IPVersion as DediboxIPVersion
120- from scaleway .dedibox .v1 import ServerSummary as DediboxServer
125+ from scaleway_core .bridge import Zone
121126
122127 HAS_SCALEWAY_SDK = True
123128except ImportError :
@@ -139,16 +144,17 @@ class _Filters:
139144
140145
141146@dataclass
142- class _Host :
147+ class _Host ( Host ) :
143148 id : str
144149 tags : List [str ]
145150 zone : "Zone"
146151 state : "ServerState"
147152
148153 hostname : str
149- public_ipv4 : list [str ] = field (default_factory = list )
150- private_ipv4 : list [str ] = field (default_factory = list )
151- public_ipv6 : list [str ] = field (default_factory = list )
154+ public_ipv4 : Optional [str ] = None
155+ public_ipv6 : Optional [str ] = None
156+ vpc_ipv4 : Optional [str ] = None
157+ vpc_ipv6 : Optional [str ] = None
152158
153159 # Instances-only
154160 public_dns : str | None = None
@@ -225,7 +231,6 @@ def populate(self, all_hosts: List[_Host]):
225231 self .display .warning (
226232 f"Skipping host { host .id } : Field { source } is not available."
227233 )
228- self .inventory .remove_host (SimpleNamespace (name = hostname ))
229234 should_skip = True
230235 break
231236
@@ -281,17 +286,27 @@ def _get_instances(self, client: "Client", filters: _Filters) -> List[_Host]:
281286 )
282287 )
283288
289+ # get vpc private ips
290+ vpc_ips = get_instance_private_ips (client , servers )
291+
284292 results : List [_Host ] = []
285293 for server in servers :
294+ vpc4 = None
295+ vpc6 = None
296+ if server .id in vpc_ips :
297+ vpc4 = vpc_ips [server .id ].ipv4
298+ vpc6 = vpc_ips [server .id ].ipv6
299+
286300 host = _Host (
287301 id = server .id ,
288302 tags = ["instance" , * server .tags ],
289303 zone = server .zone ,
290304 state = str (server .state ),
291305 hostname = server .hostname ,
292- public_ipv4 = [server .public_ip .address ] if server .public_ip else [],
293- private_ipv4 = [server .private_ip .address ] if server .private_ip else [],
294- public_ipv6 = [server .ipv6 .address ] if server .ipv6 else [],
306+ public_ipv4 = server .public_ip .address if server .public_ip else None ,
307+ public_ipv6 = server .ipv6 .address if server .ipv6 else None ,
308+ vpc_ipv4 = vpc4 ,
309+ vpc_ipv6 = vpc6 ,
295310 public_dns = f"{ server .id } .pub.instances.scw.cloud" ,
296311 private_dns = f"{ server .id } .priv.instances.scw.cloud" ,
297312 )
@@ -317,22 +332,21 @@ def _get_elastic_metal(self, client: "Client", filters: _Filters) -> List[_Host]
317332
318333 results : List [_Host ] = []
319334 for server in servers :
335+ ipv4 = None
336+ ipv6 = None
337+ for ip in server .ips :
338+ if ip .version == BaremetalIPVersion .I_PV4 :
339+ ipv4 = ip .address
340+ if ip .version == BaremetalIPVersion .I_PV6 :
341+ ipv6 = ip .address
320342 host = _Host (
321343 id = server .id ,
322344 tags = ["elastic_metal" , * server .tags ],
323345 zone = server .zone ,
324346 state = str (server .status ),
325347 hostname = server .name ,
326- public_ipv4 = [
327- ip .address
328- for ip in server .ips
329- if ip .version == BaremetalIPVersion .I_PV4
330- ],
331- public_ipv6 = [
332- ip .address
333- for ip in server .ips
334- if ip .version == BaremetalIPVersion .I_PV6
335- ],
348+ public_ipv4 = ipv4 ,
349+ public_ipv6 = ipv6 ,
336350 )
337351
338352 results .append (host )
@@ -362,9 +376,7 @@ def _get_apple_sillicon(self, client: "Client", filters: _Filters) -> List[_Host
362376 zone = server .zone ,
363377 state = str (server .status ),
364378 hostname = server .name ,
365- public_ipv4 = [server .ip ],
366- private_ipv4 = None ,
367- public_ipv6 = None ,
379+ public_ipv4 = server .ip ,
368380 )
369381
370382 results .append (host )
@@ -387,15 +399,16 @@ def _get_dedibox(self, client: "Client", filters: _Filters) -> List[_Host]:
387399
388400 results : List [_Host ] = []
389401 for server in servers :
390- public_ipv4 = []
391- public_ipv6 = []
392-
402+ public_ipv4 = None
403+ public_ipv6 = None
393404 for interface in server .interfaces :
394405 for ip in interface .ips :
395406 if ip .version == DediboxIPVersion .IPV4 :
396- public_ipv4 .append (ip .address )
397- elif ip .version == DediboxIPVersion .IPV6 :
398- public_ipv6 .append (ip .address )
407+ public_ipv4 = ip .address
408+ continue
409+ if ip .version == DediboxIPVersion .IPV6 :
410+ public_ipv6 = ip .address
411+ continue
399412
400413 host = _Host (
401414 id = server .id ,
@@ -404,7 +417,6 @@ def _get_dedibox(self, client: "Client", filters: _Filters) -> List[_Host]:
404417 state = str (server .status ),
405418 hostname = server .name ,
406419 public_ipv4 = public_ipv4 ,
407- private_ipv4 = None ,
408420 public_ipv6 = public_ipv6 ,
409421 )
410422 results .append (host )
0 commit comments