@@ -174,6 +174,47 @@ def _echo_capability_install_payload(payload: Dict[str, Any], output_format: str
174174 click .echo (f" { line } " )
175175
176176
177+ def _echo_os_info_payload (payload : Dict [str , Any ], output_format : str ) -> None :
178+ if output_format == "json" :
179+ click .echo (json .dumps (payload , indent = 2 , sort_keys = True ))
180+ return
181+ click .echo (f"Inventory: { payload ['inventory' ]} " )
182+ click .echo (f"Targets: { payload ['target_count' ]} " )
183+ for target in payload ["targets" ]:
184+ os_info = target ["os" ]
185+ pretty = os_info .get ("pretty_name" ) or os_info .get ("name" ) or os_info .get ("id" ) or "unknown"
186+ version = os_info .get ("version_id" ) or os_info .get ("version" ) or "-"
187+ codename = os_info .get ("version_codename" ) or "-"
188+ id_like = "," .join (os_info .get ("id_like" ) or []) or "-"
189+ user = target .get ("user" ) or "-"
190+ click .echo (
191+ f"Target { target ['target' ]} { target ['host' ]} :{ target ['port' ]} "
192+ f"user={ user } os={ pretty } family={ os_info .get ('family' , 'unknown' )} "
193+ f"id={ os_info .get ('id' , 'unknown' )} version={ version } codename={ codename } "
194+ f"id_like={ id_like } pkg={ os_info .get ('package_manager' , 'unknown' )} "
195+ )
196+
197+
198+ def _os_info_payload (
199+ * ,
200+ inventory_path : str ,
201+ vars_path : str | None ,
202+ secrets_path : str | None ,
203+ cli_vars : tuple [str , ...],
204+ limit : tuple [str , ...],
205+ exclude : tuple [str , ...],
206+ plugin_path : tuple [str , ...],
207+ ) -> Dict [str , Any ]:
208+ return _engine (plugin_path ).os_info_inventory (
209+ inventory_path = inventory_path ,
210+ vars_path = vars_path ,
211+ secrets_path = secrets_path ,
212+ limit = _split_selectors (limit ),
213+ exclude = _split_selectors (exclude ),
214+ cli_vars = _parse_vars (cli_vars ),
215+ )
216+
217+
177218@click .group (context_settings = {"help_option_names" : ["-h" , "--help" ]})
178219@click .version_option (version = __version__ , prog_name = "Automax" )
179220def cli () -> None :
@@ -965,6 +1006,53 @@ def check_secrets(
9651006
9661007
9671008
1009+ @cli .group ()
1010+ def os () -> None :
1011+ """Inspect target operating-system facts."""
1012+
1013+
1014+ @os .command ("info" )
1015+ @click .option ("--inventory" , "inventory_path" , required = True , type = click .Path (exists = True ), help = "External inventory YAML path." )
1016+ @click .option ("--vars" , "vars_path" , type = click .Path (exists = True ), help = "External variables YAML path." )
1017+ @click .option ("--secrets" , "secrets_path" , type = click .Path (exists = True ), help = "External secrets YAML path." )
1018+ @click .option ("--var" , "cli_vars" , multiple = True , help = "Override variable, format KEY=VALUE." )
1019+ @click .option ("--limit" , multiple = True , help = "Limit targets. Accepts server, group or group:name." )
1020+ @click .option ("--exclude" , multiple = True , help = "Exclude targets. Accepts server, group or group:name." )
1021+ @click .option ("--plugin-path" , multiple = True , help = "External plugin file or directory." )
1022+ @click .option (
1023+ "--format" ,
1024+ "output_format" ,
1025+ type = click .Choice (["text" , "json" ]),
1026+ default = "text" ,
1027+ show_default = True ,
1028+ help = "Output format." ,
1029+ )
1030+ def os_info (
1031+ inventory_path : str ,
1032+ vars_path : str | None ,
1033+ secrets_path : str | None ,
1034+ cli_vars : tuple [str , ...],
1035+ limit : tuple [str , ...],
1036+ exclude : tuple [str , ...],
1037+ plugin_path : tuple [str , ...],
1038+ output_format : str ,
1039+ ) -> None :
1040+ """Detect OS release facts for selected inventory targets."""
1041+ try :
1042+ payload = _os_info_payload (
1043+ inventory_path = inventory_path ,
1044+ vars_path = vars_path ,
1045+ secrets_path = secrets_path ,
1046+ cli_vars = cli_vars ,
1047+ limit = limit ,
1048+ exclude = exclude ,
1049+ plugin_path = plugin_path ,
1050+ )
1051+ except (AutomaxError , ValueError , RuntimeError ) as exc :
1052+ raise click .ClickException (str (exc )) from exc
1053+ _echo_os_info_payload (payload , output_format )
1054+
1055+
9681056@cli .group ()
9691057def capabilities () -> None :
9701058 """Inspect job-scoped remote capability requirements."""
0 commit comments