W poprzednim artykule dowiedzieliśmy się jakie są różnice między statycznym i dynamicznym inventory i wiemy już, że chcemy na pewno wejść w dynamiczne zarządzanie zasobami. Dziś pokażemy jak to zrobić przy pomocy Ansible i dynamicznych zasobów na przykładzie najbardziej znanej i lubianej chmury publicznej AWS. Niniejszy artykuł będzie oparty o prace prowadzone w systemie Debian 12. W przypadku innego systemu nazwy plików czy pakietów mogą się nieco różnić.
Dynamiczne inventory może być skonfigurowane za pomocą wtyczki lub skryptu, który pobiera dane o instancjach EC2 z AWS. Żeby jednak tak się stało musimy wrzucić do naszego systemu kilka niezbędnych paczek. Bazując na przykładzie systemu Debian 12 (dla innych może być to inny zestaw). Dodatkowo skupimy się na jednym z najczęściej używanych skryptów – dotyczącym instancji EC2 w chmurze publicznej AWS.
Instalacja i konfiguracja
Instalacja wymaganych pakietów
apt update
apt install -y ansible python3-pip
apt install -y awscli python3-boto3
Konfiguracja AWS CLI do działania
Musimy przygotować Access Key oraz secret Access Key. Znajdziemy je w konsoli głównej konta po przejściu do > Security Credentials w AWS:
Po wygenerowaniu swojej pary kluczy przechodzimy do konsoli i konfigurujemy:
aws configure
Zgodnie ze swoimi preferencjami. W moim przypadku domyślnym regionem jest Frankfurt oraz formatem wyjściowym będzie json.
Konfiguracja skryptu inventory
mkdir -p ~/ansible/inventory
cd ~/ansible/inventory
Tworzymy plik aws_ec2.yml, który będzie odpowiadał za nasze dynamiczne inventory:
vi aws_ec2.yml
plugin: aws_ec2
regions:
– eu-central-1
filters:
instance-state-name: running
keyed_groups:
– key: tags.Name
prefix: tag_Name_
– key: 'ec2.instance_type’
prefix: 'type_’
hostnames:
– tag:Name
Testujemy konfigurację:
ansible-inventory -i aws_ec2.yml –graph
Możemy zmienić konfigurację tak aby ansible zwracał I używał adresów IP prywatnych jeśli korzystamy w ramach sieci VPC.
plugin: aws_ec2
regions:
– us-west-2
filters:
instance-state-name: running
keyed_groups:
– key: tags.Name
prefix: tag_Name_
– key: 'ec2.instance_type’
prefix: 'type_’
compose:
ansible_host: private_ip_address
Lub jeśli chcemy korzystać z zewnątrz, a nie koniecznie po adresach IP możemy skonfigurować to tak, aby ansible używał adresów IP zewnętrznych:
plugin: aws_ec2
regions:
– us-west-2
filters:
instance-state-name: running
keyed_groups:
– key: tags.Name
prefix: tag_Name_
– key: 'ec2.instance_type’
prefix: 'type_’
compose:
ansible_host: public_ip_address
Używanie dynamic inventory w playbookach
Nie samym ręcznym wydawaniem komend w Ansible człowiek żyje, dlatego z pewnością wielu z was już teraz zastanawia się, jak używać tego w playbookach. Spieszę z wyjaśnieniem na przykładzie utworzonego bardzo prostego playbooka.
Kod playbooka:
—–
– name: Test EC2 WladcySieci
hosts: all
tasks:
– name: Ping dla wszystkich instancji
ping:
Stwórzmy coś bardziej rozbudowanego jak na przykład jedno z codziennych zadań administracyjnych – aktualizacja paczek dla systemu Debian 12.
Kod playbooka mógłby wyglądać tak:
—
– name: Aktualizacja pakietów dla systemu Debian 12
hosts: all
become: yes # Użycie sudo do uzyskania uprawnień roota
tasks:
– name: Update apt cache
apt:
update_cache: yes
– name: Upgrade all packages
apt:
upgrade: dist
autoremove: yes
autoclean: yes
– name: Restartuj serwer jeśli jest potrzebny
reboot:
msg: „Reboot initiated by Ansible if needed after package upgrade.”
connect_timeout: 5
reboot_timeout: 600
pre_reboot_delay: 0
post_reboot_delay: 30
Uruchamiamy aktualizację:
ansible-playbook -i ../inventory/aws_ec2.yml wladcysieci.yml
Jak można zauważyć celowo wprowadziłem częściowo po polsku, a częściowo po angielsku napisy dla msg, aby pokazać, że spokojnie można pisać to w języku polskim dla tych którzy wolą rodzimy język. Nie ma to znaczenia dla działania systemu.
Objaśnienie poszczególnych sekcji:
– name: Update apt cache
apt:
update_cache: yes
Ta sekcja aktualizuje cache pakietów, co jest niezbędnym krokiem przed aktualizacją pakietów.
– name: Upgrade all packages
apt:
upgrade: dist
autoremove: yes
autoclean: yes
Ta sekcja wykonuje pełną aktualizację systemu, w tym usuwanie nieużywanych pakietów oraz czyszczenie lokalnej pamięci podręcznej.
– name: Restartuj serwerze w razie potrzeby
reboot:
msg: „Reboot initiated by Ansible if needed after package upgrade.”
connect_timeout: 5
reboot_timeout: 600
post_reboot_delay: 30
Ta sekcja uruchamia ponownie serwer, jeśli jest to konieczne po aktualizacji pakietów. Opcje opóźnienia pozwalają na bezpieczne ponowne uruchomienie i połączenie z serwerem po jego ponownym uruchomieniu.
Wybór tylko jednej rodziny OS
Faktem jest, że z pewnością mamy różne wersje systemów operacyjnych i różne dystrybucje systemu Linux na koncie. Jak zatem zrobić tak, aby tylko jedną z dystrybucji wybrać do aktualizacji tym konkretnym playbookiem? Wszak nie zadziała ten powyższy przykład w systemie RedHat.
Musimy nieco zmodyfikować nasz yaml.
plugin: aws_ec2
regions:
– us-west-2
filters:
instance-state-name: running
tag:OS: Debian12
keyed_groups:
– key: tags.Name
prefix: tag_Name_
– key: 'ec2.instance_type’
prefix: 'type_’
compose:
ansible_host: public_ip_address
Jak można zauważyć dodaliśmy kolejny filtr:
tag:OS: Debian12
Dzięki któremu wybierzemy tylko te systemy, które wcześniej otagowaliśmy jako OS: Debian12. Ważna w tym miejscu uwaga! Konieczne jest wcześniejsze otagowanie poprawnie wszystkich instancji co ułatwia nie tylko ich rozliczalność, ale także właśnie tego typu operacje.
Podsumowanie
Dynamiczne inventory w Ansible to jedno z najpotężniejszych narzędzi, które rewolucjonizuje sposób zarządzania infrastrukturą IT, szczególnie w kontekście dynamicznych i elastycznych środowisk chmurowych, takich jak AWS. W przeciwieństwie do statycznego inventory, gdzie lista hostów jest ręcznie tworzona i utrzymywana, dynamiczne inventory automatycznie generuje aktualną listę hostów na podstawie określonych kryteriów i źródeł, co znacznie upraszcza zarządzanie infrastrukturą. Wykorzystanie dynamicznego inventory jest niezwykle proste dzięki gotowym wtyczkom i skryptom dostarczanym przez Ansible, które integrują się bezproblemowo z chmurą AWS. Umożliwia to administratorom szybkie skonfigurowanie i uruchomienie automatyzacji zarządzania infrastrukturą bez konieczności manualnego śledzenia zmian w środowisku. Dzięki dynamicznemu inventory, Ansible może na bieżąco dostosowywać się do zmieniającej się infrastruktury, automatycznie wykrywając nowe instancje oraz uwzględniając ich zmiany, takie jak zmiana adresów IP czy stanów operacyjnych. To podejście eliminuje ryzyko błędów związanych z ręcznym zarządzaniem inventory oraz znacząco redukuje czas potrzebny na administrację. Co więcej, dynamiczne inventory wspiera zaawansowane funkcje filtrowania i grupowania hostów na podstawie ich metadanych, takich jak tagi czy typy instancji, co pozwala na precyzyjne zarządzanie i wykonywanie zadań na określonych grupach maszyn. Ta elastyczność jest szczególnie cenna w dużych, złożonych środowiskach, gdzie liczba instancji może dynamicznie się zmieniać. Korzystając z dynamicznego inventory, firmy mogą skupić się na rozwijaniu i utrzymywaniu swoich aplikacji. Szczególnie w kontekście DevOps, dynamiczne inventory jest kluczowym elementem umożliwiającym szybkie i bezpieczne wdrażanie zmian oraz utrzymanie wysokiej dostępności i skalowalności aplikacji.
Zostaw komentarz
Musisz się zalogować lub zarejestrować aby dodać nowy komentarz.