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.