Jednostka 9 / 11

Generowanie skryptów i automatyzacji: Bash, Python i PowerShell

Zyski:

  • Umiejętność zrozumienia mocnych stron Bash, Python i PowerShell oraz wykorzystania sztucznej inteligencji do tworzenia bezpiecznych i chronionych wersji roboczych skryptów
  • Możliwość dodawania poręczy do skryptów, takich jak set -euo pipefail, sprawdzanie pustych zmiennych, tryb próbny i rejestrowanie
  • Umiejętność czytania destrukcyjnych poleceń i wypróbowywania ich w odizolowanym środowisku, najpierw po uruchomieniu próbnym, a także stosowania dyscypliny polegającej na nieumieszczaniu sekretu w skrypcie.

Duch DevOps można podsumować w jednym zdaniu: „Automatyzuj pracę, którą wykonujesz dwa razy”. Każde powtarzające się zadanie wykonywane ręcznie — czyszczenie dziennika, tworzenie kopii zapasowych, sprawdzanie stanu serwera, przetwarzanie plików wsadowych — wymaga czasu i ostatecznie może zostać uszkodzone przez błąd ludzki. Te zadania przejmują skrypty: małe programy, które wykonują serię poleceń w sposób sekwencyjny, niezawodny i powtarzalny. Specjalista DevOps często używa trzech języków: Bash (dla skryptów powłoki Linux/Unix), Python (do złożonej logiki, wywoływania API, manipulacji danymi) i PowerShell (do zarządzania systemem Windows i chmurą).

Być może sztuczna inteligencja oferuje najbardziej praktyczną wartość w generowaniu skryptów: tworzenie roboczej wersji roboczej na podstawie jednozdaniowego opisu, rozwiązywanie tajemniczego błędu, tłumaczenie skryptu na inny język. Ale skrypt jest niebezpieczny, jeśli zostanie uruchomiony na ślepo — zły rm, Remove-Item -Recurse spowoduje nieodwracalne usunięcie plików. Dlatego motto tej jednostki brzmi: Pozwól AI napisać skrypt, ty go czytasz, najpierw wypróbuj w trybie awaryjnym, a następnie uruchom.

Jaki język wybrać i kiedy? Ogólna zasada: jeśli zadanie polega na uruchomieniu kilku poleceń systemowych z rzędu (kopiowanie pliku, ponowne uruchomienie usługi, pobranie archiwum) Bash jest najbardziej naturalnym wyborem, ponieważ Linux jest wszechobecny na serwerach. Jeśli zadanie obejmuje logikę decyzyjną, pętle, transformację danych, żądanie API lub przetwarzanie JSON – czyli logikę przekraczającą 20 linii – Python wyróżnia się czytelnością i bogatymi bibliotekami; Złożony skrypt Bash szybko staje się niezrozumiały, a Python pozostaje łatwy w utrzymaniu. Jeśli praca obejmuje zarządzanie serwerami Windows, Active Directory lub Azure, PowerShell jest środowiskiem naturalnym, ponieważ jego obiektowy charakter głęboko integruje się z tymi platformami. Określenie, który język wybrałeś i dlaczego, żądając skryptu do AI, gwarantuje, że wynik będzie odpowiedni i idiomatyczny dla Twojego środowiska.

Krok po kroku: bezpieczne generowanie skryptu

  1. Opisz zadanie i środowisko. Co będzie robić, jaki system operacyjny/powłoka, jakie ograniczenia?
  2. Zapytaj o poręcze zabezpieczające. W bashu ustaw -euo pipefail (zatrzymaj w przypadku błędu, zatrzymaj w przypadku niezdefiniowanej zmiennej), monit o potwierdzenie niebezpiecznych operacji, najpierw przesuń zamiast usuwać.
  3. Poproś o tryb pracy na sucho. Pozwól skryptowi napisać, co zrobić z opcją --dry-run, ale nie rób tego.
  4. Przeczytaj i zrozum. Sprawdź, co robi każdy wiersz, szczególnie operacje usuwania/przenoszenia/sieci.
  5. Wypróbuj w odizolowanym środowisku. W folderze testowym uruchom go z przykładowymi danymi.
  6. Dodaj do logowania. Pozwól skryptowi zapisać swoje działanie, aby można było go później obejrzeć.

Podstawy bezpiecznego pisania skryptów

Scenariusz produkcyjny powinien zawierać następujące poręcze:

  • Zatrzymanie w przypadku błędu. Bash: ustaw -euo pipefail. PowerShell: $ErrorActionPreference = „Zatrzymaj”. Jeśli jeden krok się nie powiedzie, następne nie powinny działać.
  • Idempotencja (powtarzalność). Jeśli skrypt uruchomi się dwukrotnie, nie powinien zadawać podwójnych obrażeń; Logika „Jeśli już to masz, pomiń to”.
  • Zatwierdzenie i praca na sucho. W przypadku operacji destrukcyjnych „jesteś pewien?” lub flaga --dry-run.
  • Walidacja danych wejściowych. Czy parametry są zgodne z oczekiwaniami? Pusta zmienna może zamienić rm -rf "$DIR"/ w rm -rf / katastrofa.
  • Wycięcie lasu. Zapis tego, co i kiedy zostało zrobione.
Wskazówka: najniebezpieczniejszym błędem w Bashu jest usuwanie z pustą zmienną. rm -rf "$DIR" próbuje usunąć katalog główny, jeśli $DIR jest pusty. set -u (zatrzymaj niezdefiniowaną zmienną) i sprawdzenie [ -n "$DIR" ] przed usunięciem jest ratunkiem. Wyraźnie żądaj tych zabezpieczeń, żądając skryptów od sztucznej inteligencji.

Bezpieczeństwo: tajne i destrukcyjne polecenia

Dwa duże zagrożenia:

  1. Osadzenie Sekretu w skrypcie. Hasło nie może być zwykłym tekstem w skrypcie tokena; Należy odczytać ze zmiennej środowiskowej lub skarbca. Skrypty trafiają do Gita; ukryty sekret to trwały wyciek.
  2. Destrukcyjne polecenia. rm -rf, Remove-Item -Recurse -Force, DROP TABLE, terraformzniszcz — gdy zobaczysz je w skrypcie, zatrzymaj się i zastanów dwa razy. Nigdy nie próbuj najpierw destrukcyjnego polecenia wygenerowanego przez sztuczną inteligencję w prod.
Uwaga: Kiedy mówisz AI, aby „napisała skrypt, który wyczyści te pliki”, uważnie przeczytaj zakres polecenia find… -delete lub rm, które wygeneruje. Symbol wieloznaczny (*) lub niewłaściwa ścieżka spowoduje usunięcie większej liczby plików, niż chcesz. Zawsze najpierw uruchamiaj skrypt w trybie „listy do usunięcia”, zamiast go usuwać.

Porównanie trzech języków

kryterium

walnąć

Pyton

PowerShell

Gdzie jest najlepiej

Powłoka Linuksa, łańcuch poleceń

Złożona logika, API, dane

Zarządzanie chmurą Windows

Krzywa uczenia się

Średni (uwięziony)

łatwe

średni

Obsługa błędów

set -euo awaria potoku

spróbuj/z wyjątkiem

spróbuj/złap, -ErrorAction

przenośność

Unix/Linux/Mac

wszędzie

Wieloplatformowy (PS 7+)

kiedy

Krótko, system działa

Logika dłuższa niż 20 linii

Windows/AD/Azura

trzy mini etui

Przypadek 1 — 2 godziny rzemiosła w 5 minut. Inżynier spędzał 2 godziny tygodniowo na zbieraniu i archiwizowaniu logów z 40 serwerów. Polecił AI opisanie zadania i ustawienie -euo pipefail + zabezpieczenia przed suchobiegiem oraz wygenerowanie skryptu Bash. Najpierw zatwierdzono skrypt za pomocą testu próbnego, a następnie powiązano go z zaplanowanym zadaniem (cron). Tygodniowa praca zostaje skrócona do 5 minut i wyeliminowany jest błąd ludzki.

Przypadek 2 – zapobiegnięto katastrofie ze zmienną zerową. W skrypcie czyszczącym stworzonym przez sztuczną inteligencję znajdował się rm -rf "$TARGET"/*, ale jeśli TARGET nie był gdzieś przypisany, pozostawał pusty. Uświadomił to sobie podczas studiów jako inżynier; ustaw -u i [ -n "$CEL" ] || dodano kontrolę wyjścia 1. Podczas testowania zmienna pozostała pusta, a skrypt zatrzymał się bezpiecznie, a nie katastrofalnie.

Przypadek 3 — przechwycono osadzony token. Dla wygody sztuczna inteligencja dodała linię TOKEN = „ghp_realtoken” do skryptu Pythona, który żąda interfejsu API (jako przykład). Inżynier usunął to i zmienił na odczyt ze zmiennej środowiskowej za pomocą os.environ["TOKEN"] oraz anulował i odnowił token. Gdyby skrypt trafił do Gita, token byłby publiczny.

Cztery szablony do kopiowania

1) Bezpieczny skrypt Bash:

Napisz skrypt w języku Bash: [TASK]. Obowiązkowe zasady:- `set -euo pipefail` na początku.- Sprawdź, czy zmienna nie jest pusta przy usuwaniu/przenoszeniu.- Flaga `--dry-run`: napisz, co chcesz robić w tym trybie, ale tego nie rób.- Nie osadzaj sekretu; Odczytaj ze zmiennej środowiskowej. - Wydrukuj dziennik informacyjny na każdym kroku. Skomentuj scenariusz i zaznacz najbardziej niebezpieczną linijkę.

2) Opis/sterowanie skryptem:

Opisz następujący skrypt wiersz po wierszu i sprawdź bezpieczeństwo: osadzony sekret, polecenie destrukcyjne (rm/Remove-Item/DROP), niezweryfikowane dane wejściowe, brak obsługi błędów? Zapisz każde ryzyko w kolejności ważności i korekty. Scenariusz: [KOD]

3) Tłumaczenie językowe:

Przetłumacz ten skrypt [JĘZYK ŹRÓDŁOWY] na [JĘZYK DOCELOWY]. Zachowaj zachowanie dosłownie, użyj idiomatycznej obsługi błędów języka docelowego, przenieś wszelkie osadzone klucze tajne do zmiennej środowiskowej. Zwróć uwagę na punkty, które mogą zachowywać się inaczej. Skrypt: [KOD]

4) Planowane zadanie (cron/zaplanowane zadanie):

Użyj tego skryptu [CZĘSTOTLIWOŚĆ: np. Napisz definicję harmonogramu ([cron / systemd timer / Harmonogram zadań systemu Windows]), który będzie uruchamiany [o 02:00 każdej nocy]. Dodaj sposób ostrzegania mnie w przypadku awarii (dziennik/kod wyjścia/powiadomienie) i sposób zapobiegania nakładaniu się.

Słaba zachęta/silna zachęta

Słabe: „Napisz skrypt, który usuwa stare pliki”.

Wynik: skrypt rm bez zakresu, niezabezpieczony i niewymagający działania na sucho; Jeśli zostanie uruchomiony w niewłaściwym folderze, zostanie nieodwracalnie usunięty.

Mocne: „Napisz skrypt basha, aby usunąć pliki .log starsze niż 30 dni z /var/log/app. Użyj set -euo pipefail, zatrzymaj, jeśli katalog docelowy jest pusty, wypisz najpierw, co chcesz usunąć za pomocą --dry-run, zarejestruj każdą transakcję, nie osadzaj sekretu. Zaznacz najbardziej niebezpieczną linię.

Różnica: drugie twierdzenie podaje pełny zakres, poręcze zabezpieczające i oczekiwanie na pracę na sucho; Dane wyjściowe można bezpiecznie uruchomić.

Typowe błędy

  • Uruchamianie skryptu bez jego czytania. W szczególności usuwanie/przenoszenie wierszy prowadzi do katastrofy.
  • Nie sprawdzanie pustych zmiennych. Klasyczna katastrofa polegająca na usunięciu katalogu głównego za pomocą rm -rf "$X"/.
  • pomiń `set -euo pipefail` / `-ErrorAction Stop`. Rozlega się krok, scenariusz trwa na ślepo.
  • Osadzenie Sekretu w skrypcie. Ciągły wyciek do Gita.
  • Proces niszczący bez pracy na sucho. Najpierw „pokaż mi, co mam zrobić”, a potem zrób to.
  • Pierwsza próba w prod. Działa bez izolowanego środowiska testowego.

Podsumowując

DevOps to sztuka automatyzacji; Powtarzalną pracę deleguje się do skryptów Bash, Python i PowerShell. Sztuczna inteligencja jest bardzo przydatna w tworzeniu skryptów, debugowaniu i tłumaczeniu języków — ale bezpieczny skrypt powinien zawierać zabezpieczenia przed błędami, takie jak set -euo pipefail, sprawdzanie zmiennych null, tryb próbny, wbudowana funkcja tajemnicy i rejestrowanie. Twoim obowiązkiem jest przeczytanie i przetestowanie każdego skryptu, zwłaszcza zawierającego polecenia destrukcyjne, w odizolowanym środowisku i najpierw przetestowanie go.

Zadanie aplikacji

Wybierz zadanie cykliczne (archiwizacja logów, kopia zapasowa, czyszczenie). (1) Niech sztuczna inteligencja wygeneruje chroniony skrypt z szablonem „Secure Bash script”. (2) Sprawdź pod kątem bezpieczeństwa ten sam skrypt, co szablon „Opis/audyt skryptu” i znajdź najbardziej niebezpieczną linię oznaczoną przez sztuczną inteligencję. (3) Sprawdź jego zachowanie, uruchamiając skrypt z przykładowymi plikami w folderze testowym, najpierw za pomocą opcji --dry-run.

lista kontrolna

  • [ ] Napisałem zadanie, którego nie chcę, system operacyjny/powłokę i poręcze bezpieczeństwa.
  • [ ] Podczas zatrzymywania skryptu wystąpił błąd, taki jak set -euo pipefail / -ErrorAction Stop.
  • [ ] Dodałem pustą zmienną i sprawdzenie danych wejściowych przed usunięciem/przeniesieniem.
  • [ ] Istnieje mechanizm --testowania/potwierdzania operacji destrukcyjnych.
  • [ ] W scenariuszu nie ma żadnej tajemnicy; wartości pochodzą ze zmiennej środowiskowej/przypadku.
  • [ ] Pierwszy test przeprowadziłem w odizolowanym środowisku testowym w trybie próbnym.