39 lines
		
	
	
	
		
			919 B
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
	
		
			919 B
		
	
	
	
		
			Python
		
	
	
	
	
	
| from ipaddress import ip_address
 | |
| from collections import OrderedDict
 | |
| 
 | |
| def sorted_hostnames(hostnames):
 | |
|     return sorted(
 | |
|         hostnames,
 | |
|         key=lambda e: (len(e.split('.')), e),
 | |
|     )
 | |
| 
 | |
| def sorted_hosts_for_ip_version(version):
 | |
|     return OrderedDict(
 | |
|         sorted(
 | |
|             [
 | |
|                 (ip, sorted_hostnames(hostnames))
 | |
|                     for ip, hostnames in node.metadata.get('hosts').items()
 | |
|                     if ip_address(ip).version == version
 | |
|             ],
 | |
|             key=lambda e: ip_address(e[0]),
 | |
|         ),
 | |
|     )
 | |
| 
 | |
| 
 | |
| sorted_hosts = OrderedDict({
 | |
|     **sorted_hosts_for_ip_version(4),
 | |
|     **sorted_hosts_for_ip_version(6),
 | |
| })
 | |
| ip_width = len(max(sorted_hosts.keys(), key=len))
 | |
| 
 | |
| files['/etc/hosts'] = {
 | |
|     'content': '\n'.join(
 | |
|         ' '.join([
 | |
|             ip.ljust(ip_width, ' '),
 | |
|             *hostnames
 | |
|         ])
 | |
|             for ip, hostnames in sorted_hosts.items()
 | |
|     ),
 | |
| }
 | |
| 
 | |
|     
 | 
