Terraform: ilustracja zależności (terraform graph)

2025-12-03

Czasami dobrze jest „zobaczyć” zależności w terraform na grafie. Można do tego wykorzystać polecenia

terraform graph > graph.dot

a potem wygenerować obraz przy pomocy dot.exe (element pakietu GraphViz)

dot.exe -Tpng graph.dot -o graph.png

Niestety to może się zakończyć błędem:

Error: graph.dot: syntax error in line 1 near ' ■d'

Problem jest w kodowaniu pliku. Można zmienić pierwsze polecenie na:

terraform graph | Out-File -Encoding ASCII graph.dot

Tutaj polecenie PowerShell Out-File zmienia kodowanie pliku na ASCII w locie i nie powinno być problemu przy uruchamianiu generowania obrazu za pomocą dot.exe

By Rafał Kraik in Azure

Python: Comprehension statement – co to jest?

2025-12-02

Można żyć z Pythonem w zgodnie nie znając comprehension statement, ale… może jednak warto, bo dzięki temu jest krócej, prościej, czytelniej, o ile tylko… rozumie się co to comprehension statement.

Cel jest prosty. Chcemy skrócić pętle – najlepiej do jednej linijki. No to popatrzmy na pętlę, której celem jest wygenerowanie kwadratów liczb parzystych z pewnej zadanej listy:

numbers = [1, 2, 3, 4, 5]
squares = []

for n in numbers:
    if n % 2 == 0:        # tylko liczby parzyste
        squares.append(n**2)

print(squares)  # Wynik: [4, 16]

Trzeba oczywiście zadeklarować listę numbers, potem pustą listę squares, a potem napisać for, badać parzystość przy użyciu if, podnosić do kwadratu i dodawać do listy no i na końcu wyświetlić wynik. Jest trochę długie, ale inaczej się nie da…. no właśnie stop! Comprehension skraca ten zapis do:

numbers = [1, 2, 3, 4, 5]
squares = [n**2 for n in numbers if n % 2 == 0]

print(squares)  # Wynik: [4, 16]

Ojej – ale co tu się dzieje? Oczywiście pomijamy pierwszą i ostatnią linijkę, bo one są oczywiste.

No to tak:

  • Wynikiem ma być lista, a listę oznacza się w pythonie nawiasami kwadratowymi, więc mamy squares = [ coś tam ]
  • Na liście mają się znaleźć kwadraty liczb, więc piszemy n**2, tylko co to jest to n?
  • No właśnie n to liczby, które pochodzą z listy numbers, dodajemy więc: for n in numbers
  • Ale ale! Przecież mieliśmy podnosić do kwadratu tylko liczby parzyste. No tak – dlatego dopisujemy if n % 2 == 0

W tym jednym zapisie jest cały ciąg operacji budujących pętlę for. Jest „for n in numbers”, jest „if n %2 == 0”, jest podnoszenie do kwadratu, czego ewentualnie nie ma to instrukcji append, ale ten append „dzieje się sam”, bo przecież tworząc zmienną squares napisaliśmy squares = [ …. ] czyli jest to jakiś rodzaj listy.

Comprehension można też użyć tworzyć zbiory danych, np tutaj do zbioru {} zostaną włożone wszystkie elementy z listy, a więc w efekcie nawet jeśli na liście były elementy się powtarzające, to w zbiorze będą już tylko unikalne

words = ["kot", "pies", "kot", "ryba"]
unique_lengths = {len(w) for w in words}
# Wynik: {3, 4}

To może na koniec, takie niebanalne zadanie:

Napisz pętlę, która wyświetli napis „Pan XX” lub „Pani XX” w oparciu o listę imiona. W liście imiona są zapisane imiona. Napis ma być Pan, jeśli imię kończy się spółgłoską lub Pani jeśli imię kończy się samogłoską. Skorzystaj z comprehension

imiona = ["Ala", "Ola", "Marek", "Jan", "Ewa"]

Rozwiązanie jest poniżej – scrolluj w dół:

