public static Dictionary<String, Object> GetHosts(String accessToken, String subscriptionId = null )
{
//get the subs
List<String> subList = new List<string>();
if (subscriptionId != null)
{
subList.Add(subscriptionId);
}
else
{
Subscriptions subscriptions = ListSubscriptions.GetSubscriptions();
foreach (var sub in subscriptions.value)
{
if (sub.id.Contains(SubscriptionFilter))
{
subList.Add(sub.subscriptionId);
}
}
}
var ansibleHostList = new Dictionary<String, Object>();
var ansibleHostVarsList = new Dictionary<String, Object>();
accessToken = Adal.AccessToken();
string authToken = "Bearer" + " " + accessToken;
var client = new WebClient();
client.Headers.Add("Authorization", authToken);
client.Headers.Add("Content-Type", "application/json");
foreach (var subId in subList)
{
Uri resourceGroupsUri = new Uri(String.Format("https://management.azure.com/subscriptions/{0}/resourcegroups?api-version=2015-01-01", subId));
String text = "";
text = client.DownloadString(resourceGroupsUri);
ResourceGroups rgList = Newtonsoft.Json.JsonConvert.DeserializeObject<ResourceGroups>(text);
List<ResourceGroup> filteredResourceGroups = new List<ResourceGroup>();
foreach (var rg in rgList.value)
{
if (ResourceGroupFilter == "*")
{
filteredResourceGroups.Add(rg);
}
else if (rg.name.ToLower().Contains(ResourceGroupFilter.ToLower()))
{
filteredResourceGroups.Add(rg);
}
}
foreach (ResourceGroup rg in filteredResourceGroups)
{
//get each host
String rgId = rg.id;
String rgName = rg.name;
String rgComputeUrl = String.Format("https://management.azure.com{0}/providers/Microsoft.Compute/virtualmachines?api-version=2015-05-01-preview", rgId);
String rgVmsText = client.DownloadString(rgComputeUrl);
ComputeVms rgCompVms = JsonConvert.DeserializeObject<ComputeVms>(rgVmsText);
if (rgCompVms.value.Count != 0)
{
//resource group has vms. Fill the thing
List<Object> hostList = new List<Object>();
foreach (var vm in rgCompVms.value)
{
var tagDict = new Dictionary<String, Object>();
bool VerifyPoweredOnVM = true;
if (ReturnOnlyPoweredOnVms.ToLower() == "true")
{
VerifyPoweredOnVM = GetVmPowerStatus(accessToken, vm);
}
var simplifiedNic = GetNicDetails(accessToken, vm);
vm.simplifiedNicDetails = simplifiedNic;
if (HostCasingSetting == "UpperCase")
{
vm.name = vm.name.ToUpper();
}
if (HostCasingSetting == "LowerCase")
{
vm.name = vm.name.ToLower();
}
string vmname = vm.name;
if ((vm.tags != null) && (vm.tags.ContainsKey("AnsibleDomainSuffix")))
{
vmname = vm.name + "." + vm.tags["AnsibleDomainSuffix"];
}
else if ((rg.tags != null) && (rg.tags.ContainsKey("AnsibleDomainSuffix")))
{
vmname = vm.name + "." + rg.tags["AnsibleDomainSuffix"];
}
String ansibleReturnType = null;
if ((vm.tags != null) && (vm.tags.ContainsKey("AnsibleReturn")))
{
ansibleReturnType = vm.tags["AnsibleReturn"];
}
else if ((rg.tags != null) && (rg.tags.ContainsKey("AnsibleReturn")))
{
ansibleReturnType = rg.tags["AnsibleReturn"];
}
//If ansiblereturn is set, figure out what to return
if (ansibleReturnType != null)
{
if ((ansibleReturnType.ToLower() == "privateipaddress") && (vm.simplifiedNicDetails.InternalIpAddress != null))
{
vmname = vm.simplifiedNicDetails.InternalIpAddress;
}
else if ((ansibleReturnType.ToLower() == "publicipaddress") && (vm.simplifiedNicDetails.PublicIpAddress != null))
{
vmname = vm.simplifiedNicDetails.PublicIpAddress;
}
else if ((ansibleReturnType.ToLower() == "publichostname") && (vm.simplifiedNicDetails.PublicHostName != null))
{
vmname = vm.simplifiedNicDetails.PublicHostName;
}
else if ((ansibleReturnType.ToLower() == "privateipaddress_asansiblehost") && (vm.simplifiedNicDetails.InternalIpAddress != null))
{
tagDict.Add("ansible_host", vm.simplifiedNicDetails.InternalIpAddress);
}
else if ((ansibleReturnType.ToLower() == "publicipaddress_asansiblehost") && (vm.simplifiedNicDetails.PublicIpAddress != null))
{
tagDict.Add("ansible_host", vmname = vm.simplifiedNicDetails.PublicIpAddress);
}
else if ((ansibleReturnType.ToLower() == "publichostname_asansiblehost") && (vm.simplifiedNicDetails.PublicHostName != null))
{
tagDict.Add("ansible_host", vmname = vmname = vm.simplifiedNicDetails.PublicHostName);
}
}
//vmname is now either computername, computername+domain, one ip address or public fqdn
if (VerifyPoweredOnVM == true)
{
hostList.Add(vmname);
//check if we have hostsvars to add to meta
if ((vm.tags != null) && (vm.tags.Where(t => t.Key.ToLower().StartsWith("ansible__")).Count() > 0))
{
foreach (var tag in vm.tags.Where(t => t.Key.ToLower().StartsWith("ansible__")))
{
tagDict.Add(tag.Key.ToLower().Replace("ansible__", ""), tag.Value);
}
}
}
if (tagDict.Count > 0)
{
//add tags if any
ansibleHostVarsList.Add(vmname, tagDict);
}
}
//Add the rg to the main obj
var rgValueList = new Dictionary<String, Object>();
rgValueList.Add("hosts", hostList);
//add vars to the main object if they exists
if ((rg.tags != null) && (rg.tags.Where(t => t.Key.ToLower().StartsWith("ansible__")).Count() > 0))
{
var tagDict = new Dictionary<String, Object>();
foreach (var tag in rg.tags.Where(t => t.Key.ToLower().StartsWith("ansible__")))
{
tagDict.Add(tag.Key.ToLower().Replace("ansible__", ""), tag.Value);
}
rgValueList.Add("vars", tagDict);
}
ansibleHostList.Add(rgName, rgValueList);
}
}
}
//Add the _meta thing to the result output
var metaDict = new Dictionary<String, Object>();
metaDict.Add("hostvars", ansibleHostVarsList);
ansibleHostList.Add("_meta", metaDict);
return ansibleHostList;
}