Wyszukiwanie w witrynie

Jak tworzyć gry i podręczniki Ansible — część 5


W tej części 5 serii Ansible wyjaśnimy, jak tworzyć gry Ansible i poradniki przy użyciu modułów Ansible.

Ansible jest dostarczany z samodzielnymi skryptami zwanymi modułami, które są używane w podręcznikach do wykonywania wyspecjalizowanych zadań na zdalnych węzłach.

Moduły przydają się do automatyzacji zadań, takich jak zarządzanie pakietami, archiwizacja i kopiowanie plików, żeby wymienić tylko kilka. Umożliwiają wprowadzanie zmian w plikach konfiguracyjnych i zarządzanie urządzeniami, takimi jak routery, przełączniki, moduły równoważenia obciążenia, zapory ogniowe i wiele innych urządzeń.

Celem tego podtematu jest przedstawienie przeglądu różnych zadań, które można wykonać za pomocą modułów Ansible:

Zarządzanie pakietami w systemie Linux

Zarządzanie pakietami jest jednym z najważniejszych i częstych zadań administratorów systemów. Ansible jest dostarczany z modułami, które pomagają wykonywać zadania związane z zarządzaniem pakietami zarówno w systemach opartych na RedHat, jak i Debianie.

Można je stosunkowo łatwo odgadnąć. Istnieje moduł apt do zarządzania pakietami APT dla Debiana, stary moduł yum do zarządzania pakietami YUM i moduł dnf powiązany z nowszymi dystrybucjami RHEL .

Poniżej znajduje się kilka przykładów wykorzystania modułów w podręczniku:

Przykład 1: Instalowanie serwera WWW Apache na RHEL 8

---
- name: install Apache webserver
  hosts: webservers

  tasks:
       - name: install httpd
         dnf:  
          name: httpd  
          State: latest

Przykład 2: Instalacja serwera WWW Apache na Debianie 10

---
- name: install Apache webserver
  hosts: databases

  tasks:
       - name: install Apache webserver
         apt:  
          name: apache2  
          State: latest

Moduł serwisowy

Moduł usług umożliwia administratorom systemu uruchamianie, zatrzymywanie, aktualizację, aktualizację i ponowne ładowanie usług w systemie.

Przykład 1: Uruchamianie serwera WWW Apache

---
- name: Start service httpd, if not started
  service:
    name: httpd
    state: started

Przykład 2: Zatrzymywanie serwera WWW Apache

---
- name: Stop service httpd
  service:
    name: httpd
    state: stopped

Przykład 3: Ponowne uruchamianie interfejsu sieciowego enp2s0

---
- name: Restart network service for interface eth0
  service:
    name: network
    state: restarted
    args: enp2s0

Moduł kopiowania

Jak sama nazwa wskazuje, moduł kopiowania kopiuje pliki z jednej lokalizacji na zdalnym komputerze do innej lokalizacji na tym samym komputerze.

Przykład 1: Kopiowanie plików z lokalnego do zdalnego systemu Linux

---
- name: Copy file with owner and permissions
  copy:
    src: /etc/files/tecmint.conf
    dest: /srv/tecmint.conf
    owner: tecmint
    group: tecmint
    mode: '0644'

Podręcznik kopiuje plik konfiguracyjny tecmint.conf z katalogu /etc/files/ do katalogu /srv/ jako tecmint > użytkownik z uprawnieniami 0644.

Uprawnienia można również przedstawić za pomocą reprezentacji symbolicznej, jak pokazano w ostatnim wierszu.

Przykład 2: Kopiowanie plików z lokalnego do zdalnego systemu Linux

---
- name: Copy file with owner and permissions
  copy:
    src: /etc/files/tecmint.conf
    dest: /srv/tecmint.conf
    owner: tecmint
    group: tecmint
    mode: u=rw, g=r, o=r

Uprawnienia z poprzedniego przykładu można przedstawić w sposób pokazany w ostatnim wierszu: użytkownikowi przypisano uprawnienia odczytu i zapisu, grupie przypisano uprawnienia do zapisu, a reszta świat ma przypisane uprawnienia do odczytu.

Moduł plików

Moduł plików służy do wykonywania wielu operacji na plikach, w tym do tworzenia plików i katalogów, przypisywania uprawnień do plików i ustawiania dowiązań symbolicznych.

Przykład 1: Wykonaj uprawnienia do plików w systemie Linux

