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.