@page "/ansible/inventory"
@using RackPeek.Domain.Resources.Desktops
@using RackPeek.Domain.UseCases.Ansible
@inject AnsibleInventoryGeneratorUseCase InventoryUseCase
Ansible Inventory Generator
Global Variables
One per line: key=value
@if (_warnings.Any())
{
Warnings
@foreach (var warning in _warnings)
{
- @warning
}
}
@code {
private string _groupByTagsRaw = "prod, staging";
private string _groupByLabelsRaw = "env, site";
private string _globalVarsRaw =
@"ansible_user=ansible
ansible_python_interpreter=/usr/bin/python3";
private string _inventoryText = string.Empty;
private List _warnings = new();
private async Task GenerateInventory()
{
try
{
_warnings.Clear();
_inventoryText = string.Empty;
var options = new InventoryOptions
{
GroupByTags = ParseCsv(_groupByTagsRaw),
GroupByLabelKeys = ParseCsv(_groupByLabelsRaw),
GlobalVars = ParseGlobalVars(_globalVarsRaw)
};
var result = await InventoryUseCase.ExecuteAsync(options);
if (result is null)
{
_warnings.Add("Inventory generation returned null.");
return;
}
_inventoryText = result.InventoryText;
_warnings = result.Warnings.ToList();
}
catch (Exception ex)
{
_warnings.Clear();
_warnings.Add($"Unexpected error: {ex.Message}");
}
}
private static IReadOnlyList ParseCsv(string raw)
{
if (string.IsNullOrWhiteSpace(raw))
return [];
return raw.Split(',', StringSplitOptions.RemoveEmptyEntries)
.Select(x => x.Trim())
.Where(x => !string.IsNullOrWhiteSpace(x))
.ToArray();
}
private static IDictionary ParseGlobalVars(string raw)
{
var dict = new Dictionary(StringComparer.OrdinalIgnoreCase);
if (string.IsNullOrWhiteSpace(raw))
return dict;
var lines = raw.Split('\n', StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
var trimmed = line.Trim();
if (string.IsNullOrWhiteSpace(trimmed)) continue;
var parts = trimmed.Split('=', 2);
if (parts.Length != 2) continue;
var key = parts[0].Trim();
var value = parts[1].Trim();
if (!string.IsNullOrWhiteSpace(key))
dict[key] = value;
}
return dict;
}
}