Några lärdomar från att sätta upp Ansible
Jag har senaste året förkovrat mig ordentligt i Ansible för att automatisera saker på servrar. Detta inlägg sammanfattar några viktiga lärdomar för referens i framtiden.
Struktur i inventory spelar stor roll
Var noga med att strukturera inventory-filen. Det lönar sig. Var inte blyg för att lägga servrar med flera syften på mer än ett ställe. Lär dig att uppskatta nästling.
group_vars och host_vars importerar saker automatiskt
För varje maskin som kör playbooks så kommer Ansible automatiskt att inkludera filer med variabler (vars). Man behöver inte använda include_vars.
Så givet följande inventory:
servers:
demandred:
rahvin:
ishamael:
samael:
och följande Ansible playbook-kommando:
ansible-playbook -i inventory.yml install.yml
Så kommer följande att hända:
- Ansible kommer att leta efter
./group_vars/servers.ymloch automatiskt inkludera den om den finns. - Ansible kommer att leta efter
./group_vars/servers/och automatiskt inkludera alla filer i katalogen om den finns. - För varje maskin, så kommer Ansible att kika efter en katalog eller en fil i
./host_vars/<server>enligt samma princip som ovan. Exempel:./host_vars/demandred.yml,./host_vars/demandred/*.yml. - Om det finns
host_vars, skriver dessa över tidigare inkluderade variabler från.group_vars.
Detta är en konvention som är otroligt tacksam och kraftfull. Det funkar även med nästlade grupper, där föräldern alltid skrivs över av barnet.
Så prioordningen blir denna: parent_group_vars < child_group_vars < host_vars < lokala vars.
Jobba med modularitet
Istället för att kopiera tasks mellan playbooks, lägg vanligt återanvända tasks i egna filer och importera dem med import_tasks. pwd är det playbooken som avgör.
Så här ser t ex min playbook för att konfigurera servrar ut:
- name: Konfigurera server
hosts: servers
tasks:
- import_tasks: tasks/segments/apt_install.yml
- import_tasks: tasks/segments/sysctl.yml
- import_tasks: tasks/segments/apparmor.yml
- import_tasks: tasks/segments/logrotate.yml
- import_tasks: tasks/segments/nagios.yml
- import_tasks: tasks/segments/otelcol_install.yml
- import_tasks: tasks/segments/otelcol_config.yml
- import_tasks: tasks/segments/server_dirs.yml
Så här ser ett "segment" ut, för att installera paket och ta bort ej använda paket.
- name: Uppdatera APT-repositorier
become: true
ansible.builtin.apt:
update_cache: true
- name: Uppgradera systempaket
become: true
ansible.builtin.apt:
name: "*"
state: latest
- name: Avinstallera ej använda dependencies
become: true
ansible.builtin.apt:
autoremove: true
purge: true
Ansible vaults funkar precis som vanliga inkludes
Lägg Ansible Vaults på samma ställen som du skulle ha lagt en vanlig fil med variabler. group_vars och host_vars är bra startlägen.