Wprowadzenie
W dzisiejszych czasach serwery muszą być tworzone i usuwane bardzo często. Dzieje się tak dlatego, że czasami serwery są bardzo obciążone, podczas gdy w innych momentach obciążenie spada, co powoduje marnowanie zasobów systemowych. Typowym przykładem są witryny e-commerce w okresie świątecznym, które przyciągają duży ruch. Gdy aplikacja ma charakter skalowalny, zawsze istnieje potrzeba posiadania narzędzi do zarządzania konfiguracją, aby ułatwić ogólny proces tworzenia serwerów. Ansible to świetne narzędzie do zarządzania konfiguracją, które automatyzuje tworzenie serwerów przy użyciu standardowych procedur, redukując błędy ludzkie.
Ansible nie wymaga instalowania specjalnego oprogramowania na węzłach serwerów. Posiada wszystkie narzędzia niezbędne do pisania, budowania i ułatwiania automatyzacji skryptów. Ten samouczek szczegółowo opisuje, jak używać Ansible do automatyzacji kroków zawartych w naszym Jak skonfigurować serwer Ubuntu samouczku.
Wymagania wstępne
Aby ukończyć ten przewodnik, będziemy używać Ubuntu 20.04. Ponadto będziesz również potrzebować:
-
Węzeł kontrolny Ansible: Maszyna z systemem Ubuntu z uruchomioną najnowszą wersją Ubuntu. Główny plik binarny Ansible musi być zainstalowany i uruchomiony na tej maszynie. Maszyna ta powinna być w stanie połączyć się z węzłami Ansible. Do tych połączeń należy użyć kluczy SSH. Aby uniknąć problemów podczas łączenia, upewnij się, że węzeł kontrolny Ansible ma włączoną zaporę sieciową. Jeśli potrzebujesz pomocy, zapoznaj się z naszym wpisem na blogu Instalacja i konfiguracja Ansible na Ubuntu 20.04.
-
Hosty Ansible: Do połączenia wymagany jest jeden lub więcej hostów. Hosty to zasadniczo zarządzane węzły w Ansible. Muszą to być serwery Ubuntu.
Funkcje playbooka Ansible
Możesz ręcznie wykonać wszystkie poniższe kroki. My jednak zautomatyzujemy to wykonanie. Po uruchomieniu tego playbooka wykona on następujące operacje na Twojej maszynie:
-
Zainstaluje aptitude, który jest preferowany przez Ansible jako menedżer pakietów.
-
Utworzy grupę administracyjną wheel z uprawnieniami sudo bez hasła.
-
Utworzy nowego użytkownika sudo.
-
Skopiuje lokalny klucz SSH do authorized_keys. Ma on być używany dla nowego użytkownika administracyjnego na zdalnym hoście.
-
Wyłączy uwierzytelnianie oparte na haśle dla użytkownika root.
-
Zainstaluje niezbędne pakiety.
-
Skonfiguruje zaporę sieciową UFW tak, aby zezwalała tylko na połączenia SSH. Wszelkie inne połączenia zostaną zablokowane.
Po zakończeniu wykonywania playbooka dostępny będzie nowy użytkownik. Możesz użyć tego użytkownika do zalogowania się do systemu.
Używanie playbooka Ansible
Aby skonfigurować serwer, będziesz potrzebować playbooka do wstępnej konfiguracji serwera oraz jego zależności. Jeśli używasz go po raz pierwszy, musisz sklonować repozytorium za pomocą poniższego linku:
|
1 |
cd ~ |
|
1 |
git clone https://github.com/do-community/ansible-playbooks.git |
|
1 |
cd ansible-playbooks |
Jeśli repozytorium już istnieje w Twoim systemie, uruchom poniższe polecenie, aby pobrać najnowsze aktualizacje:
|
1 |
cd ~/ansible-playbooks |
|
1 |
git pull |
Na swojej maszynie otrzymasz poniższą strukturę plików:
|
1 2 3 4 |
setup |-- playbook.yml |__vars |-- default,yml |
Poniżej znajduje się opis plików:
-
vars/default.yml: Ten plik zawiera zmienne do konfiguracji węzła Ansible.
-
playbook.yml: Ten plik zawiera zadania, które mają zostać wykonane na serwerze.
Plik vars/default.yml wygląda mniej więcej tak:
|
1 2 3 4 |
--- create_user: my_user copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}" sys_packages: [ 'curl', 'vim', 'git', 'ufw'] |
Poniżej znajduje się opis tych zmiennych. Jeśli chcesz je edytować, możesz zastąpić ich wartości własnymi:
-
create_user: To jest użytkownik, który zostanie utworzony. Ten użytkownik posiada uprawnienia sudo.
-
copy_local_key: Zawiera ścieżkę do lokalnego klucza publicznego SSH. Zostanie on skopiowany na serwer zdalny jako authorized_key.
-
sys_packages: Jeśli chcesz zainstalować jeden lub więcej pakietów na swoim serwerze, wymień je tutaj jako tablicę.
Po edycji tego pliku zapisz jego zawartość. Następnie w programie nano naciśnij CTRL+X , Y. Następnie, ENTER, aby zapisać zawartość pliku.
Teraz możesz uruchomić ten playbook na wielu serwerach. Domyślnie playbooki są gotowe do wykonania na serwerach znajdujących się w Twoim pliku inventory. Jeśli chcesz użyć playbooka na określonych serwerach, możesz użyć flagi -l. Załóżmy teraz, że serwer zdalny ma wielu użytkowników, możesz użyć flagi -u, aby wskazać, z którym użytkownikiem ma nastąpić połączenie.
Jeśli nazwa Twojego serwera to my_server, a nazwa użytkownika to my_user, uruchom poniższe polecenie, aby wykonać je na węzłach Ansible:
|
1 |
ansible-playbook playbook.yml -l my_server -u my_user |
Otrzymasz wynik podobny do poniższego:
|
1 2 3 4 5 6 7 8 9 |
PLAY [all] ***************************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************** ok: [my_server] TASK [Install Prerequisites] *********************************************************************************************************** changed: [my_server] TASK [Make sure we have a 'wheel' group] *********************************************************************************************** changed: [my_server] TASK [Allow 'wheel' group to have passwordless sudo] *********************************************************************************** changed: [my_server] |
Po zakończeniu tego wykonywania możesz połączyć się za pomocą poniższego polecenia:
|
1 |
ssh my_user@server_host_or_IP |
Pamiętaj, że my_user to nazwa, której użyliśmy w pliku vars/default.yml. W powyższym poleceniu musisz również zmienić adres IP serwera na adres IP swojego serwera. Jeśli podałeś zmienną copy_local_key wskazującą na niestandardowy klucz SSH, określ lokalizację za pomocą przełącznika -i:
|
1 |
ssh my_user@server_host_or_IP -i ~/.ssh/ansible_controller_key |
Następnie zaloguj się na swój serwer, aby sprawdzić reguły zapory UFW:
|
1 |
sudo ufw status |
Otrzymasz następujący wynik:
|
1 2 3 4 5 |
Stan: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) |
Powyższy wynik potwierdza, że zapora UFW została pomyślnie skonfigurowana. Był to ostatni krok w naszym playbooku. Jeśli został wykonany poprawnie, oznacza to, że uruchomienie zakończyło się sukcesem.
Zawartość playbooka Ansible
Pliki playbooka użyte w tym samouczku są hostowane na ansible-playbooks/setup_ubuntu1804 at master · do-community/ansible-playbooks · GitHub. Jeśli chcesz zobaczyć zawartość każdego pliku, aby go użyć lub edytować, kliknij przycisk Raw na górze każdego skryptu.
Dla szybkiego odniesienia udostępniamy pełną zawartość playbooka wraz z odpowiednimi plikami:
-
vars/default.yml
Ten plik zawiera wartości, które będą używane przez zadania playbooka. Obejmują one takie wartości jak nazwa użytkownika, uprawnienia, klucze SSH, pakiety do zainstalowania w ramach wstępnej konfiguracji i tak dalej:
|
1 2 3 4 |
--- create_user: my_user copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}" sys_packages: [ 'curl', 'vim', 'git', 'ufw'] |
-
playbook.yml
Plik playbook.yml zawiera zadania, które mają zostać wykonane. Po pierwsze, plik zawiera listę wszystkich hostów docelowych. Jeśli chcesz określić wszystkie serwery, ustaw wartość tego klucza na all. Następnie, jeśli chcesz określić zadania do wykonania z uprawnieniami sudo, ustawiasz wartość zmiennej become: true. Na koniec plik ten musi zawierać zawartość powyższego pliku vars/default.yml. Dołączamy je poniżej, aby załadować ustawienia z tego pliku:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
--- - hosts: all become: true vars_files: - vars/default.yml tasks: - name: Zainstaluj wymagania wstępne apt: name=aptitude update_cache=yes state=latest force_apt_get=yes # Konfiguracja grupy Sudo - name: Upewnij się, że mamy grupę 'wheel' group group: name: wheel state: present - name: Zezwól grupie 'wheel' na sudo bez hasła lineinfile: path: /etc/sudoers state: present regexp: '^%wheel' line: '%wheel ALL=(ALL) NOPASSWD: ALL' validate: '/usr/sbin/visudo -cf %s' # Konfiguracja użytkownika i klucza - name: Utwórz nowego zwykłego użytkownika z uprawnieniami sudoprivileges user: name: "{{ create_user }}" state: present groups: wheel append: true create_home: true shell: /bin/bash - name: Ustaw autoryzowany klucz dla użytkownika zdalnego authorized_key: user: "{{ create_user }}" state: present key: "{{ copy_local_key }}" - name: Wyłącz logowanie hasłem dla root lineinfile: path: /etc/ssh/sshd_config state: present regexp: '^#?PermitRootLogin' line: 'PermitRootLogin prohibit-password' # Instalacja pakietów - name: Zaktualizuj apt apt: update_cache=yes - name: Zainstaluj wymagane pakiety systemowe apt: name={{ sys_packages }} state=latest # Konfiguracja UFW - name: UFW - Zezwól na połączenia SSH ufw: rule: allow name: OpenSSH - name: UFW - Domyślnie blokuj cały inny ruch przychodzącydefault ufw: state: enabled policy: deny direction: incoming |
Podsumowanie
Automatyzacja jest kluczem w IT, zapewniając, że wszystkie procesy są wolne od błędów i są zgodne ze standardowymi praktykami i procedurami. Ponieważ większość dzisiejszego oprogramowania jest dostarczana przez Internet i ma charakter rozproszony, tworzenie nowych serwerów, np. dla różnych środowisk, takich jak testowe (staging), produkcyjne, a nawet demonstracyjne, stało się codziennym zadaniem.
W tym samouczku pokazaliśmy, jak osiągnąć automatyzację serwerów za pomocą Ansible – potężnego i łatwego w użyciu narzędzia, które pozwala zaoszczędzić mnóstwo czasu.
Miłego korzystania!
Komentarze
Brak komentarzy. Bądź pierwszy.