Vom 23. bis 25. April 2020 findet wieder das weltweite Global Azure Bootcamp statt. Im Rahmen des Azure Meetup Leipzig wollen wir am 24. April bei SoftwareOne / COMPAREX im Leipziger Norden ein Community-Event veranstalten. Details und Anmeldung dazu über Meetup:
Hinweis: Der Großteil des Artikels ist auch in meinem YouTube-Video zu diesem Thema enthalten:
Auf Grund vieler Nachfragen aus Community und Kunden habe ich mich dazu entschieden, dieses Thema etwas genauer zu beleuchten… Wenn man Azure in größerem Umfang nutzt, dann kommt schnell die Frage nach interner Kostenverrechnung („Innerbetriebliche Leistungsverrechnung“ / „Charge back“) oder zumindest der Möglichkeit, die Kosten den jeweiligen Verursachern zuzuordnen und transparent darzustellen. Ein wesentliches Hilfsmittel dafür ist das Tagging von Ressourcen. Klar, man könnte die Ressourcen auch nach Kostenstellen getrennt in unterschiedlichen Subscriptions unterbringen, das stößt in der Praxis aber schnell an Grenzen und auf Probleme.
Hat man nun seine Ressourcen mit den entsprechenden Tags versehen, z.B. nach Besitzer („Owner“), Kostenstelle („Cost center“) oder Abteilung („Department“), dann tauchen diese Tags leider noch nicht in der regulären Rechnung auf.
Nun kann man sich aus dem Azure Portal (oder auch aus dem EA / Enterprise Portal oder via REST API) eine Detail-Aufstellung der Kosten herunterladen. Dazu muss man zu „Cost Management + Billing“ / Billing-Scope auswählen / „Usage + Charges“ / Monat wählen / Download-Button klicken / Kurz warten / “ Usage Details Version 2″ auswählen. Diese „Usage Details“ enthalten dann auch die Tags. Allerdings: Selbst wenn man das CSV-File so umformatiert, dass Excel damit umgehen kann, ergibt sich noch ein Problem:
Die einzelnen Tags werden alle zusammen geworfen und in einer „Spalte“ vermischt. Damit ist das Suchen oder Filtern nach einzelnen Tags schon recht schwer – eine bestimmte Kombination aus Tags ist damit unmöglich zu filtern. Dazu müsste man die Tags jeweils in einzelnen Spalten ablegen. Und da kommt PowerShell und dessen Möglichkeit, mit dem JSON-Format umzugehen, ins Spiel! Ich habe eine Script geschrieben, was die Spalte in die einzelnen Tags aufteilt. Dabei werden auch gleich Zahlen und Daten in das lokale Format überführt.
# Script to expand tags from the usage details CSV provided by Azure / Microsoft# to filter usage by tags; also converts some numbers to local format# Download CSV file by hand first!# This is needed for the FileOpen Dialog
Add-Type-AssemblyName System.Windows.Forms
$FileBrowser=New-Object System.Windows.Forms.OpenFileDialog -Property@{
InitialDirectory =[Environment]::GetFolderPath('Desktop')Filter='CSV-Files (*.csv)|*.csv'}$null=$FileBrowser.ShowDialog()# Just to open the dialogIf($FileBrowser.FileName -eq""){Write-Verbose"No file selected - aborting."Break}$CSV=Import-Csv$FileBrowser.FileName -Delimiter","for($i=0; $i-lt$CSV.length; $i++){# Showing progressWrite-Progress-Activity"Expanding in Progress..."-Status"$([math]::truncate($i / $($CSV.length) * 100))% complete..."-PercentComplete $($i/ $($CSV.length)*100)# Converting dates and numbers to local format$CSV[$i].Date =[datetime]::ParseExact($CSV[$i].Date,'MM/dd/yyyy',$null).ToString("d")$CSV[$i].BillingPeriodStartDate =[datetime]::ParseExact($CSV[$i].BillingPeriodStartDate,'MM/dd/yyyy',$null).ToString("d")$CSV[$i].BillingPeriodEndDate =[datetime]::ParseExact($CSV[$i].BillingPeriodEndDate,'MM/dd/yyyy',$null).ToString("d")$CSV[$i].Quantity =[float]$CSV[$i].Quantity
$CSV[$i].EffectivePrice =[float]$CSV[$i].EffectivePrice
$CSV[$i].Cost =[float]$CSV[$i].Cost
$CSV[$i].UnitPrice =[float]$CSV[$i].UnitPrice
# Expand Tags$Tags="{ $($CSV[$i].Tags) }"| ConvertFrom-Json # We need to add some brackets here...if($Tags-ne$null){$Tags.PSObject.Properties |ForEach{$TagName="Tag-$($_.Name)"Add-Member-InputObject$CSV[$i]$TagName$_.Value
# Adding the heading - what a rhyme (; ...if($CSV[0].PSObject.Properties[$TagName]-eq$null){Add-Member-InputObject$CSV[0]$TagName$null-Force}}}}# Saving as Excel-readable CSV$CSV|Export-Csv"$([System.IO.Path]::GetDirectoryName($FileBrowser.FileName))\$([io.path]::GetFileNameWithoutExtension($FileBrowser.FileName))_expanded.csv"-NoTypeInformation-Delimiter";"
# Script to expand tags from the usage details CSV provided by Azure / Microsoft
# to filter usage by tags; also converts some numbers to local format
# Download CSV file by hand first!
# This is needed for the FileOpen Dialog
Add-Type -AssemblyName System.Windows.Forms
$FileBrowser = New-Object System.Windows.Forms.OpenFileDialog -Property @{
InitialDirectory = [Environment]::GetFolderPath('Desktop')
Filter = 'CSV-Files (*.csv)|*.csv'
}
$null = $FileBrowser.ShowDialog() # Just to open the dialog
If($FileBrowser.FileName -eq "")
{
Write-Verbose "No file selected - aborting."
Break
}
$CSV = Import-Csv $FileBrowser.FileName -Delimiter ","
for ($i=0; $i -lt $CSV.length; $i++)
{
# Showing progress
Write-Progress -Activity "Expanding in Progress..." -Status "$([math]::truncate($i / $($CSV.length) * 100))% complete..." -PercentComplete $($i / $($CSV.length) * 100)
# Converting dates and numbers to local format
$CSV[$i].Date = [datetime]::ParseExact( $CSV[$i].Date, 'MM/dd/yyyy', $null).ToString("d")
$CSV[$i].BillingPeriodStartDate = [datetime]::ParseExact( $CSV[$i].BillingPeriodStartDate, 'MM/dd/yyyy', $null).ToString("d")
$CSV[$i].BillingPeriodEndDate = [datetime]::ParseExact( $CSV[$i].BillingPeriodEndDate, 'MM/dd/yyyy', $null).ToString("d")
$CSV[$i].Quantity = [float]$CSV[$i].Quantity
$CSV[$i].EffectivePrice = [float]$CSV[$i].EffectivePrice
$CSV[$i].Cost = [float]$CSV[$i].Cost
$CSV[$i].UnitPrice = [float]$CSV[$i].UnitPrice
# Expand Tags
$Tags = "{ $($CSV[$i].Tags) }" | ConvertFrom-Json # We need to add some brackets here...
if ($Tags -ne $null) {
$Tags.PSObject.Properties | ForEach {
$TagName = "Tag-$($_.Name)"
Add-Member -InputObject $CSV[$i] $TagName $_.Value
# Adding the heading - what a rhyme (; ...
if ($CSV[0].PSObject.Properties[$TagName] -eq $null) {
Add-Member -InputObject $CSV[0] $TagName $null -Force
}
}
}
}
# Saving as Excel-readable CSV
$CSV | Export-Csv "$([System.IO.Path]::GetDirectoryName($FileBrowser.FileName))\$([io.path]::GetFileNameWithoutExtension($FileBrowser.FileName))_expanded.csv" -NoTypeInformation -Delimiter ";"
Das Script findet ihr natürlich auch auf meinem GitHub Repo:
Das Resultat der Umwandlung wird dann in eine neue Excel-Datei im selben Folder wie die Originaldatei abgespeichert und kann dann problemlos in Excel geöffnet werden:
Wie man hier sieht sind die Tags nun in separaten Spalten untergebracht, so dass man sehr gut danach sortieren, darauf filtern oder mehr tun kann.
This Holiday Season, Altaro is helping you out with your Holiday Shopping: they’re giving you the chance to WIN fantastic gifts that you can give to your loved ones!
It’s no secret that Holiday shopping
can be stressful and very time-consuming. So this year, whether
you need a present for your partner, your children, your parents and
in-laws, or your friends… Altaro’s got
your back. Enter and share it on socials for a chance to WIN one of the
Grand Prizes: a Holy Stone GPS FPV RC Drone
HS100, an All-Access MasterClass pass,
Lomography Lomo’Instant San
Sebastian, an Echo Plus (Smart Home Hub), a Wii Console &
Mario Kart for Wii, 2x Netflix Gift Cards of $100 each, and
a JBL Clip Portable Waterproof Speaker.
And guess what? For any eligible
subscription they give you a guaranteed Amazon voucher!
So, if you are a Hyper-V or VMware
user, download Altaro’s VM
Backup and follow the instructions you will find over here to WIN these exciting
prizes!
With Halloween only a few days away, this year Altaro gathered SysAdmins’ funniest and most horrifying stories into one eBook, especially for you.
We all know that a SysAdmin’s job is no easy task and apart from constantly having systems to update, bugs to fix and users to please, SysAdmins encounter all sorts of situations throughout their careers. From tech situations to funny anecdotes, terrible mishaps or incidents with colleagues, this eBook includes real stories of what SysAdmins go through on a daily basis.
The eBook is very easy to download as no registration is required. Click on Download and it’s yours. It includes more than 25 short stories but this one is our personal favourite 😊.
Ein regelmäßiges Problem im Azure-Alltag ist das Aufräumen nicht mehr benötigter Azure-Ressourcen. Diese kosten in der Regel unnötig Geld und stellen zum Teil auch ein (Sicherheits-)Risiko dar (wenn zum Beispiel eine nicht mehr verwendete VM aus dem Fokus gerät und über Jahre nicht gepatcht wird).
Um dieser Herausforderung zu begegnen gilt es zunächst, die Ressourcen, die „weg“ können, zu identifizieren. Dazu habe ich eine erste Version eines PowerShell Skriptes erstellt, welches:
Nicht verwendete Public IPs
Nicht verwendete NICs
Nicht verwendete NSGs
Nicht verwendete Managed Disks
findet und aufführt.
Über die Zeit möchte ich das Skript weiter ausbauen.
Microsoft hat heute (still und heimlich und ohne großes Event) die neuen Deutschen Rechenzentren für Azure freigeschalten. Man kann sie auch im Portal schon sehen/auswählen:
Allerdings ist diese Region bisher nur für ausgewählte Kunden nutzbar. Beim Versuch, eine Ressource dorthin bereit zu stellen, kommt derzeit noch ein Fehler:
Einem Beitrag von Microsoft selbst sind auch weitere Details zu entnehmen, auch, wann und wie es weitergeht:
In meinen Workshops und anderen Kundenterminen kommt immer wieder die Frage, wie man Virtuelle Maschinen in Azure nach Zeit gesteuert hoch- und wieder runterfahren kann. Das ist eigentlich ganz einfach – man benötigt dazu nur folgendes:
Einen Azure Automation Account
Ein PowerShell Runbook mit entsprechendem Skript
VMs mit den entsprechenden Tags
Ich habe mich dazu zu folgenden Tags entschieden:
AutoShutdown – Entscheidet, ob die VM automatisch heruntergefahren werden soll; kennt die Werte “Yes” and “No”
AutoShutdownTime – enthält die entsprechende Zeit für den Shutdown im Format HH:mm:ss nach UTC
AutoStartup – Entscheidet, ob die VM automatisch gestartet werden soll; kennt die Werte “Yes” and “No”
AutoStartupTime – enthält die entsprechende Zeit für den Start im Format HH:mm:ss nach UTC
Das PowerShell-Skript findet ihr in meinem GitHub Repo:
Das Skript ist etwas komplexer als die beiden anderen im Repo, berücksichtigt dabei aber auch, dass eine VM ggf. morgens heruntergefahren und abends gestartet werden soll.
Auf Youtube habe ich ein Video veröffentlicht, dass das Vorgehen mit anderen Skripten zeigt:
To celebrate their 10th anniversary & SysAdmin Day 2019, Altaro is giving SysAdmins and IT professionals the opportunity to share their best IT story and WIN fantastic prizes!
Throughout our careers, we all gather daily stories worth telling, from tech situations to funny anecdotes, terrible mishaps or incidents with our colleagues. This year everyone is invited to share their best stories for a chance to win big prizes: an amazing Royal Gourmet BBQ Grill, a GPS Drone with Camera & Live Video 1080 HD FPV, a GoPro Hero5 Waterproof Camera & more. And here’s a tip: for any eligible subscription they give a guaranteed Amazon eGift voucher!
So, if you are a Hyper-V or VMware user, download Altaro’s VM Backup and follow the instructions you will find over here to WIN these exciting prizes!
Seit ein paar Stunden ist sie nun endlich verfügbar – die erste Preview-Version von PowerShell 7, genannt „PowerShell 7 Preview.1“. Sie kann wie üblich auf verschiedensten Wegen bezogen werden. Einer davon ist der direkte Download aus GitHub:
Also, dann viel Spaß beim Ausprobieren der neuen Version! Und denkt daran – Preview heisst, es gibt keinen Support und die Version sollte nicht produktiv eingesetzt werden!
Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du diesen Technologien zustimmst, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn du deine Zustimmung nicht erteilst oder zurückziehst, können bestimmte Merkmale und Funktionen beeinträchtigt werden.
Funktional
Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt.Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.