Ansible – Wystartuj z Infrastructure as Code w 30 Sekund. To Dziecinnie Proste!

Jakub Muszyński
06/03/2018

Słyszałeś o Ansible, ale nie wiesz, jak zacząć? To banalnie proste. Zapomnij o opasłych książkach, wielogodzinnych tutorialach i latach praktyki.

Wszystko, czego potrzebujesz, aby wystartować z Ansible, to kilka minut poświęconych na przeczytanie naszego artykułu. Gotowy?

Ansible Krok Po kroku. Co To Jest i Jak Zacząć?

Ansible jest niezwykle elastycznym i zarazem prostym do opanowania narzędziem do automatyzacji zadań i procesów, które pozwoli Ci efektywnie zarządzać infrastrukturą fizyczną (np. serwerami, komputerami, urządzeniami sieciowymi, routerami), czy chmurą (AWS, Azure, i innymi).

Bezsprzeczną zaletą narzędzia jest jego bardzo (bardzo, bardzo, bardzo!) wysoka przystępność. Pracę z Ansible naprawdę da się zacząć w 30 sekund, zupełnie nie znając podstaw! Opanowanie wszystkich możliwości, jakie oferuje, wymaga 1-2 dni praktyki, ale już od pierwszej minuty poczujesz potęgę tego rozwiązania!

No dobrze, pora przejść od słów do czynów.

Przykład Konfiguracji Ansible w 30 Sekund. Prawdziwa Historia

Na forum naszej społeczności SysOps/Devops pojawiło się kiedyś następujące pytanie:

„Jak mógłbym przyjemnie zaktualizować oprogramowanie na kilku raspberry pi, które posiadam? Obecnie muszę się logować po ssh. Myślałem o jakimś skrypcie w bashu, który w pętli przejdzie po urządzeniach, słyszałem też o Ansible – ale jak to zrobić?”

 A oto co napisałem w odpowiedzi:

