ansible
roller
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.