W tym artykule porozmawiamy o repozytorium kodu, które pozwoli wam uruchomić i przetestować Jenkinsa w konfiguracji cloud. Całe środowisko bazuje na kodzie terraform wzbogaconego o konfigurację w cloud init. Pozwala to zautomatyzować konfigurację. Dodatkowe elementy sterujące są w plikach konfiguracyjnych json zawarte w tym repozytorium. Możesz też cała konfiguracje obejrzeć na moim kanale na youtube.
Cała konfiguracja bazuje na kodzie terraform przygotowanym przezemnie tu https://bitbucket.org/szkoleniacloud/jenkins-lab-env-digitalocean/src/main/
Przechodząc do repozytorium musimy udać się do katalogu CloudConfigurations/DigitalOcean gdzie znajduje się nasz kod terraform. Pozwoli on uruchomić naszą konfigurację i dostarczyć dynamicznie środowisko do zabawy z jenkins.
Środowisko takie możemy wykorzystać do nauki budowania i konfigurowania procesów CI/CD z wykorzystaniem Jenkins. Wiedzę w ten sposób zdobytą możemy przenieść na inne narzędzia CI/CD takie jak na przykład github actions, bitbucket pipeline, azure devops. Oczywiście nie jeden do jednego bo Jenkins charakteryzuje się swoją składnią dostępną w jenkinsfile. Jednak wszystko po kolei.
Kod do uruchomienia Jenkins w Cloud
Prezentowany kod uruchamia w chmurze digitalocean i aws konfiguracje którą, pozwala uruchomić Jenkins w konfiguracji master i slave w cloud. Na początku zanim uruchomimy nasz kod będziemy potrzebować konta w digitalocean i aws. Usługi płatne z których, będziemy korzystać to digitalocean droplet i aws route53.
Cały kod uruchamiamy wydając polecenie terraform init, terraform plan, terraform apply oraz po skończonych testach terraform destroy - operacje te wydajemy w katalogu CloudConfigurations/DigitalOcean
Klucze api do kont cloud w celu uruchomienia Jenkins
Do korzystania z kodu będa nam potrzebne klucze api do wskazanych wyżej chmur aws i digitalocean. Klucze podamy w pliku .auto.tfvars (plik ten jest dodany w gitignore więc nie przejmuj się o przypadkowe umieszczenie ich w repozytorium). Plik wygląda w nastepującej postaci:
Nasz aws_access_key i aws_secret_key wygenerujemy w konfiguracji naszego usera w serwisie IAM na koncie AWS.
Wartość dla naszej zmiennej w do_token wygenerujemy logując się do naszego konta digitalocean
Po wygenerowaniu kluczy API do AWS i Digitalocean dodajemy je w naszym pliku .auto.tfvars oraz uzupełniamy nasz adres email do powiadomień z let's encrypt.
Wszystkie wymagane variables do wejścia do naszego kodu opisane są tu: https://bitbucket.org/szkoleniacloud/jenkins-lab-env-digitalocean/src/main/CloudConfigurations/DigitalOcean/Documentation.md
Główna konfiguracja Jenkins w kodzie terraform.
W konfiguracji wykorzystujemy dwa moduły które ułatwiają nam konfigurację.
Jeden jest odpowiedzialny za sieć drugi za uruchomienie w tej sieci maszyny wirtualnej (dokładnie dwóch maszyn). Przeanalizujmy zatem konfiguracje tych dwóch modułów.
Dzięki niemu mogę kontrolować stawiane sieci w ramach mojej konfiguracji środowiska Jenkins w cloud digitalocean. W bloku module odwołujemy się do:
argumentu vpc_config gdzie możemy ustawić
nazwę sieci,
opis,
nazwa konta,
oraz drugi oktet naszej sieci.
W części odpowiedzialnej za maszyny wirtualne mamy argumenty sterujące takie jak:
jsonconfig - odpowiedzialny za konfigurację maszyny wirtualnej która, jest opisana w pliku json w katalogu files/jsonconfigs
domain_name - nazwa naszej subdomeny / domeny w ramach której będę uruchamiać naszą konfigurację route53.
vpc_uuid - tu odwołuję się do id sieci na której będę uruchamiał konfigurację (kluczem są dostępne regiony w digitalocean.
user_data_file - to alternatywna konfiguracja naszego pliku cloud-init yaml gdy nie wskarzemy go w naszym pliku konfiguracyjnym json.
Nasza konfiguracja w pliku json przedstawia się następująco - spójrzmy na plik: CloudConfigurations/DigitalOcean/_files/json_configs/jenkins.json
W tym pliku wskazujemy parametry konfiguracyjne naszej maszyny wirtualnej takie jak:
nazwa na która składają się pola user_name oraz name,
obraz systemu pole image,
region w którym zostanie uruchomiona maszyna wirtualna pole region (tu musimy nazwę regionu stawić taką samą jak klucz w identyfikatorze sieci)
wielkość cpu i ramu w size (lista dostępnych compute na stronie digitalocean)
vpc_uuid - jak chcemy uruchomić na innej sieci niż nasza
user_data plik yaml z konfiguracją pochodzący z katalogu CloudConfigurations/DigitalOcean/_files/cloud-inits
pola o wartości true/false takie jak:
backups,
ipv6,
monitoring,
resize_disk,
droplet_agent
tags - określający tagi dla maszyn wirtualnych uruchomionych
phone_number - to pole odpowiada za hasło do maszyny wirtualnej gdy nie podamy klucza ssh do podłączenia.
parametr ostatni agent steruje czy dodatkowy host slave ma zostać uruchomiony.
Klucze publiczne które możemy dodawać do maszyn wirtualnych znajdziemy w CloudConfigurations/DigitalOcean/_files/ssh_keys/public_keys
Konfigurację cloud init dla hostów Jenkins Master i slave znajdziemy w CloudConfigurations/DigitalOcean/_files/cloud-inits
konfiguracja agenta przedstawia się następująco:
Konfiguracja mastera w następujący sposób:
Jak będziemy mieli ochotę możemy pobawić się w instalacje od zera naszego jenkinsa wtedy wybieramy plik konfiguracyjny dla naszego user_data CloudConfigurations/DigitalOcean/_files/cloud-inits/no_jenkins_docker_tf.tpl
Jest też prosta konfiguracja firewall, która w razie potrzeb możemy edytować:
Konfiguracja otwiera kilka portów i domyślnie śa to porty otwarte dla calego świata 0.0.0.0/0 - możemy to zmienić na własne adresy IP.
Podsumowanie:
W celu uruchomienia wydajemy polecenie terraform apply: Polecenie to tworzy nam Plan: 36 to add, 0 to change, 0 to destroy. Oczywiście zapraszam też do materiału wideo.
Pozdrawiam Piotr Kośka.
Yorumlar