---
- name: Change file ownership, group, and permissions
  file:
    path: /etc/tecmint.conf
    owner: tecmint
    group: tecmint
    mode: '0644'

Powyższa gra tworzy plik o nazwie tecmint.conf w katalogu /etc, ustawiając uprawnienia na 0644.

Przykład 2: Usuń plik Linux

---
- name: Remove file (delete file)
  file:
    path: /etc/tecmint.conf
    state: absent

Spowoduje to usunięcie lub usunięcie pliku tecmint.conf.

Przykład 3: Utwórz katalog

---
- name: create a directory if it doesn’t exist
  file:
    path: /etc/mydirectory
    State: directory
    mode: '0777'

Spowoduje to utworzenie katalogu w katalogu /etc i ustawienie uprawnień na 0777.

Przykład 4: Rekurencyjne usuwanie katalogu

---
- name: Recursively deleting a  directory
  file:
    path: /etc/tecmint.conf
    state: absent

Powyższe odtwarzanie rekurencyjnie usuwa katalog.

Moduł pliku liniowego

Moduł lineinfile jest pomocny, gdy chcesz zmienić pojedynczą linię w pliku. Może zastąpić istniejącą linię.

Przykład 1: Manipuluj plikami w systemie Linux

---
 - name: Ensure SELinux is set to enforcing mode
  lineinfile:
    path: /etc/selinux/config
    regexp: '^SELINUX='
    line: SELINUX=disabled

Powyższa gra ustawia wartość SELINUX na wyłączoną.

SELINUX=disabled

Przykład 2: Zmień pliki w systemie Linux

---
- name: Add a line to a file if the file does not exist, without         passing regexp
  lineinfile:
    path: /etc/hosts
    line: 10.200.50.51 linux-console.net
    create: yes

Spowoduje to dodanie wpisu 10.200.50.51 linux-console.net do pliku /etc/hosts.

Moduł Archiwum

Moduł Archiwum służy do tworzenia skompresowanego archiwum jednego lub wielu plików. Zakłada się, że źródło kompresji istnieje w docelowym miejscu docelowym. Po zarchiwizowaniu plik źródłowy można później usunąć lub usunąć za pomocą instrukcji remove=True.

Przykład 1: Utwórz plik archiwum

- name: Compress directory /path/to/tecmint_dir/ into /path/to/tecmint.tgz
  archive:
    path: /path/to/tecmint_dir
    dest: /path/to/tecmint.tgz

This compresses the /path/to/tecmint_dir  directory to /path/to/tecmint.tgz

Przykład 2: Utwórz plik archiwum i usuń

- name: Compress regular file /path/to/tecmint into /path/to/foo.gz and remove it
  archive:
    path: /path/to/tecmint
    dest: /path/to/tecmint.tgz
    remove: yes

W powyższym odtwarzaniu plik źródłowy /path/to/tecmint jest usuwany po zakończeniu archiwizacji.

Przykład 3: Utwórz plik archiwum

- name: Create a bz2 archive of /path/to/tecmint
  archive:
    path: /path/to/tecmint
    format: bz2

Spowoduje to utworzenie skompresowanego pliku w formacie bz2 z pliku /path/to/tecmint.

Moduł Gita

Moduł zarządza git checkoutami repozytoriów oprogramowania.

Przykład 1: Sprawdź repozytoria Git

- git:
    repo: 'https://foosball.example.org/path/to/repo.git'
    dest: /srv/checkout
    version: release-0.22

Moduł dowodzenia

Jeden z najczęściej używanych modułów, moduł poleceń, pobiera nazwę polecenia, po której następuje lista argumentów. Polecenie jest przekazywane w ten sam sposób, w jaki wpisuje się je w powłoce systemu Linux.

Przykład 1: Uruchom polecenie

- name: Executing a command using the command module
  command: cat helloworld.txt

Przykład 2: Sprawdź czas działania zdalnego systemu Linux

---
 - name: Check the remote host uptime
    hosts: servers
    tasks:
      - name: Execute the Uptime command over Command module
        register: uptimeoutput
        command: "uptime"

- debug:
          var: uptimeoutput.stdout_lines

Moduł poleceń pobiera czas pracy zdalnych serwerów.

Zmienne służące do pobierania wyników wykonywania poleceń

Zwykle podręczniki Ansible są używane do wykonywania zadań na zarządzanych hostach bez wyświetlania wyników w wierszu poleceń. Są jednak przypadki, w których może być konieczne przechwycenie danych wyjściowych lub wyników. W tej sekcji przeprowadzimy Cię przez proces przechwytywania wyników podręcznika w zmiennej, a następnie wyświetlania ich.