pip install ansible
echo -e ‘[grupa_rpi] \n rpiA \n rpiB` >> /etc/ansible/hosts
ansible -m shell -a ‘tu wstaw swoją komendę instalacji’ grupa_rpi

Tyle! Stworzenie tej porady zajęło mi 30 sekund!!!

Oczywiście, powyższa komenda odnosi się do konkretnego przypadku i nie jest zoptymalizowana. Jednak moim celem było pokazanie możliwości wykonania skryptu w jednej linii i zaprezentowanie, z jaką łatwością możecie zastąpić komendy ssh modułem Ansible shell.

Parę sekund później uzupełniłem komentarz o 25-minutowe wideo (w języku ang.) Ansible 101 – on a Cluster of Raspberry Pi 2s przygotowane przez Jeffa Gerlinga, jednego z najbardziej aktywnych propagatorów Ansible w społeczności międzynarodowej. Dodałem go jako jeden z wielu przykładów na to, jak łatwo zacząć swoją przygodę z narzędziem.

Ansible oferuje Wam prostotę, wydajność i wygodę. Doprawdy żal z niego nie skorzystać.

Umiesz Liczyć? Licz Na Społeczność

Jeśli szukasz informacji na temat Ansible, nie jesteś zdany na siebie. Jest to jeden z najbardziej dynamicznych projektów na Github, z zaangażowaną i aktywną społecznością. Dzieje się tak pewnie dlatego, że to narzędzie proste w obsłudze, wszechstronne i przydatne. Warto w nie inwestować również dlatego, że ciągle się rozwija. Jeśli brakuje w nim jakiejś funkcjonalności, możesz być pewien, że niedługo się pojawi.

Github-statystyki-luty-marzec-2018
Statystyki Ansible: luty – marzec 2018

Jak Skorzystać z Pomocy Społeczności Ansible?

Ale w czym właściwie może Ci pomóc społeczność Ansible?

1.   Pomoc przy rozwiązywaniu problemów

Po pierwsze, społeczność okazuje się nieoceniona zwłaszcza, kiedy stawiasz pierwsze kroki z Ansible. Ile razy ślęczałeś nad skryptami dniami i nocami, nie wiedząc, jak zautomatyzować jakiś proces? Używając Ansible, nie jesteś sam!

Jeśli masz jakiekolwiek pytanie, nie możesz poradzić sobie z jakimś problemem, to zarówno na forum globalnym jak i na naszym lokalnym „podwórku” uzyskasz pomoc zazwyczaj w ciągu 5-30 minut od zadania pytania (no dobra, w nocy czasem trzeba uzbroić się w większą cierpliwość 🙂 ).

To naprawdę jest potęga, której nie sposób przecenić!

2.   Gotowe rozwiązania na wyciągnięcie ręki

To jeszcze nie wszystko. Powiedzmy, że chcesz zainstalować i skonfigurować jakiś program (nawet taki, którego nie znasz). Niespodzianka! Prawdopodobnie znajdziesz gotowy skrypt w Internecie! Nie musisz odkrywać koła na nowo, z Ansible oszczędzisz swój czas.

No dobrze, Ale Jak Najlepiej Zacząć Przygodę z Ansible?

Już odpowiadam.

Po pierwsze, czytaj dalej. Krok po kroku przeprowadzę Cię przez instalację Ansible i pierwsze komendy.

Po drugie, na samym końcu artykułu znajdziesz sporo superprzydatnych linków do wideo z meetupów SysOps/DevOps, które bardzo polecam.

Tyle Teorii, Pora na Ansible w Praktyce!

Ansible możemy zainstalować na wiele sposobów:

  • Za pomocą managera paczek naszego systemu, np. Debian/Ubuntu:
    apt-get install ansible
  • Za pomocą managera paczek języka Python:
    pip install ansible
  • Pobierając Ansible bezpośrednio z Github.com – klonując repozytorium lub pobierając plik archiwum (np. zip).

UWAGA: Ja polecam instalację niezależną od naszego systemu w środowisku wirtualnym Pythona – virtualenv [Artykuł o virtualenv dla ciekawych]:

pip install virtualenv
virtualenv nasz_venv
source nasz_venv/bin/activate
pip install ansible

Powyższy proces można sobie uprościć, używając przygotowanego przeze mnie na potrzeby szkoleń (i używanego w podobnej formie produkcyjnie w mojej firmie) środowiska dostępnego na github.com.

  • Najpierw instalujemy wymagane pakiety, których używam w swojej pracy (zazwyczaj opcjonalne):
sudo apt-get install python-virtualenv libpq-dev python-all-dev libffi-dev
  • Następnie klonujemy moje repozytorium:
git clone https://github.com/sirkubax/szkolenie3
cd szkolenie3
source environment.sh
  • I już możemy wykonywać akcje. Oto najprostsza z nich:
ansible -m ping all

Co tu się właściwie stało?

Kilka słów wyjaśnienia odnośnie tego, co właśnie zrobiliśmy.

Kluczowe operacje wykonywane są na dwóch etapach, podczas instalacji pakietów dodatkowych oraz przy instalacji pliku environment.sh. To w nim tworzony jest katalog ze środowiskiem wirtualnym Pythona o nazwie venv, następnie ładowany jest on do kontekstu naszej konsoli source venv/bin/activate, po czym instalowany jest Ansible z zależnościami pip install -r requirements.txt.

Komentarz do virtualeny

Przy ponownym otwarciu terminala musimy załadować ponownie kontekst naszego środowiska wirtualnego scieżka_do_katalogu/venv/bin/activate. Tę linię można również dodać do naszego pliku terminala, np. ~/.bashrc .

 Przykładowy wynik powyższej komendy powinien wyglądać tak:

# Ta komenda ‘pinguje’ localhost zdefiniowany w domyślnym inventory /etc/ansible/hosts 
$ ansible -m ping localhost
# otrzymamy taki wynik
localhost | SUCCESS => {
 "changed": false, 
 "ping": "pong"
}

Prawda, że to proste?

Gratulacje! Instalacja Ansible Zakończona Sukcesem!

Zainstalowałeś Ansible i sprawdziłeś komunikację ze wszystkimi serwerami w swojej infrastrukturze (domyślnie jest to localhost). Jeśli używałeś virtualenv, to dodatkowo masz jeszcze niezależną od systemu instalację Ansible, co samo w sobie ma wiele plusów. Ale o tym kiedy indziej😉

Jasne, instalacja i konfiguracja Ansible to rzeczywiście pestka. Ale jak robić ciekawsze rzeczy, skomplikowane, wieloetapowe skrypty, automatyzację??

Wszystko po kolei.

Ansible – Zaawansowane Przykłady

Aby móc zmierzyć się z bardziej zaawansowanymi przykładami wykorzystania Ansible, musisz poznać kilka podstawowych pojęć:

  • Moduł – komenda (podprogram), którą wykonujemy. W przykładzie powyżej użyliśmy modułu ping.
  • Task – tak nazywamy użycie modułu w „skrypcie Ansible” zwanym playbook.
  • Playbook – to plan wykonania, czyli nasz skrypt zawierający definicję hostów, zmienne i zbiór zadań (tasków), które będziemy uruchamiać.

Zobaczmy, jak może wyglądać przykładowy playbook, który ’przejdzie’ po naszych serwerach i wykona jakąś prosta akcję. Użyjemy banalnego przykładu sprawdzenia daty i miejsca na dysku i wypisania ich w naszym terminalu.

Językiem formatowania playbooków jest YAML [wikipedia Yaml]. Wymusza on odpowiednie wcięcia tekstu.

- hosts: all
 
  tasks:
    - name: "ping all"
      ping:
 
    - name: "execute a shell command"
      shell: "date; whoami; df -h;"

Przykład Ansible – Wyjaśnienie

Na wszystkich maszynach zdefiniowanych w naszym Inventory wykonujemy moduł ping (który zwraca pong jeśli komunikacja przebiega prawidłowo), a następnie sprawdzamy datę na maszynie – date, kim jesteśmy – whoami i zajęcie dysku za pomocą modułu shell.

Nic skomplikowanego – ale to dopiero początek…

Przy okazji padło tu kolejne pojęcie:

  • Inventory – to zbiór naszych obiektów (maszyn, urządzeń, komputerów) + przydatne zmienne.

No dobrze, a jak to uruchomić?

Ano tak:

$ ansible-playbook sciezka/nazwa_playbooka.yml

Tutaj mała ciekawostka: powyższe moduły uruchamiane ręcznie z konsoli wyglądałyby tak:

$ ansible -m ping all
$ ansible -m shell -a 'date; whoami' all

Czy warto więc pisać playbooki? Oczywiście. Wyobraź sobie skomplikowaną instalację oprogramowania składającą się z wielu etapów, z dodatkową logiką. Z poziomu konsoli jest to zadanie nie do odtworzenia. Dzięki playbookom możemy je wykonać dowolną liczbę razy.

Co dalej?

To dopiero początek drogi. Playbook jako zbiór zadań nabiera mocy dzięki temu, że można go uruchamiać wielokrotnie. Wspomniałem wyżej, że zadania w playbooku mogą mieć „logikę”.

Wyobraźmy sobie, że instalujemy serwery Apache i chcemy skonfigurować parametry (np. poziom logowania czy ilość przydzielonej pamięci) zależnie od tego, co zastaniemy na docelowym serwerze. Musimy wtedy jakoś sprawdzić ich wartość (przed wykonaniem playbooka lub dynamicznie w trakcie wykonania), a ten parametr – zmienną – umieścić w docelowej konfiguracji.

Zaznaczam, że to przykładowy i nieco bardziej zaawansowany playbook. Nie przejmuj się, jeśli niektóre rzeczy wydadzą Ci się skomplikowane, moim głównym celem było pokazanie Ci możliwości narzędzia, choć przyznam już w tym miejscu, że dokonałem pewnych uproszczeń (na prawdziwym środowisku produkcyjnym zrobiłbym to inaczej). Na przykład, osobiście nie lubię modułu lineinfile i zamiast niego polecam template, ale to już materiał na kolejny artykuł.

Poniżej załączam playbook z  prostą instalacją Apache, lineinfile (do ustawienia poziomu logowania) + handler.

- hosts: apache
  become: True

  vars:
       apache2_log_level: "info"

  handlers:
  - name: restart apache
    service: 
      name: apache
      state: restarted
      enabled: True
    notify: 
      - Wait for instances to listen on port 80

  - name: reload apache
    service: 
      name: apache
      state: reloaded
    notify: 
      - Wait for instances to listen on port 80

  - name: Wait for instances to listen on port 80
    wait_for: 
      state: started 
      host: localhost 
      port: 80 
      timeout: 15 
      delay: 5

  tasks:
  - name: Update apt cache 
    apt: update_cache=yes cache_valid_time=7200

  - name: Install packages
    apt: name={{ item }}
    with_items:
      - apache2
    notify:
     - restart apache

  - name: Configure apache2 log level
    lineinfile:
       dest: /etc/apache2/apache2.conf
       line: "LogLevel {{ apache2_log_level }}"
       regexp: "^LogLevel"
    notify:
     - reload apache

Uruchomenie playbooka:

ansible-playbook playbooks/install_apache_example.yml

Wynik takiego playbooka może wyglądać tak (dla przypadku gdy serwer był uprzednio skonfigurowany).

PLAY [apache] ******************************************************************

TASK [Update cache] ************************************************************
Friday 02 March 2018 18:57:53 +0100 (0:00:00.060) 0:00:00.060 **********
ok: [mgmt2.muszynski.pro]

TASK [Install packages] ********************************************************
Friday 02 March 2018 18:58:00 +0100 (0:00:06.167) 0:00:06.227 **********
ok: [mgmt2.muszynski.pro] => (item=[u'apache2'])

TASK [configure apache2 log level] *********************************************
Friday 02 March 2018 18:58:01 +0100 (0:00:01.214) 0:00:07.441 **********
ok: [mgmt2.muszynski.pro]

PLAY RECAP *********************************************************************
mgmt2.muszynski.pro : ok=3 changed=0 unreachable=0 failed=0

STOP! Pora na Ważny Komunikat: Webinar + Szkolenie

Liczba zastosowań Ansible oraz bogactwo jego funkcjonalności dostarczają materiału na niejeden artykuł. Można by poświęcić im wręcz całą serię wydawniczą. Nie wspomniałem na przykład w ogóle o szablonach i re-używalności, to jest o rolach. Przed nami także jeszcze inne bardzo ciekawe tematy takie jak czerpanie gotowych szablonów ze społeczności czy zarządzanie zmiennymi.

Biorąc pod uwagę powyższe, wspólnie z chłopakami z Chmurowiska postanowiliśmy przygotować PRAKTYCZNY WEBINAR, na który już teraz Cię zapraszamy. W jego trakcie pokażę Ci dużo więcej dobrych praktyk wdrażania automatyzacji w IT oraz traktowania infrastruktury i chmury jako kod. A jeżeli zechcesz zostać mistrzem Ansible i rozwijać skrzydła z moją pomocą, z przyjemnością przywitam Cię na moim 2-dniowym szkoleniu „Ansible w Chmurze – Droga Eksperta!”.

P.S. Ansible – linki, linki, linki

A oto i obiecane link do prelekcji z meetupów SysOps/DevOps:

Zachęcam do obejrzenia i do zobaczenia na webinarze, ZAREJESTRUJ SIĘ na niego jak najszybciej!

 

AKTUALNOŚCI
16/09/20212 min
Webinar: Jak wykorzystać konto Sandbox w pracy zespołu IT?

Zastanawialiście się kiedyś gdzie bezpiecznie testować wszystkie innowacyjne pomysły i rozwiązania zespołów IT korzystających z usług chmurowych? Albo jak stworzyć optymalne warunki do nauki?
Każdy zespół pracujący z chmurą potrzebuje przestrzeni do innowacji…

Zobacz wpis
AKTUALNOŚCI
20/08/20212 min
Webinar: Oracle praktycznie – Co się w chmurze opłaca?

Już 8 września 2021 roku o godzinie 11:00 odbędzie się pierwszy webinar z serii „Oracle praktycznie: Co się w chmurze opłaca? — czyli o kosztach w Oracle…i nie tylko.”

Zobacz wpis
AKTUALNOŚCI
12/08/20212 min
[ Poszukiwani ] Cloud Architekci ze znajomością Azure, AWS, GCP lub Oracle

Rośniemy. Jednak jest to spore wyzwanie. Budowanie Zespołu wspierającego największe przedsiębiorstwa w poruszaniu się po chmurowym świecie to duża odpowiedzialność.

Zobacz wpis
AKTUALNOŚCI
Webinar: Jak wykorzystać konto Sandbox w pracy zespołu IT?

Zastanawialiście się kiedyś gdzie bezpiecznie testować wszystkie innowacyjne pomysły i rozwiązania zespołów IT korzystających z usług chmurowych? Albo jak stworzyć optymalne warunki do nauki?
Każdy zespół pracujący z chmurą potrzebuje przestrzeni do innowacji…

Zobacz wpis

Zapisz się do naszego newslettera i
bądź z chmurami na bieżąco!

Zostaw nam swój e–mail a co miesiąc dostaniesz spis najważniejszych nowości
z chmur Azure, AWS i GCP, z krótkimi opisami i linkami.