System Approche zu Variablen an Ansible

ansible devops codestyle

Hey! Mäin Numm ass Denis Kalyuzhny Ech schaffen als Ingenieur an der Entwécklung Prozess Automation Departement. All Dag ginn nei Applikatiounsbauten op Honnerte vu Kampagneserveren ausgerullt. An an dësem Artikel deelen ech meng Erfahrung fir Ansible fir dës Zwecker ze benotzen.

Dëse Guide bitt e Wee fir Variabelen an enger Deployment z'organiséieren. Dëse Guide ass fir déi entwéckelt, déi scho Rollen an hire Playbooks benotzen a liesen Beschte Praktikenawer mat ähnleche Probleemer:

  • Nodeems Dir eng Variabel am Code fonnt hutt, ass et onméiglech fir direkt ze verstoen wat se verantwortlech ass;
  • Et gi verschidde Rollen, an d'Verännerlechen musse mat engem Wäert verbonne sinn, awer et funktionnéiert net;
  • Schwieregkeeten fir anerer z'erklären wéi d'Logik vun de Variabelen an Äre Spillbicher funktionnéiert

Mir hunn dës Problemer op Projeten an eiser Gesellschaft begéint, als Resultat vun deem mir op d'Regele fir d'Formatéierungsvariabelen an eise Playbooks komm sinn, déi zu engem gewësse Mooss dës Problemer geléist hunn.

System Approche zu Variablen an Ansible

Variablen an Rollen

Eng Roll ass e separaten Deployment System Object. Wéi all Objet vum System, muss et en Interface hunn fir mat dem Rescht vum System ze interagéieren. Roll Variablen sinn esou en Interface.

Huelt zum Beispill d'Roll api, déi eng Java Applikatioun um Server installéiert. Wéi eng Variabelen huet et?

System Approche zu Variablen an Ansible

Roll Variablen kënnen an 2 Typen opgedeelt ginn:

1. Свойства
    a) независимые от среды
    б) зависимые от среды
2. Связи
    a) слушатели 
    б) запросы внутри системы
    в) запросы в среду

Variabel Eegeschafte sinn Variabelen déi d'Behuele vun enger Roll definéieren.

Ufro Variablen sinn Variabelen deenen hire Wäert benotzt gëtt fir Ressourcen extern zu der Roll ze bezeechnen.

Variabel Nolauschterer si Variabelen deenen hire Wäert benotzt gëtt fir Ufrovariablen ze bilden.

Op der anerer Säit sinn 1a, 2a, 2b Variablen déi net vun der Ëmwelt ofhängeg sinn (Eisen, extern Ressourcen, etc.) a kënne mat Standardwäerter an der Standardroll gefëllt ginn. Wéi och ëmmer, Variablen wéi 1.b an 2.c kënnen net mat anere Wäerter wéi 'Beispill' gefëllt ginn, well se vun Stand zu Stand ofhängeg vun der Ëmwelt änneren.

Code Stil

  • Den Numm vun der Variabel muss mam Numm vun der Roll ufänken. Dëst wäert et einfach maachen an Zukunft erauszefannen wéi eng Roll d'Variabel ass a wat se verantwortlech ass.
  • Wann Dir Variabelen an Rollen benotzt, musst Dir sécher sinn datt Dir de Prinzip vun der Verschlësselung verfollegt a Variablen benotzt, déi entweder an der Roll selwer oder an de Rollen definéiert sinn, op deenen déi aktuell hänkt.
  • Vermeiden Dictionnairen fir Variabelen ze benotzen. Ansible erlaabt Iech net bequem individuell Wäerter an engem Wierderbuch ze iwwerschreiden.

    E Beispill vun enger schlechter Variabel:

    myrole_user:
        login: admin
        password: admin

    Hei ass Login déi median Variabel, a Passwuert ass déi ofhängeg Variabel. Mee
    well se an e Wierderbuch kombinéiert sinn, musst Dir et voll spezifizéieren
    Ëmmer. Wat ganz onbequem ass. Besser esou:

    myrole_user_login: admin
    myrole_user_password: admin

Variablen an Deployment Playbooks