Rejestr ansible służy do przechwytywania wyników zadania i zapisywania ich jako zmiennej. Zmienna będzie odtąd zawierać standardowe wyjście zadania.

Załóżmy na przykład, że chcesz sprawdzić wykorzystanie dysku przez zarządzane węzły w odpowiednich katalogach głównych za pomocą polecenia df -Th /. Zamierzasz użyć modułu „polecenie” do zdefiniowania polecenia i „rejestr” do zapisania standardowego wyjścia w zmiennej.

Aby wyświetlić polecenie, użyjesz modułu „debug” obok wartości zwracanej przez standardowe wyjście.

---

 - hosts: all
   become: yes

   tasks:
     - name: Execute /boot usage on Hosts
       command: 'df -Th /'
       register: df

     - debug: var=df.stdout

Teraz uruchommy podręcznik. W tym przypadku nazwaliśmy nasz podręcznik check_disk_space.yml.

ansible-playbook check_disk_space.yml

Jak widzieliście, wszystkie wyniki są pomieszane i utrudniają śledzenie.

Aby wyrównać dane wyjściowe i ułatwić ich odczytanie, zamień wartość zwracaną stdout na stdout_lines.

---

 - hosts: all
   become: yes

   tasks:
     - name: Execute /boot usage on Hosts
       command: 'df -Th /'
       register: df

     - debug: var=df.stdout_lines

Użyj warunków warunkowych, aby kontrolować wykonanie gry

Podobnie jak w językach programowania, instrukcji warunkowych używa się, gdy możliwy jest więcej niż jeden wynik. Rzućmy okiem na niektóre powszechnie używane instrukcje warunkowe w podręcznikach Ansible.

Kiedy stwierdzenie

Czasami możesz chcieć wykonać zadania na określonych węzłach, a nie na innych. Instrukcja warunkowa 'kiedy' jest dość łatwa w użyciu i implementacji w podręczniku. Używając klauzuli 'When', po prostu zadeklaruj warunek sąsiadujący z klauzulą, jak pokazano:

when: condition

Gdy warunek jest spełniony, zadanie jest wykonywane na systemie zdalnym.

Sprawdźmy kilka przykładów:

Przykład 1: Użycie operatora When

---
- hosts: all

  tasks:
  - name: Install Nginx on Debian
     apt: name=nginx state=present
     when: ansible_os_family == “Debian”

Powyższa gra instaluje serwer WWW Nginx na hostach, na których działają dystrybucje z rodziny Debian.

Oprócz instrukcji warunkowej When możesz także użyć operatorów OR i AND.

Przykład 2: Używanie operatora AND z Kiedy

---
- hosts: all

  tasks:
  - name: Install Nginx on Debian
     apt: name=nginx state=present
     when: ansible_os_family == “Debian” and
           ansible_distribution_version == “18.04”

W przypadku użycia operatora AND obie instrukcje muszą być spełnione, aby zadanie zostało wykonane.

Powyższa gra instaluje Nginx na węzłach z systemem operacyjnym z rodziny Debian w wersji 18.04. Oczywiście będzie to Ubuntu 18.04.

Przykład 3: Użycie operatora OR z opcją When

Za pomocą operatora OR zadanie jest wykonywane, jeśli spełniony jest którykolwiek z warunków.

---
- hosts: all

  tasks:
  - name: Install Nginx on Debian
     apt: name=nginx state=present
     when: ansible_os_family == “Debian” or
	      Ansible_os_family == “SUSE”

Powyższa gra instaluje serwery WWW Nginx na systemach operacyjnych Debian, SUSE lub na obu.

UWAGA: podczas testowania warunku zawsze pamiętaj o użyciu podwójnego znaku równości ==.

Warunki w pętlach

Warunków można także używać w pętli. Załóżmy na przykład, że masz listę wielu pakietów, które należy zainstalować na zdalnych węzłach.

W poniższym podręczniku mamy tablicę o nazwie pakiety zawierającą listę pakietów, które należy zainstalować. Zadania te będą wykonywane jedno po drugim, jeśli klauzula wymagana ma wartość True.

---
 - name: Install Software packages
    hosts: all
    vars:
	packages:
    • name: nginx
required: True
    • name: mysql
required: True
    • name: apache
required: False



   tasks:
    • name: Install “{{ item.name }}”on Debian