i jeszcze

i jeszcze

i jeszcze

i jeszcze

i jeszcze

i jeszcze

i jeszcze

i jeszcze

tutaj:

wyniki = [
    ("Pani " + imie if imie[-1].lower() in "aeiouy" else "Pan " + imie)
    for imie in imiona
]

print(wyniki)
# Wynik: ['Pani Ala', 'Pani Ola', 'Pan Marek', 'Pan Jan', 'Pani Ewa']

By Rafał Kraik in Python

Linux: Instalacja azcopy

2025-08-05

Linux często jest wykorzystywany do automatyzacji chmury, np. Azure. Jeśli trzeba synchronizować pliki, można użyć azcopy, ale najpierw trzeba je zainstalować. Oto jak:

Najpierw skopiuj pakiet na swój komputer (najlepiej do jakiegoś tymczasowego katalogu):

wget https://aka.ms/downloadazcopy-v10-linux -O azcopy.tar.gz

Teraz rozpakuj te pliki

tar -xf azcopy.tar.gz

Następnie skopiuj je do katalogu docelowego:

sudo cp ./azcopy_linux_amd64_*/azcopy /usr/bin/

A teraz pozostaje sprawdzić, czy azcopy się uruchamia i w jakiej wersji występuje:

azcopy --version

A jeśli trzeba jeszcze zaintalować az cli to wystarczy jedno dodatkowe polecenie:

curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
By Rafał Kraik in Linuxy

Git: Zmiana Personal Access Token (PAT)

2025-07-20

Git łącząc się do GitHub korzysta z Personal Access Token (PAT). Może zdarzyć się tak, że ten PAT chcesz albo musisz zmienić. Co wtedy?

Na Windows uruchom Credential Manager i w nim wyszukaj klucza do wymiany. Można go nawet usunąć i po prostu wprowadzić nowy.

Na Linuxie przyda się znajomość paru poleceń. Oto one:

git config --show-origin credential.helper

To polecenie sprawdzi na co wskazuje parameter credential.helper. Credential.helper (jak nazwa wskazuje) mówi o tym, kto nam pomaga w dostarczaniu credentials czyli właśnie uwierzytelnienia przed GitHub. Spodziewany wynik to:

file:.git/config        store

Znaczy to tyle, że credentials są przechowywane na dysku. Można się o tym przekonać wyświetlając plik .git-credentials:

cat ~/.git-credentials

Najprawdopodobniej zostanie wyświetlone coś w tym stylu:

https://<username>:<old_token>@github.com

No i teraz można postąpić tak, jak pod Windows, tzn. usunąć wybrany wpis lub nawet cały plik. Przy okazji wykonywania najbliższego polecenia łączącego się z GitHub zostaniemy zapytani o nowy PAT, który zapisze się w .git-credentials itp. itd….

Jeśli masz ochotę to w podobnej sytuacji można też posłużyć się poleceniem

git credential reject

To polecenie jest jednak trochę „dziwne”, bo wszystko robi „po ciuchu”. Jeśli chcesz usunąć poświadczenia do serwera GitHub – tego publicznego, a nie np. GitHub Enterprise dostępnego w twojej organizacji, to po uruchomieniu powyższego polecenia, kiedy kursor przeskoczy do kolejnej linii należy napisać:

protocol=https
host=github.com

Działa to jak zwykły „filtr” decydujący o tym co usunąć. Wszystkie wpisy w pliku .git-credentials, które rozpoczynają się od https i dotyczą serwera github.com zostaną usunięte.

By Rafał Kraik in Git

Helpdesk: ssh z kluczem prywatnym bez podawania hasla (passphrase)

2025-06-05

Kiedy uruchamiasz

ssh username@servername

to zależnie od konfiguracji może paść pytanie o passphrase. Passphrase to haslo, ktorym jest chroniony klucz prywatny wykorzystywany podczas połączenia. Generalnie ma to sens, bo przechowywanie private key w niezaszyfrowanym pliku to proszenie się o kłopoty, niestety każdorazowe wprowadzanie hasla, po to żeby otworzyć klucz prywatny, żeby podczas logowania nie podawać hasła… to nieco dziwne rozwiązanie. Co można wobec tego zrobic?

