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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow