Jak ustrukturyzować kod i konfiguracje związane z DevOps w repozytorium kodów?

10

Rozwijamy się jako firma, nasze produkty się rozwijają, rosną również nasze działania i wysiłki związane z DevOps - przeszliśmy z Bamboo na bardziej elastycznego i konfigurowalnego Jenkinsa, używając potoków wdrażania i innych wtyczek; przełączyłem się na Ansible i zacząłem używać Dockera tu i tam wewnętrznie.

Wszystkie te rzeczy wymagają pewnego poziomu kodowania lub konfiguracji - skrypty i konfiguracje Ansible, groovy skrypty Jenkinsa, Dockerfiles i konfiguracje YAML.

Do tej pory stworzyliśmy osobne „ops” repozytorium z katalogami Wysoki poziom jenkins, ansible, dockeroraz other(co jest okropne imię, ale teraz wszystko jest „inne” devops automatyki są tam).

Nasze podejście nie wydaje się właściwe i może nie być skalowane, ale jakie są najlepsze praktyki i zalecenia dotyczące przechowywania kodu związanego z DevOps w repozytorium lub repozytoriach kodów?

alecxe
źródło
6
Używam metody „każda część to aplikacja, jedno repo na aplikację”, w kuchni, co oznacza 1 repo na książkę kucharską.
Tensibai
@Tensibai prawda, bałem się, że pojedyncze repozytorium „ops” szybko stanie się niepraktyczne. Dzięki.
alecxe
1
To była starsza forma zarządzania książkami kucharskimi w kuchni, 1 repozytorium ze wszystkimi książkami kucharskimi i w większości przypadków okazała się karabinem, stąd zmiana, ale nie czuję się dobrze, mówiąc, że będzie pasować, rurociągi Jenkinsa (jeśli v2) i pliki dokerów powinny być zgodne z projektem, który obsługują IMO, i nie mam pojęcia, co podłożyłeś pod inne, więc nie mogę tak naprawdę udzielać żadnych rad tutaj
Tensibai
@Tensibai ma to! Inne składają się głównie z narzędzi bash i python lub okresowo wykonywanych skryptów dla wielu wewnętrznych narzędzi .. tak naprawdę nie pasują one nigdzie i nie moglibyśmy wymyślić lepszego miejsca niż „inne”. Zobaczę, czy mogę opublikować zawartość katalogów również na pytanie. Dzięki.
alecxe
1
Podzielę je na wielokrotne repo według „powinowactwa” pracy, skrypty działające razem na aplikacji X, możesz mieć skrypt użyty w dwóch aplikacjach, ale jeśli aplikacja Zmiana sposobu, w jaki skrypt musi obsługiwać aplikację, z którą rozmawia , lepiej mieć dwie oddzielne wersje, więc ATEOTD przechowałbym je z aplikacją, do której się odnoszą, lub jeśli obejmują wiele aplikacji w określonym repozytorium na zadanie, więc zawsze masz wersję zgodną z wdrożonymi aplikacjami i nie nie trzeba jednocześnie oznaczać niepowiązanego skryptu.
Tensibai

Odpowiedzi:

4

Obecna organizacja kodu i konfiguracji, którą opisujesz, oparta jest na zastosowanych rozwiązaniach technicznych. Jest to zły projekt, który zwiększy narzut w naszych działaniach konserwacyjnych i doda wiele pułapek na nasz sposób. Zamiast tego organizacja ta powinna opierać się na artefaktach , które wdrażamy.

Powodem tego jest to, że chcemy brać pod uwagę artefakty ( np. Obraz dokera lub pakiet oprogramowania) jako obiekty następujących czasowników:

  • budować
  • test
  • rozmieścić

rozważenie minimalnego zestawu zautomatyzowanych zadań, które chcemy wykonać. Jeśli chcemy coś zmienić w sposobie implementacji czasownika testowego, łatwo jest odwiedzić folder odpowiadający temu artefaktowi w odpowiednim repozytorium, a następnie odkryć elementy automatyzacji specyficzne dla jenkins, które należy zaktualizować. Zamiast tego, jeśli przepisy dotyczące automatyzacji opierają się na rozwiązaniach technicznych, musimy od razu zrozumieć, że Jenkins bierze udział w procedurach testowych i znaleźć tam elementy automatyzacji związane z artefaktami. W złożonych sytuacjach organizacja rozwiązań technicznych bardzo utrudnia aktualizację, ponieważ musimy z góry poznać wszystkie rozwiązania techniczne związane z niektórymi usługami, aby je odpowiednio zaktualizować.

Na przykład repozytorium zawierające kod strony internetowej i mikro-usługę „a” może mieć następujące podkatalogi poświęcone operacjom:

./ops/website
./ops/micro-service-a

z których każdy ma trzy skrypty nazywa build, testi deploy. Teraz, gdy organizacja elementów automatyzacji została w jakiś sposób wyjaśniona, zwróćmy naszą uwagę na konfigurację.

