Andmed ja saladused¶
Enne kui räägime saladuste krüpteerimisest, peame rääkima, kuidas Ansible andmeid töötleb ja kuskohast ta neid saab.
Filtrid (Filters)¶
Ansible kasutab Jinja2 templiitimiskeelt. Selle üks võimsamaid omadusi on filtrid. Need lubavad muutuja väärtust käigupealt muuta. Filtrit tähistab püstkriips |.
Näiteks:
{{ "tere" | upper }}-> muutubTERE{{ "minuparool" | password_hash('sha512') }}-> muutub Linuxi paroolihäsiks (nt$6$randomsalt$hash...)
Filtreid saab kasutada kõikjal kus saab kasutada muutujaid.
Lookupid¶
Kui muutujad (vars) on andmed, mis on Ansible sees juba olemas, siis lookupid on mehhanism andmete toomiseks "välismaailmast" Ansible sisse (kontrolleri masinast).
Süntaks on: lookup('PLUGINI_NIMI', 'ARGUMENDID').
Levinumad lookupid:
{{ lookup('file', 'minufail.txt') }}- loeb sisse faili sisu kontrolleri masinast.{{ lookup('env', 'HOME') }}- loeb sisse keskkonnamuutuja väärtuse.{{ lookup('password', ...) }}- genereerib ja salvestab parooli.
Saladuste genereerimine¶
Nüüd kasutame neid teadmisi, et lahendada klassikaline probleem - kuidas genereerida kasutajale turvaline parool, ilma et peaksime selle ise välja mõtlema?
Juhuslik parool igal korral¶
Kasutame password lookupi. Selle eripära on see, et ta tahab parooli kuhugi faili salvestada. Kui me anname talle failiteekonnaks /dev/null, siis ta genereerib alati uue, sest /dev/null on Linuxis eriline fail, kuhu miski ei salvestu.
Proovi järgnevat taski:
- name: Genereeri parool
debug:
msg: "Genereerisin parooli: {{ lookup('password', '/dev/null length=15 chars=ascii_letters,digits') }}"
Complete
Kasutades järgnevat playbooki, leiuta meetod kuidas genereerida unikaalne parool:
- hosts: all
user: root
vars:
password: "TÄIDA"
tasks:
- name: Prindi parool
debug:
var: password
- name: Tee kasutaja parooliga
user:
name: kasutaja
password: "{{ password | password_hash }}"
Verify
Igal käivitamisel peaks olema password muutuja erinev, ja user käsk muutuma.
Püsiv parool (Idempotentsus)¶
Eelmise lahenduse viga on see, et kui me paneme sellega user mooduli parooli, siis Ansible muudab parooli igal käivitusel. See ei ole idempotentne.
Meil on vaja, et: 1. Esimesel korral genereeritakse juhuslik parool. 2. See salvestatakse kuhugi - siinpuhul Ansible kontrolleri masinas (mitte sihtmasinas!) faili. 3. Järgmisel korral loetakse samast failist sama parool.
Õnneks lookup('password', ...) teeb seda automaatselt, kui anname talle päris failinime.
Complete
Muuda password muutujat nii, et parool salvestuks faili credentials/password.txt.
- hosts: all
user: root
vars:
password: "TÄIDA"
tasks:
- name: Prindi parool
debug:
var: password
- name: Tee kasutaja parooliga
user:
name: kasutaja
password: "{{ password | password_hash }}"
Verify
- Jooksuta playbooki. Kasutaja peaks loodama (status
changed). - Vaata oma projektikausta: kas tekkis fail
credentials/password.txt? Vaata selle sisu. - Jooksuta playbooki teist korda. Status peaks olema
ok(midagi ei muudetud), sest failist loeti sama parool, mis klappis serveris olevaga.
Ansible Vault - ühe muutuja krüpto¶
Failides paroolide hoidmine (nagu eelmises punktis) on mugav, aga ebaturvaline, kui see fail satub Giti. Selleks on Ansible Vault – meetod failide või muutujate krüpteerimiseks.
Ühe muutuja krüpteerimine¶
Complete
Teeme endale muutuja kasutades ansible-vault encrypt_string käsku.
Käsk käivitades küsib kõigepealt parooli, millega see krüpteerida (2x). Peale seda küsitakse, mis andmed ära krüpteerida. See on nüüd muutuja sisu - pane siia midagi mida ära tunned.
Peale seda väljastatakse sulle krüpteeritud kujul muutuja:
!vault |
$ANSIBLE_VAULT;1.1;AES256
61386566356438303636653332306137336463613964373238356438373839656332343365363033
3434393438323661366665386162616635353031353162660a633131333434643263656230383334
39306663316632643638336266636536616332383365636665613865343431373431376662626330
6334343461616534300a626332623064663562643561633237383861376637366362303565623733
3665
Võta see, ja pane endale kuskile muutujate faili, niimoodi:
muutuja: !vault |
$ANSIBLE_VAULT;1.1;AES256
61386566356438303636653332306137336463613964373238356438373839656332343365363033
3434393438323661366665386162616635353031353162660a633131333434643263656230383334
39306663316632643638336266636536616332383365636665613865343431373431376662626330
6334343461616534300a626332623064663562643561633237383861376637366362303565623733
3665
Proovi jooksutada playbooki:
- hosts: all
user: root
tasks:
- name: Prindi muutuja
debug:
var: <asenda oma muutuja nimega>
Ja pane Ansible käima. Peaksid saama veateate.
Nüüd proovi playbook käima panna --ask-vault-pass võtmega.
Verify
Muutuja väljund peaks olema sama, mis sa ise sisse kirjutasid.
Muutujate faili krüpto¶
Ansible lubab ka krüpteerida tervet muutujate faili, mis on tihti mõistlikum. Selleks on järgnevad käsud:
ansible-vault create vault/paroolid.yml
ansible-vault view vault/paroolid.yml
ansible-vault edit vault/paroolid.yml
Seejärjel saab neid playbookis:
- name: Demo using vaulted variables
hosts: all
vars_files:
- vault/passwords.yml
tasks:
- name: Show vaulted secrets
debug:
msg:
- "muutuja oli: {{ muutuja }}"
Complete
Tee endale üks krüpteeritud muutujate fail. Seejärel kasuta seda Ansiblega.
Verify
Playbook peaks sulle andma tagasi samad muutujad, mis sa faili ise panid.