Wann Dir en Deployment Playbook zesummestellt (nodréiglech als Playbook bezeechent), hale mir un d'Regel datt et an engem getrennten Repository soll plazéiert ginn. Just wéi Rollen: jidderee a sengem eegene Git-Repository. Dëst erlaabt Iech ze realiséieren datt d'Rollen an d'Spillbuch verschidden onofhängeg Objete vum Deployment System sinn, an Ännerungen an engem Objet däerfen d'Operatioun vum aneren net beaflossen. Dëst gëtt erreecht andeems d'Standardwäerter vun de Variablen änneren.

Wann Dir e Spillbuch kompiléiert, fir ze resuméieren, ass et méiglech d'Standardwäerter vu Rollvariablen op zwou Plazen ze iwwerschreiden: a Spillbuchvariablen an an Inventarvariablen.

mydeploy                        # Каталог деплоя
├── deploy.yml                  # Плейбук деплоя
├── group_vars                  # Каталог переменных плейбука
│   ├── all.yml                 # Файл для переменных связи всей системы
│   └── myapi.yml               # Файл переменных свойств группы myapi
└── inventories                 #
    └── prod                    # Каталог окружения prod
        ├── prod.ini            # Инвентори файл
        └── group_vars          # Каталог для переменных инвентори
            └── myapi           #
                ├── vars.yml    # Средозависимые переменные группы myapi
                └── vault.yml   # Секреты (всегда средозависимы) *

* - Variablen a Vaults

Den Ënnerscheed ass datt Playbook Variablen ëmmer benotzt ginn wann Dir Playbooks nennt, déi um selwechten Niveau domat läit. Dëst bedeit datt dës Variablen super sinn fir d'Standardwäerter vu Variabelen z'änneren déi net vun der Ëmwelt ofhängeg sinn. Ëmgekéiert ginn Inventarvariablen nëmme fir e bestëmmten Ëmfeld benotzt, wat ideal ass fir Ëmweltspezifesch Variablen.

Et ass wichteg ze notéieren datt d'Variabel Virrang et Iech net erlaabt d'Variabelen als éischt an de Playbook Variablen nei ze definéieren an dann getrennt am selwechten Inventar.

Dëst bedeit datt Dir schonn op dëser Etapp muss entscheeden ob d'Variabel ëmweltofhängeg ass oder net a se op déi richteg Plaz placéieren.

Zum Beispill, an engem Projet, war d'Variabel, déi verantwortlech ass fir SSL z'aktivéieren, fir eng laang Zäit ëmweltofhängeg, well mir op engem vun de Stänn SSL net konnten aktivéieren aus Grënn iwwer eis Kontroll. Nodeems mir dëst Thema fixéiert hunn, gouf et mëttel onofhängeg an ass op Playbook Variablen geplënnert.

Property Variablen fir Gruppen

Loosst eis eise Modell an der Figur 1 ausbauen andeems Dir 2 Gruppe vu Servere mat enger anerer Java Applikatioun bäidréit, awer mat verschiddenen Astellungen.

System Approche zu Variablen an Ansible

Stellt Iech vir wéi d'Spillbuch an dësem Fall ausgesäit:

- hosts: myapi
  roles:
    - api

- hosts: bbauth
  roles:
    - auth

- hosts: ghauth
  roles:
    - auth

Mir hunn dräi Gruppen am Spillbuch, also ass et recommandéiert sou vill Gruppedateien an group_vars Inventarvariablen an Playbook Variabelen op eemol ze kreéieren. Eng Gruppedatei an dësem Fall ass d'Beschreiwung vun engem Bestanddeel vun Ärer Applikatioun am Playbook. Wann Dir d'Gruppdatei an de Playbook Variablen opmaacht, gesitt Dir direkt all d'Ënnerscheeder vum Standardverhalen vun de Rollen, déi dem Grupp zougewisen sinn. An Inventarvariablen: Differenzen am Gruppeverhalen vu Stand zu Stand.

Code Stil

  • Probéiert guer net Host_vars Variablen ze benotzen, well se de System net beschreiwen, awer nëmmen e spezielle Fall, wat op laang Siicht zu Froen féiert: "Firwat ass dësen Host anescht wéi de Rescht?", D'Äntwert op déi ass net ëmmer einfach ze fannen.

Link Verännerlechen

Wéi och ëmmer, dat ass iwwer Immobilievariablen, awer wat iwwer Linkvariablen?
Hiren Ënnerscheed ass datt se de selwechte Wäert a verschiddene Gruppen mussen hunn.

Am Ufank gouf et Iddi benotzt eng monstréis Konstruktioun vun der Form:
hostvars[groups['bbauth'][0]]['auth_bind_port'], mä et gouf direkt opginn
well et Mängel huet. Éischtens, d'Gréisst. Zweetens, Ofhängegkeet vun engem spezifesche Host an der Grupp. Drëttens ass et néideg Fakten vun all Hosten ze sammelen ier Dir d'Deployment ufänkt, wa mir net wëllen en ondefinéierte Variabelfehler kréien.

Als Resultat gouf decidéiert Linkvariablen ze benotzen.

Link Verännerlechen sinn Variabelen déi zum Spillbuch gehéieren a gebraucht ginn fir Systemobjekter ze verbannen.

Link Variablen sinn an allgemeng System Variablen populéiert group_vars/all/vars a gi geformt andeems Dir all Nolauschtervariabelen aus all Grupp ewechhuelt, an den Numm vun der Grupp bäigefüügt, aus där den Nolauschterer geläscht gouf, un den Ufank vun der Variabel.

Sou ass d'Uniformitéit an d'Net-Kräizung vun den Nimm gesuergt.

Loosst eis probéieren Variabelen aus dem Beispill hei uewen ze binden:

System Approche zu Variablen an Ansible

Stellt Iech vir datt mir Variablen hunn déi vuneneen ofhänken:

# roles/api/defaults:
# Переменная запроса
api_auth1_address: "http://example.com:80"
api_auth2_address: "http://example2.com:80"

# roles/auth/defaults:
# Переменная слушатель
auth_bind_port: "20000"

Loosst eis et a gemeinsame Variabelen setzen group_vars/all/vars all Nolauschterer, a füügt den Numm vum Grupp un:

# group_vars/all/vars
bbauth_auth_bind_port: "20000"
ghauth_auth_bind_port: "30000"

# group_vars/bbauth/vars
auth_bind_port: "{{ bbauth_auth_bind_port }}"

# group_vars/ghauth/vars
auth_bind_port: "{{ ghauth_auth_bind_port }}"

# group_vars/myapi/vars
api_auth1_address: "http://{{ bbauth_auth_service_name }}:{{ bbauth_auth_bind_port }}"
api_auth2_address: "http://{{ ghauth_auth_service_name }}:{{ ghauth_auth_bind_port }}"

Elo, andeems Dir de Wäert vum Connector ännert, wäerte mir sécher sinn datt d'Ufro an dee selwechte Hafen geet.

Code Stil

  • Well Rollen a Gruppen verschidden Objeten am System sinn, musst Dir verschidden Nimm fir si hunn, da wäerten d'Linkvariablen präzis weisen datt se zu enger spezifescher Grupp vu Serveren gehéieren, an net zu enger Roll am System.

Ëmweltdateien

Rollen kënnen Dateie benotzen déi vun Ëmfeld zu Ëmfeld ënnerscheeden.

SSL Certificaten sinn e Beispill vun esou Dateien. Späichert se als Text
an enger Variabel ass net ganz bequem. Awer et ass bequem de Wee zu hinnen an enger Variabel ze späicheren.

Zum Beispill benotze mir d'Variabel api_ssl_key_file: "/path/to/file".

Well et offensichtlech ass datt de Schlësselzertifika vun Ëmfeld zu Ëmfeld ännert, ass dëst eng ëmweltofhängeg Variabel, dat heescht datt se an der Datei soll lokaliséiert sinn
group_vars/myapi/vars Inventar vu Variabelen, a enthalen de Wäert 'zum Beispill'.

De bequemste Wee an dësem Fall ass d'Schlësseldatei am Playbook Repository laanscht de Wee ze setzen
files/prod/certs/myapi.key, da wäert de Wäert vun der Variabel sinn:
api_ssl_key_file: "prod/certs/myapi.key". D'Bequemlechkeet läit an der Tatsaach datt d'Leit verantwortlech fir de System op engem bestëmmte Stand z'installéieren och hir eege speziell Plaz am Repository fir hir Dateien ze späicheren. Zur selwechter Zäit bleift et méiglech den absolute Wee fir den Zertifika um Server ze spezifizéieren, am Fall wou d'Zertifikater vun engem anere System geliwwert ginn.