deployCzasownik określa główne warunki i wymagania dotyczące organizacji konfiguracji w przypadku zastosowania go do artefaktu podobnego do usługi. deployCzasownik powinien posiadać następujące parametry:

  • wersja artefaktu do wdrożenia,
  • cel wdrażania artefaktu, który opisuje konkretne środowisko, w którym uruchomiony zostanie artefakt ( np. klaster i punkty końcowe , z którymi powinien rozmawiać)
  • poświadczenia, których powinien używać do łączenia się z innymi punktami końcowymi ( np. bazami danych)
  • konfiguracja środowiska wykonawczego (np. jak długo powinny trwać wpisy w pamięci podręcznej itp.)

Z punktu widzenia operacyjnego ten podział parametryzacji jest zgodny z naturalnym stopniem swobody problemu wdrażania - oprócz poświadczeń, które można powiązać z konfiguracją środowiska wykonawczego, ale lepiej jest je rozdzielić, aby uniknąć niedbałego ich rozprzestrzeniania.

Michael Le Barbier Grünewald
źródło
5

Mogę odpowiedzieć na temat okna dokowanego, jedną z najlepszych praktyk korzystania z okna dokowanego jest przechowywanie pliku dokowania i plików tworzenia w tym samym repozytorium projektu, więc gdziekolwiek sklonujesz projekt, możesz zbudować obraz dokera, i dobrze jest przechowuj wiele wersji plików komponujących dokera, na przykład (prod, staging, dev), abyś mógł zbudować obraz i uruchomić kontener z określoną opcją dla każdej env, na przykład dla maszyny deweloperskiej możesz użyć konkretnej sieci i uruchomić więcej kontenerów zależności lub cokolwiek innego.

Wissam Roujoulah
źródło
4

Kod każdego narzędzia przechodzi do własnego repozytorium. na przykład

  1. Szablon Jenkins Groovy w repozytorium Jenkins
  2. Odpowiednie podręczniki YAML we własnym repozytorium (z rolami, zadaniami, podkatalogami inwentarza)
  3. Szablony Cloudformation / Terrform we własnym repozytorium
  4. Pliki Docker we własnym 5 .. I tak dalej

Pomoże to w lepszym skalowaniu pod względem organizacji procesów i utrzymywania różnych gałęzi dla każdego środowiska

Zapewniłoby to bardziej szczegółową kontrolę i odciąłoby wszystkie koszty związane z wersjonowaniem do systemów kontroli wersji. Utwórz także osobne gałęzie dla każdego środowiska i oznacz kod dla każdej wersji produkcyjnej (podobnie jak w przypadku podstawy kodu aplikacji). Pomyśl o infra i przetwarzaj kodowo. (Wszelkie zmiany w procesie muszą zostać skodyfikowane i wysłane do QA, SIT, UAT, a następnie do PROD) podobnie jak w aplikacji.

Na przykład możesz mieć V2.1 Ansible działający w dziale produkcyjnym (gałąź master), ale V2.0 kontenerów dokujących działający w Prod (gałąź master)

Podobnie przechowuj skrypty DB / skrypty bash we własnych repozytoriach, a być może możesz mieć skonfigurowany plik sprawdzania kondycji (JSON / YAML), aby wyświetlał wersje wszystkich narzędzi / części w każdym wdrożonym adresie URL w celu śledzenia i automatyzacji. (Aby haczyki internetowe odczytywały adres URL i automatyzowały wdrożenia)

Ameen Ibrahim Raffic - „AIR”
źródło
2
Pułapka tego podejścia polega na tym, że wersja 2.1 jest w wersji qa i nie jest zatwierdzona, a ty musisz pilnie załatać produkcję, nie możesz zmodyfikować wersji 2.0, a jeśli stworzysz wersję 2.2 dla tej poprawki, istnieje duże ryzyko zagubione lub nadpisane, gdy wersja 2.1 wejdzie do produkcji, pomnóż przez ilość osobnego kodu w repozytorium, a wkrótce będziesz miał koszmar backportów (działa, ale musiałem dodać to wyłączenie odpowiedzialności :))
Tensibai
3
Używanie gałęzi do śledzenia informacji specyficznych dla środowiska / wdrożenia wygląda dla mnie jak mrówka: jeśli mamy 20 środowisk, oznacza to, że mamy 20 gałęzi, aby zsynchronizować… prawdopodobne źródło błędów i zamieszania. Czy możesz wyjaśnić, dlaczego nie używasz plików konfiguracyjnych do śledzenia informacji specyficznych dla środowiska / wdrożenia i jaki jest Twój przepływ pracy z tymi gałęziami? To nie są trywialne problemy!
Michael Le Barbier Grünewald
3

Dokonanie rozróżnienia między Ops, Dev i DevOps promuje izolację i wymusza postawę „przerzuć ją przez mur”. Aby zwiększyć współpracę między zespołami, należy umieścić wszystko w repozytorium, które jest wymagane do zbudowania i wdrożenia projektu.

To powiedziawszy, odpowiedź na pytanie:

Jak ustrukturyzować kod i konfiguracje związane z DevOps w repozytorium kodów?

jest to, że jeśli wymagana jest konfiguracja do uruchomienia projektu, to należy go umieścić w tym samym katalogu.

030
źródło