apt: 
 name: “{{ item.name }}”
 state: present 
When: item.required == True
loop: “{{ packages }}”  

Skonfiguruj obsługę błędów

Czasami zadania kończą się niepowodzeniem podczas uruchamiania podręczników. Załóżmy, że uruchamiasz 5 zadań na 3 serwerach, jak pokazano w poniższym podręczniku. Jeśli w zadaniu 3 (Uruchamianie MySQL) na serwerze 2 wystąpi błąd, Ansible przestanie wykonywać pozostałe zadania na serwerze 2 i podejmie próbę wykonania pozostałych zadań na pozostałych serwerach.

---
 - name: Install Software packages
   hosts: server1, server2, server3
   tasks:
- name: Install dependencies
<< some code >>

- name: Install MySQL database
<< some code >>

- name: Start MySQL
<< some code >>

- name: Install Nginx
<< some code >>

- name: Start Nginx
<< some code >>

Jeśli chcesz na przykład zachować spójność w wykonywaniu podręcznika, zatrzymaj wykonywanie podręcznika w przypadku awarii jednego z serwerów, dodaj opcję.

---
 - name: Install Software packages
   hosts: server1, server2, server3
   any_errors_fatal:  true
   tasks:

W ten sposób, jeśli jedno zadanie na jednym serwerze zakończy się niepowodzeniem, Ansible zatrzyma wykonywanie całego podręcznika na wszystkich serwerach i zakończy działanie.

Jeśli chcesz, aby podręcznik ignorował błędy i kontynuował wykonanie pozostałego zestawu zadań, użyj opcji ignore_errors: True.

---
 - name: Install Software packages
   hosts: server1, server2, server3
   tasks:
- name: Install dependencies
<< some code >>
     ignore_errors: True

Twórz podręczniki, aby skonfigurować systemy do określonego stanu

W tej sekcji przyjrzymy się dodatkowym opcjom dostępnym podczas uruchamiania podręcznika.

Zacznijmy od trybu Sprawdź lub opcji Próba próbna. Opcja trybu próbnego lub trybu sprawdzania jest używana podczas uruchamiania podręcznika w celu sprawdzenia, czy napotkane zostaną jakiekolwiek błędy i czy na zarządzanych hostach zostaną wprowadzone jakieś zmiany. Nie powoduje to jednak żadnych zmian w zdalnych węzłach.

Na przykład, aby uruchomić na sucho podręcznik o nazwie httpd.yml, który instaluje i uruchamia serwer WWW Apache:

ansible-playbook httpd.yml --check

Inną opcją, której musimy się przyjrzeć, jest opcja --start-at-task. Jest to używane podczas określania nazwy zadania, od którego powinien zaczynać się podręcznik.

Weźmy przykład: Poniższy podręcznik opisuje 2 zadania: Pierwsza instalacja instaluje serwer WWW Apache, a druga instaluje narzędzie htop.

---
 - name: Install httpd

   hosts: all
   tasks:
    yum:	 
name: httpd
     state: Installed

- name: Install htop

      yum:  
      name: htop
      state: started

Jeśli chcesz pominąć instalację serwera WWW Apache i zamiast tego zainstalować narzędzie htop, uruchom:

ansible-playbook playbook.yml --start-at-task “Install htop”

Na koniec możesz oznaczyć swoje zadania lub zabawy, dodając opcję tagi do swojego podręcznika, jak pokazano. Jest to przydatne, gdy masz dość duży podręcznik i chcesz uruchamiać określone zadania z całego podręcznika.

---
 - name: Install httpd
   tags: Install and start
   hosts: all
   tasks:
    yum:	 
name: httpd
     state: Installed

   tags: Install

    • service: 
name: httpd
state: started
ansible-playbook playbook.yml -tags "Install"

Aby pominąć tagi, użyj opcji --skip-tags, jak pokazano.

ansible-playbook playbook.yml --skip-tags "Install"
Wniosek

W tym temacie omówiliśmy powszechnie używane moduły Ansible, sposób pobierania stdout z wykonania podręcznika do analizy, używanie warunków w podręczniku i zarządzanie błędami, które mogą wystąpić podczas uruchamiania zadania. Na koniec podsumowaliśmy konfigurację podręczników i sposób korzystania z dodatkowych opcji w celu podjęcia decyzji, które zadania mają zostać uruchomione, jeśli nie zamierzasz uruchamiać całego podręcznika.