Multiple Stänn an engem Ëmfeld

Dacks gëtt et e Besoin fir e puer bal identesch Stänn an deemselwechten Ëmfeld mat minimalen Ënnerscheeder z'installéieren. An dësem Fall deele mir ëmweltofhängeg Variabelen an déi, déi net an dësem Ëmfeld änneren an déi, déi et maachen. A mir huelen déi lescht direkt an d'Inventardateien selwer eraus. No dëser Manipulatioun gëtt et méiglech en aneren Inventar direkt am Ëmfeldverzeechnes ze kreéieren.

Et wäert de group_vars Inventar weiderbenotzen an och fäeg sinn e puer Variabelen direkt fir sech selwer nei ze definéieren.

Déi lescht Verzeechnesstruktur fir den Deploymentprojet:

mydeploy                        # Каталог деплоя
├── deploy.yml                  # Плейбук деплоя
├── files                       # Каталог для файлов деплоя
│   ├── prod                    # Католог для средозависимых файлов стенда prod
│   │   └── certs               # 
│   │       └── myapi.key       #
│   └── test1                   # Каталог для средозависимых файлов стенда test1
├── group_vars                  # Каталог переменных плейбука
│   ├── all.yml                 # Файл для переменных связи всей системы
│   ├── myapi.yml               # Файл переменных свойств группы myapi
│   ├── bbauth.yml              # 
│   └── ghauth.yml              #
└── inventories                 #
    ├── prod                    # Каталог окружения prod
    │   ├── group_vars          # Каталог для переменных инвентори
    │   │   ├── myapi           #
    │   │   │   ├── vars.yml    # Средозависимые переменные группы myapi
    │   │   │   └── vault.yml   # Секреты (всегда средозависимы)
    │   │   ├── bbauth          # 
    │   │   │   ├── vars.yml    #
    │   │   │   └── vault.yml   #
    │   │   └── ghauth          #
    │   │       ├── vars.yml    #
    │   │       └── vault.yml   #
    │   └── prod.ini            # Инвентори стенда prod
    └── test                    # Каталог окружения test
        ├── group_vars          #
        │   ├── myapi           #
        │   │   ├── vars.yml    #
        │   │   └── vault.yml   #
        │   ├── bbauth          #
        │   │   ├── vars.yml    #
        │   │   └── vault.yml   #
        │   └── ghauth          #
        │       ├── vars.yml    #
        │       └── vault.yml   #
        ├── test1.ini           # Инвентори стенда test1 в среде test
        └── test2.ini           # Инвентори стенда test2 в среде test

Zesummefaassung

Nodeems Dir d'Variabelen am Aklang mam Artikel organiséiert hutt: all Datei mat Variablen ass verantwortlech fir eng spezifesch Aufgab. A well de Fichier bestëmmten Aufgaben huet, gouf et méiglech eng Persoun verantwortlech fir d'Korrektheet vun all Fichier zouzeschreiwen. Zum Beispill gëtt den Entwéckler vum System Deployment verantwortlech fir d'korrekt Fëllung vun de Playbook Variablen, während den Administrator, deem säi Stand am Inventar beschriwwe gëtt, direkt verantwortlech ass fir den Inventar vun de Variablen auszefëllen.

Rollen goufen eng selbstänneg Entwécklungsunitéit mat hiren eegene Interface, wat de Rollentwéckler erlaabt Features z'entwéckelen anstatt d'Roll unzepassen fir de System ze passen. Dëst Thema war besonnesch wouer fir gemeinsam Rollen fir all Systemer an enger Campagne.

System Administrateuren brauchen net méi Deployment Code ze verstoen. Alles wat vun hinnen erfuerderlech ass fir eng erfollegräich Deployment ass d'Dateien vun Ëmfeldvariablen auszefëllen.

Literatur

  1. Dokumentatioun

Auteur

Kalyuzhny Denis Alexandrovich

Source: will.com

Setzt e Commentaire