Na Linux można by uruchomić polecenie

ssh-add

Okazuje się, że na Windows można to zrobić bardzo podobnie. Usługa odpowiadająca za zabezpieczanie klucza hasłem jest częścią pakietu OpenSSH-Server, ale nie zawsze jest włączona. Oto jak ją włączyć:

Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
Get-Service ssh-agent

Kiedy usługa już działa, a ty masz plik z private key, to wpisz, podobnie jak na Linux:

ssh-add

Gotowe! Agent SSH „poda haslo” w momencie, kiedy klient ssh bedzie go potrzebować.

Pakiet OpenSSH zawiera też polecenie służące do generowania klucza, gdyby to było potrzebne:

ssh-keygen
By Rafał Kraik in Helpdesk

Helpdesk: Konfiguracja Windows SSH do połączenia z wykorzystaniem klucza prywatnego

2025-06-05

Bywa (a właściwie to już norma), że Linux, do którego chcesz się zalogować nie akceptuje hasła, tylko pary pasujących kluczy prywatnego i publicznego. Jak skonfigurować klienta po stronie windows w takiej sytuacji?

Plik .ssh/config zapisany w podkatalogu .ssh w twoim katalogu domowym (a wiec w c:\users\) powinien zawierać wpis:

Host vm1
HostName 1.2.3.4
IdentityFile C:\Users\myuser.ssh\vm1.pem
User user1

Plik C:\Users\myuser.ssh\vm1.pem powienien z kolei zawierać klucz prywatny, razem z tekstem BEGIN i END:

—–BEGIN OPENSSH PRIVATE KEY—–
<…>
—–END OPENSSH PRIVATE KEY—–

I to tyle. od tej pory można uruchamiać polecenie

ssh vm1

i logowanie powinno się odbyć bez podawania hasła (o ile klucz nie jest chroniony przez passphrase i konfiguracja po stronie serwera jest poprawna)

By Rafał Kraik in Helpdesk

2025-05-28

Kiedy w bicep próbujesz utworzyć określony zasób używasz pewnych typów zasobów, które oprócz nazwy, muszą też być obsługiwane przez odpowiednie API. A skąd takie API wziąć? Można je wylistować:

az provider show --namespace Microsoft.Authorization --query "resourceTypes[?resourceType=='denyAssignments'].apiVersions"

przykladowy wynik to:

[
[
"2024-07-01-preview",
"2024-05-01-preview",
"2022-04-01",
"2019-03-01-preview",
"2018-07-01-preview",
"2018-07-01"
]
]

Dzięki temu można teraz budować ciąg dlaszy w postaci bicep

@description('Tworzy deny assignment blokujący zapis do Storage Account Blob Container')
resource storageAccount 'Microsoft.Storage/storageAccounts@2025-01-01' = {
name: 'delmedrritjo'
location: 'westeurope'
scope: resourceGroup()
}
resource denyAssignment 'Microsoft.Authorization/denyAssignments@2022-04-01' = {
name: '123e4567-e89b-12d3-a456-426614174000'
location: 'westeurope'
scope: storageAccount
properties: {
denyAssignmentName: 'deny-write-storage-container'
permissions: [
{
denyActionNames: [
'Microsoft.Storage/storageAccounts/blobServices/containers/write'
'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write'
]
}
]
principals: [ // Dodajemy użytkownika, dla którego stosujemy blokadę
{
id: '90e-XXXXX-d98' // Object ID użytkownika
type: 'User' // Określenie typu Principal (może być 'User', 'Group', 'ServicePrincipal')
}
]
description: 'Blokada zapisu do Storage Account Blob Container'
}
}

i wysylac go do wykonania:

az deployment group create --template-file main.bicep --resource-group delme
By Rafał Kraik in Azure