2 Commits

Author SHA1 Message Date
8b3584fa9e Use server reference as inventory key and add ansible_host var
All checks were successful
Build and Release / Build Windows Exe (push) Successful in 10s
2026-02-06 15:51:30 -05:00
a202e267f7 Capture Production IP from Servers tab and use for flow matching
All checks were successful
Build and Release / Build Windows Exe (push) Successful in 11s
2026-02-06 15:43:06 -05:00
3 changed files with 26 additions and 10 deletions

View File

@@ -77,9 +77,8 @@ def read_servers(filename: str) -> Dict[str, Server]:
print("Warning: No 'Servers' sheet found.") print("Warning: No 'Servers' sheet found.")
return {} return {}
# keywords: reference, platform, ip address, management ip? # keywords: reference, platform, ip address, management ip, production ip
# Ruby script looked for: reference, type, alias, platform, middleware header_keywords = ['reference', 'platform', 'ip address', 'production ip']
header_keywords = ['reference', 'platform', 'ip address']
header_row_idx, col_map = find_header_row(target_sheet, header_keywords) header_row_idx, col_map = find_header_row(target_sheet, header_keywords)
@@ -98,7 +97,8 @@ def read_servers(filename: str) -> Dict[str, Server]:
# Extract data # Extract data
ref_idx = col_map.get('reference') ref_idx = col_map.get('reference')
plat_idx = col_map.get('platform') plat_idx = col_map.get('platform')
ip_idx = col_map.get('ip address') # Generic IP ip_idx = col_map.get('ip address') # Generic/Management IP
prod_ip_idx = col_map.get('production ip') # Specific Production IP
# Helper to get value # Helper to get value
def get_val(idx): def get_val(idx):
@@ -111,19 +111,29 @@ def read_servers(filename: str) -> Dict[str, Server]:
continue continue
plat = get_val(plat_idx) or 'unknown' plat = get_val(plat_idx) or 'unknown'
ip_raw = get_val(ip_idx)
# Parse Management IP
ip_raw = get_val(ip_idx)
ip_addr = None ip_addr = None
if ip_raw: if ip_raw:
ips = parse_ip(ip_raw) ips = parse_ip(ip_raw)
if ips: if ips:
ip_addr = ips[0] # Take first valid IP ip_addr = ips[0]
# Parse Production IP
prod_ip_raw = get_val(prod_ip_idx)
prod_ip_addr = None
if prod_ip_raw:
ips = parse_ip(prod_ip_raw)
if ips:
prod_ip_addr = ips[0]
s = Server( s = Server(
reference=ref, reference=ref,
hostname=ref, # Default hostname to reference hostname=ref,
platform=plat, platform=plat,
ip_address=ip_addr ip_address=ip_addr,
production_ip=prod_ip_addr
) )
servers[ref] = s servers[ref] = s

View File

@@ -20,6 +20,8 @@ def generate_inventory(servers: Dict[str, Server], flows: List[Flow]) -> Dict[st
for s in servers.values(): for s in servers.values():
if s.ip_address: if s.ip_address:
ip_to_server[s.ip_address] = s ip_to_server[s.ip_address] = s
if s.production_ip:
ip_to_server[s.production_ip] = s
# Also index by reference/hostname for DNS matches # Also index by reference/hostname for DNS matches
if s.reference: if s.reference:
ip_to_server[s.reference.lower()] = s ip_to_server[s.reference.lower()] = s
@@ -59,8 +61,8 @@ def generate_inventory(servers: Dict[str, Server], flows: List[Flow]) -> Dict[st
match_count += 1 match_count += 1
# Prepare host entry if new # Prepare host entry if new
# We use the IP as the key in inventory 'hosts' # We use the Reference/Hostname as the key in inventory 'hosts'
host_key = server.ip_address host_key = server.reference or server.hostname or server.ip_address
if host_key not in inventory_hosts: if host_key not in inventory_hosts:
host_vars = server.get_ansible_vars() host_vars = server.get_ansible_vars()

View File

@@ -6,6 +6,7 @@ class Server:
reference: str reference: str
hostname: str # This might be same as reference hostname: str # This might be same as reference
ip_address: Optional[str] = None ip_address: Optional[str] = None
production_ip: Optional[str] = None
platform: str = 'unknown' # e.g. 'Windows', 'Linux' platform: str = 'unknown' # e.g. 'Windows', 'Linux'
def get_ansible_vars(self) -> Dict[str, Any]: def get_ansible_vars(self) -> Dict[str, Any]:
@@ -22,6 +23,9 @@ class Server:
# Default ssh is usually fine, but being explicit doesn't hurt # Default ssh is usually fine, but being explicit doesn't hurt
pass pass
if self.ip_address:
vars['ansible_host'] = self.ip_address
return vars return vars
@dataclass @dataclass