ansible
Role
Szukaj…
Używanie ról
Ansible wykorzystuje pojęcie ról, aby lepiej pozwolić na kod modułowy i uniknąć powtarzania się.
Rola to po prostu struktura folderów, w której Ansible wie, gdzie ładować pliki vars, zadania i programy obsługi. Przykład może wyglądać mniej więcej tak:
apache/
├── defaults
│ └── main.yml
├── files
│ ├── mod-pagespeed-stable_current_i386.deb
│ ├── mod-pagespeed-stable_current_i386.rpm
│ ├── mod-pagespeed-stable_current_amd64.deb
| └── mod-pagespeed-stable_current_x86_64.rpm
├── tasks
│ ├── debian.yml
│ ├── main.yml
│ └── redhat.yml
├── templates
│ ├── httpd.conf.j2
│ └── sites-available
│ └── virthualhost.conf.j2
└── vars
├── debian
└── redhat
Następnie możesz użyć tej roli w podstawowym podręczniku, który wygląda tak:
- hosts: webservers
roles:
- apache
Po uruchomieniu Ansible na tym podręczniku będzie on kierowany do wszystkich hostów w grupie webservers
i uruchomi zdefiniowaną powyżej rolę apache
, automatycznie ładując wszystkie zmienne domyślne dla tej roli i uruchamiając wszystkie zadania zawarte w tasks/main.yml
. Ansible wie również, aby szukać określonych typów plików w lokalizacjach przyjaznych rolom:
Jeśli istnieją role / x / task / main.yml, wymienione w nim zadania zostaną dodane do gry
Jeśli istnieją role / x / handlers / main.yml, wymienione w nich programy obsługi zostaną dodane do gry
Jeśli istnieją role / x / vars / main.yml, wymienione w nich zmienne zostaną dodane do gry
Jeśli roles / x / meta / main.yml istnieje, wszelkie wymienione tam zależności ról zostaną dodane do listy ról (1.3 i nowsze)
Dowolne zadania kopiowania, skryptu, szablonu lub dołączania (w roli) mogą odwoływać się do plików w rolach / x / {pliki, szablony, zadania} / (katalog zależy od zadania) bez konieczności względnego lub bezwzględnego śledzenia ich ścieżek
Zależności ról
Role umożliwiają także definiowanie innych ról jako zależności poprzez utworzenie pliku meta/main.yml
z blokiem dependencies
:
dependencies:
- role: common
Możliwe jest również przekazanie wartości do parametru / zmiennej w roli zależnej:
dependencies:
- { role: common, some_parameter: 3 }
Lub nawet warunkowo wykonać zależną rolę:
dependencies:
- { role: common, some_parameter: 3 }
- { role: sshd, enable_sshd: false,
when: environment == 'production' }
Role zależne są zawsze wykonywane przed rolami zależnymi od nich. Ponadto są one wykonywane tylko raz. Jeśli dwie role określają tę samą zależność, są wykonywane tylko za pierwszym razem.
Wyobraź sobie role role1, role2 i role3 z następującymi meta/main.yml
:
rola1 / meta / main.yml:
dependencies:
- role: role3
role2 / meta / main.yml:
dependencies:
- role: role3
Podczas wykonywania roli 1 i roli 2 w tym samym podręczniku (z rolą 1 wywołaną przed rolą 2) kolejność wykonywania będzie następująca:
role3 -> role1 -> role2
Możesz zastąpić to zachowanie, określając allow_duplicates: yes
w meta/main.yml
role1 i role2. Wynikające z tego polecenie wykonania byłoby:
role3 -> role1 -> role3 -> role2
Rozdzielanie zadań i zmiennych specyficznych dla dystrybucji w ramach roli
Możemy łatwo podzielić zadania i zmienne specyficzne dla dystrybucji na różne dedykowane pliki .yml. Ansible pomaga nam automatycznie identyfikować dystrybucję hostów docelowych za pośrednictwem {{ ansible_distribution }}
i {{ ansible_distribution_version }}
, więc musimy tylko odpowiednio nazwać pliki dedykowane dystrybucji .yml.
W przypadku Ubuntu Xenial drzewo katalogów podstawowych ról wyglądałoby wtedy tak:
role
├── tasks
│ ├── main.yml
│ └── Ubuntu16.04.yml
└── vars
└── Ubuntu16.04.yml
Wewnątrz tasks/main.yml
możemy teraz automatycznie uwzględniać odpowiednie zmienne i zadania dla dystrybucji hostów docelowych.
zadania / main.yml
---
- name: include distribution specific vars
include_vars: "{{ ansible_distribution }}{{ ansible_distribution_version }}.yml"
- name: include distribution specific install
include: "{{ ansible_distribution }}{{ ansible_distribution_version }}.yml"
Wewnątrz tasks/Ubuntu16.06.yml
i vars/Ubuntu16.04.yml
możemy teraz zdefiniować zadania i zmienne odpowiednio dla Ubuntu Xenial.