Hoe Ansible Variables and Vaults te gebruiken

Hoe ExpressVPN Ansible gebruikt


Hoe we Ansible uitgebreid gebruiken bij ExpressVPN

Onze ontwikkelingsteams werken onafhankelijk, dat wil zeggen dat een team hun product gedurende de volledige levenscyclus bezit. Deze opzet betekent dat ons begrip Ansible voortkomt uit een verzameling kennis van veel verschillende teams in het bedrijf in plaats van een gecentraliseerde groep die Ansible beheert.

Een gedecentraliseerd personeelsbestand geeft onze teams veel flexibiliteit en mobiliteit, maar oefent ook druk uit op individuen om veel over veel tools te weten.

Om het gemakkelijker te maken kennis te delen en hulpmiddelen correct te gebruiken, hebben we besloten om te standaardiseren hoe we Ansible gebruiken voor configuratiebeheer en serverbewerkingen.

Deze blog behandelt de lessen die we op onze schaal hebben geleerd, reflecties op de manier waarop we werken en hoe we Ansible in een dergelijke context beheren.

Mogelijke documentatie

Laten we er meteen aan beginnen! De documentatie voor Ansible laat een aantal dingen te wensen over, vooral als het gaat om end-to-end documentatie (zoals, hoe kom je van punt A naar punt Z?).

Sommige vragen die we regelmatig tegenkomen zijn: “Hoe werkt variabele prioriteit?” En “Hoe past Ansible Vault?”

Beide problemen zijn heel goed onafhankelijk gedocumenteerd (hier en hier), en de pagina Ansible Variables heeft een heel mooi gedeelte over voorrang expliciet, maar de kruising van de twee krijgt slechts een korte vermelding. Het probleem is dat er geen koppelingen zijn tussen de documentatie over variabelen en kluizen, waardoor de indruk ontstaat dat de gebruiker bij de gebruiker moet achterhalen hoe de twee elkaar kruisen.

Dus vandaag zullen we proberen de kruising tussen variabelen en vaults en de beste praktijk te behandelen.

Waarvoor kunt u Ansible Vault-bestanden gebruiken

Samengevat: in de Vault-documentatie staat dat u kunt in wezen alles in uw Ansible-map coderen in een Vault-bestand, en Ansible zal proberen het “slim” te decoderen wanneer een spel deze bestanden bevat. Huh. Koel!

De documentatie over variabelen vermeldt helemaal niets over Vault-bestanden, wat vreemd is omdat Vault is ontworpen voor variabele bestanden. Dus hoe passen ze bij elkaar? Het is belangrijk om dat op te merken Vault-bestanden zelf hebben geen speciale betekenis voor de verwerking of voorrang van variabelen, dus er is veel flexibiliteit. Maar dit geeft u mogelijk niet genoeg informatie over hoe u het correct kunt gebruiken.

Hoe Ansible niet te gebruikenJe doet het verkeerd.

Neem dit voorbeeld van een eenvoudige map met mogelijk:

.
├── groepsvaren
│ ├── allemaal
│ ├── productie
│ └── enscenering
├── ansible.cfg
├── inventaris
└── playbook.yml

Op het eerste gezicht ziet deze opstelling er goed uit; dit zou een relatief veel voorkomende structuur zijn om te produceren als u de documentatie zou lezen. Een waarnemer zou kunnen veronderstellen dat de staging- en productiebestanden in group_vars Vaults zijn, maar dat is niet noodzakelijkerwijs waar, wat op zichzelf een probleem is.

Nu kan het bestand “alles” geen Vault-bestand zijn, omdat u (hopelijk) de staging- en productie Vault-bestanden met verschillende wachtwoorden hebt gecodeerd. Maar het betekent ook dat uw group_vars-bestand voor omgevingen een combinatie van geheimen en niet-geheimen moet bevatten, omdat u beperkt bent tot één bestand per omgeving.

Hierdoor – en als je een beetje extrapoleerde na het lezen van de intro van Vaults in de Ansible-documentatie – heb je waarschijnlijk de productie / ensceneringskluizen gemaakt door de inhoud van “alle” in eerste instantie te kopiëren en vervolgens te wijzigen.

Dat betekent dat uw “alles” -bestand er als volgt uit zou kunnen zien:

database:
gebruikersnaam: default_user
wachtwoord: false

super_important_var_that_should_be_one: 1

En uw productie Vault-bestand kan er zo uitzien:

database:
gebruikersnaam: produser
wachtwoord: supersecretpasswordnoonecansee

super_important_var_that_should_be_one: 1

(Maak je geen zorgen, dit is niet ons werkelijke productiewachtwoord! We hebben dit dubbel gecontroleerd.)

Het bovenstaande is gevaarlijk om niet voor de hand liggende redenen. U kunt bijvoorbeeld het wijzigen van een standaard voor productie missen en / of uw “alles” -bestand kan zelfs een verkeerde naam hebben en helemaal niet zijn opgenomen! (Dit is de oorzaak van de storing die we vorige week hebben gehad.)

Aanbevolen procedure: veilig gebruik van Ansible Vault-bestanden

Zoals vermeld op de pagina met praktische tips, maakt het maken van een bestand in een Vault-bestand de inhoud van het bestand onzichtbaar, dus ze hebben een groot nadeel: u kunt niet zoeken naar variabelen in het Vault-bestand zonder ze expliciet te decoderen. Dit systeem betekent dat iedereen die naar uw Ansible-configuratie kijkt, geen idee heeft wat zich in deze bestanden bevindt zonder ook het Vault-wachtwoord te kennen (verschrikkelijk voor code-reviews!). Daarom raden we aan om zo weinig mogelijk variabelen in Vault-bestanden te plaatsen. (Met andere woorden, zet alleen geheimen in de Vault-bestanden!)

Laten we dus eens kijken naar een structuur die het gemakkelijker zou maken om niet in de voet te schieten:

.
├── groepsvaren
│ ├── allemaal
│ │ └── vars.yml
│ ├── productie
│ │ ├── vars.yml
│ │ └── vault.yml
│ └── enscenering
│ └── vault.yml
├── ansible.cfg
├── inventaris
└── playbook.yml

De best practices-documentatie beveelt ook aan om een ​​”laag van indirection” te gebruiken, wat betekent dat u alle variabelen in het Vault-bestand moet sjablonen naar de variabelen waarnaar in uw playbooks wordt verwezen. Het beveelt ook aan dat je je kluisvariabelen voorvoegt met “vault_”, wat betekent dat je all / vars.yml er ongeveer zo uit zou kunnen zien:

database:
gebruikersnaam: default_user
wachtwoord: “{{vault_database_password}}”

super_important_var_that_should_be_one: 1

Uw productie / vars.yml ziet er ongeveer zo uit:

database:
gebruikersnaam: produser

En uw productie / vault.yml-bestand mag alleen dit bevatten:

vault_database_password: supersecretpasswordnoonecansee

Deze herziene structuur heeft een aantal voordelen. In de eerste plaats betekent dit dat als u codebeoordelingen uitvoert (alstublieft!), Uw recensenten kunnen zien wat u hebt gewijzigd, samen met wat u hebt toegevoegd en verwijderd in (bijna alle) uw configuratie. Met deze structuur zien reviewers niet alleen een volledige bestandswijziging op een Vault die handmatig moet worden gedecodeerd, op schijf moet worden opgeslagen en met de eerdere versie moet verschillen.

En nog belangrijker, Ansible zal falen zelfs de vars te renderen als het de mist vault_database_password Variabele binnen de Vault, die u zal redden van minstens een hele reeks problemen die u kunt tegenkomen als u uw Vault-bestanden niet in de gaten houdt.

Als je je aan dit patroon houdt, ongeacht of het een hostgroep is binnen een omgeving, een volledige omgeving waarvoor je variabelen instelt, of zelfs de map “alles”, je collega’s zullen nooit in de war raken over wat wel en niet binnen is de kluis.

Dat is alles voor nu, we hopen dat het nuttig voor u is geweest!

Kim Martin Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map