Sök…


Använda roller

Ansible använder begreppet roller för att bättre tillåta modulkod och undvika att upprepa dig själv.

En roll är helt enkelt en mappstruktur som Ansible vet var man ska ladda vars filer, uppgifter och hanterare från. Ett exempel kan se ut så här:

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

Du kan sedan använda rollen med en grundläggande spellista som bara ser ut så här:

- hosts: webservers
  roles:
     - apache

När du kör Ansible mot denna spellista kommer den att rikta in sig på alla värdar i webservers och köra apache rollen som definierats ovan mot den, automatiskt laddar alla standardvariabler för rollen och kör alla uppgifter som ingår i tasks/main.yml . Ansible vet också att leta efter vissa typer av filer på rollvänliga platser:

  • Om roller / x / uppgifter / main.yml finns, kommer de uppgifter som listas därefter att läggas till i spelet

  • Om roller / x / hanterare / main.yml existerar läggs hanterare listade till i stycket

  • Om roller / x / vars / main.yml finns, kommer variabler som listas därefter att läggas till i stycket

  • Om roller / x / meta / main.yml finns, kommer alla rollberoenden som listas därefter att läggas till i listan med roller (1.3 och senare)

  • Varje kopia, skript, mall eller inkludera uppgifter (i rollen) kan referera till filer i roller / x / {filer, mallar, uppgifter} / (dir beror på uppgiften) utan att behöva söka dem relativt eller absolut

Rollberoende

Roller gör det också möjligt att definiera andra roller som ett beroende genom att skapa en meta/main.yml fil med ett dependencies :

dependencies:
  - role: common

Det är också möjligt att överföra ett värde till en parameter / variabel i den beroende rollen:

dependencies:
  - { role: common, some_parameter: 3 }

Eller till och med utför den beroende rollen på villkor:

dependencies:
  - { role: common, some_parameter: 3 }
  - { role: sshd, enable_sshd: false,
                         when: environment == 'production' }

Beroende roller utförs alltid innan de roller som är beroende av dem. Dessutom körs de bara en gång. Om två roller anger samma roll som deras beroende, körs det bara första gången.

Föreställ dig rollerna roll1, roll2 och roll3 med följande meta/main.yml :
role1 / meta / main.yml:

dependencies:
    - role: role3

role2 / meta / main.yml:

dependencies:
    - role: role3

När du kör roll1 och roll2 i samma spellista (med roll1 kallas före roll2), skulle exekveringsordern vara följande:

role3 -> role1 -> role2

Du kan åsidosätta detta beteende genom att ange allow_duplicates: yes i meta/main.yml av role1 och role2. Den resulterande exekveringsordern skulle vara:

role3 -> role1 -> role3 -> role2

Separera distributionsspecifika uppgifter och variabler i en roll

Vi kan enkelt separera distributionsspecifika uppgifter och variabler i olika dedikerade .yml-filer. Ansible hjälper oss att automatiskt identifiera distributionen av {{ ansible_distribution }} via {{ ansible_distribution }} och {{ ansible_distribution_version }} , så vi måste bara namnge distributionen dedikerade .yml-filer i enlighet därmed.

För Ubuntu Xenial skulle den grundläggande rollen för trädet se så ut:

role
├── tasks
│   ├── main.yml
│   └── Ubuntu16.04.yml
└── vars
    └── Ubuntu16.04.yml

Inuti tasks/main.yml vi nu automatiskt inkludera de rätta variablerna och uppgifterna för målvärdens distribution.

uppgifter / 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"

Inuti tasks/Ubuntu16.06.yml och vars/Ubuntu16.04.yml vi nu definiera uppgifter och variabler för Ubuntu Xenial.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow