SĂŒsteemne lĂ€henemine Ansible'i muutujatele

ansible devops koodistiil

Tere! Minu nimi on Denis KaljuĆŸny ma töötan insenerina arenduse automatiseerimise osakonnas. Iga pĂ€ev installitakse uusi rakenduste kogumeid sadu ettevĂ”tte servereid. Ja selles artiklis jagan ma oma kogemusi Ansible'i kasutamisel nende eesmĂ€rkide nimel.

See juhend pakub meetodit muutujate korraldamiseks juurutamises. Juhend on mÔeldud neile, kes juba kasutavad rolle oma mÀngudes ja on lugenud BestPractices, kuid seisavad silmitsi jÀrgmiste probleemidega:

  • Muuta muutuja leidmine koodis ei anna kohe arusaama, mille eest see vastutab;
  • On mitu rolli ja muutujaid tuleb siduda ĂŒhe vÀÀrtusega, kuid see ei Ă”nnestu;
  • Tekivad raskused selgitamisel teistele, kuidas teie mĂ€ngudes muutujate loogika toimib.

Nende probleemidega oleme kokku puutunud meie ettevÔtte projektides, mille tulemusena oleme vÀlja töötanud reeglid muutujate vormistamiseks meie mÀngudes, mis mingil mÀÀral on need probleemid lahendanud.

SĂŒsteemne lĂ€henemine Ansible'i muutujatele

Muudatused mÀngudes

Roll on eraldi juurutussĂŒsteemi objekt. Nagu iga sĂŒsteemi objekt, peab tal olema suhtlemise liides ĂŒlejÀÀnud sĂŒsteemiga. Selliseks liideseks on rolli muutujad.

VÔtame nÀiteks rolli api, mis installib Java rakenduse serverisse. Millised muutujad vÔivad sellel olla?

SĂŒsteemne lĂ€henemine Ansible'i muutujatele

Rooli muutujaid saab jagada kaheks tĂŒĂŒbiks:

1. Atribuudid
    a) sÔltumatud keskkonnast
    b) sÔltuvad keskkonnast
2. Seosed
    a) kuulajad
    b) pĂ€ringud sĂŒsteemis
    c) pÀringud keskkonda

Muutujate atribuudid — need on muutujad, mis mÀÀratlevad rolli kĂ€itumise.

Muutujad — need on muutujad, mille vÀÀrtust kasutatakse vĂ€liste, rolliga seotud ressursside mÀÀratlemiseks.

Kuulajate muutujad — need on muutujad, mille vÀÀrtust kasutatakse pĂ€ringute muutujate moodustamiseks.

Teisest kĂŒljest, 1a, 2a, 2b — need on muutujad, mis ei sĂ”ltu keskkonnast (riistvara, vĂ€lised ressursid jne) ja neid saab tĂ€ita vaikimisi vÀÀrtustega rolli defaults. Siiski, muutujaid tĂŒĂŒpi 1b ja 2c ei saa tĂ€ita muude vÀÀrtustega kui 'example', kuna need muutuvad sĂ”ltuvalt keskkonnast.

Koodistiil

  • Muutuja nimi peab algama rolli nimetusega. See aitab hiljem hĂ”lpsasti mĂ”ista, millisest rollist muutuja pĂ€rineb ja mille eest see vastutab.
  • Rolleides kasutamisel peate kindlasti jĂ€rgima kapseldamise pĂ”himĂ”tet ja kasutama muutujaid, mis on mÀÀratletud kas rollis endas vĂ”i rollides, millest praegune sĂ”ltub.
  • PĂŒĂŒdke mitte kasutada sĂ”nastikke muutujaid. Ansible ei vĂ”imalda mugavalt eraldi vÀÀrtuste ĂŒlekirjutamist sĂ”nastikus.

    Halva muutuja nÀide:

    myrole_user:
        login: admin
        password: admin

    Siin on login keskkonna sÔltumatu muutuja, kuid password on sÔltuv. Kuid
    kuna nad on ĂŒhendatud sĂ”nastikku, peate selle alati tĂ€ielikult mÀÀrama,
    mis on vÀga ebamugav. Paremini nii:

    myrole_user_login: admin
    myrole_user_password: admin

Muudatused paigaldusplaanides

Paigaldusplaani koostamisel (edaspidi paigaldusplaan) jĂ€rgime reeglit, et see peaks olema paigutatud eraldi hoidlasse. Nii nagu rollid: igaĂŒks oma git-hoidlas. See vĂ”imaldab mĂ”ista, et rollid ja paigaldusplaan on erinevad sĂ”ltumatud objektid paigaldussĂŒsteemis ning ĂŒhe objekti muutused ei tohiks mĂ”jutada teise toimimist. Seda saavutatakse muutujaede vaikimisi vÀÀrtuste muutmisega.

Paigaldusplaani koostamisel, kui ĂŒldiselt kokku vĂ”tta, on vĂ”imalik ĂŒletada rolli muutujaede vaikimisi vÀÀrtusi kahes kohas: paigaldusplaani muutujaedes ja inventeerimise muutujaedes.

mydeploy                        # Paigalduskaust
├── deploy.yml                  # Paigaldusplaan
├── group_vars                  # Paigaldusplaani muutujaede kaust
│   ├── all.yml                 # Fail kogu sĂŒsteemi muutujaede jaoks
│   └── myapi.yml               # Grupi myapi omaduste muutujaede fail
└── inventories                 #
    └── prod                    # Prod keskkonna kaust
        ├── prod.ini            # Inventeerimise fail
        └── group_vars          # Inventeerimise muutujaede kaust
            └── myapi           #
                ├── vars.yml    # Grupiga myapi keskkonna sĂ”ltumatud muutujaed
                └── vault.yml   # Saladused (alati keskkonna sĂ”ltuvad) *

* — Muutujaed ja Seifid

Erinevus seisneb selles, et paigaldusplaani muutujaed kasutatakse alati, kui kutsutakse esile paigaldusplaanid, mis asuvad sellel tasemel. SeetÔttu sobivad need muutujaed suurepÀraselt keskkonnast sÔltumatute muutujaede vaikimisi vÀÀrtuste muutmiseks. Vastupidi, inventeerimise muutujaed kasutatakse ainult konkreetse keskkonna jaoks, mis on ideaalne keskkonnast sÔltuvate muutujaede jaoks.

Oluline on mĂ€rkida, et muutuja prioriteet ei luba teil algul ĂŒletada muutujaid mĂ€nguplaadis ning seejĂ€rel eraldi ĂŒhes inventuuris.

See tÀhendab, et juba sel etapil tuleb otsustada, kas muutuja sÔltub keskkonnast vÔi mitte, ning paigutada see Ôigesse kohta.

NĂ€iteks ĂŒhes projektis oli muutuja, mis vastutas SSL-i sisselĂŒlitamise eest, pikka aega keskkonnast sĂ”ltuv, kuna me ei saanud SSL-i sisselĂŒlitada meie kontrolli alt vĂ€ljas olevatel pĂ”hjustel ĂŒhes testkeskkonnas. PĂ€rast probleemi lahendamist muutus see keskkonnast sĂ”ltumatuks ja viidi mĂ€nguplaadi muutujate hulka.

RĂŒhma omaduste muutujad

Laiendame meie mudelit joonisel 1, lisades 2 serverigruppi teise Java rakendusega, kuid erinevate seadistustega.

SĂŒsteemne lĂ€henemine Ansible'i muutujatele

Kujutame ette, kuidas mÀnguplaan sel juhul vÀlja nÀeb:

- hosts: myapi
  roles:
    - api

- hosts: bbauth
  roles:
    - auth

- hosts: ghauth
  roles:
    - auth

Meil on mĂ€nguplaanis kolm gruppi, seega on soovitatav kohe luua sama palju grupifaile group_vars muutujate inventuuris ja mĂ€nguplaanis. Üks grupifail on sel juhul ĂŒhe teie rakenduse komponendi kirjelduseks mĂ€nguplaanis. Avades grupifaili muutujates, nĂ€ete kohe kĂ”iki erinevusi gruppi kehtestatud rollide vaikimisi kĂ€itumisest. Muutujate inventuuris: grupi kĂ€itumise erinevused seadmest seadmest.

Koodistiil

  • PĂŒĂŒdke ĂŒldse mitte kasutada host_vars muutujaid, kuna need ei kirjelda sĂŒsteemi, vaid ainult erandjuhte, mis tulevikus toob kaasa kĂŒsimusi: "Miks see host erineb teistest?", millele vastuse leidmine ei ole alati kerge.

Sidusmuutujad

Kuid see puudutab omaduste muutujaid, kuid kuidas on sidusmuutujatega?
Nende eripÀra on see, et need peavad olema erinevates gruppides sama vÀÀrtusega.

Alguses oli idee kasutada monstrossset struktuuri nagu:
hostvars[groups['bbauth'][0]]['auth_bind_port'], kuid sellest loobuti kohe
sest sellel on puudused. Esiteks, mahukus. Teiseks, sÔltuvus teatud hostist grupis. Kolmandaks, enne juurutamise alustamist tuleb koguda faktid kÔigilt hostidelt, kui me ei taha saada mÀÀramata muutuja viga.

LÔppkokkuvÔttes otsustati kasutada sidusmuutujaid.

Sidusmuutujad — need to be variables that belong to the playbook and are required to link system objects.

Linking variables are filled in the system's common variables. group_vars/all/vars and are formed by extracting all listener variables from each group and adding the name of the group from which the listener was extracted to the beginning of the variable.

This ensures uniformity and non-overlapping names.

Let's try to link the variables from the example above:

SĂŒsteemne lĂ€henemine Ansible'i muutujatele

Imagine we have variables that depend on each other:

# roles/api/defaults:
# ĐŸĐ”Ń€Đ”ĐŒĐ”ĐœĐœĐ°Ń Đ·Đ°ĐżŃ€ĐŸŃĐ°
api_auth1_address: "http://example.com:80"
api_auth2_address: "http://example2.com:80"

# roles/auth/defaults:
# ĐŸĐ”Ń€Đ”ĐŒĐ”ĐœĐœĐ°Ń ŃĐ»ŃƒŃˆĐ°Ń‚Đ”Đ»ŃŒ
auth_bind_port: "20000"

We will extract all listeners into common variables group_vars/all/vars and add the group's name to the title:

# 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 }}"

Now, by changing the value of the connector, we will be confident that the request will point to where the port is located.

Koodistiil

  • Since roles and groups are different objects in the system, they need to have different names, then the linking variables will clearly show that they belong to a specific server group, not a role in the system.

Environment-dependent files

Files that may differ from environment to environment can be used in roles.

An example of such files can be SSL certificates. Storing them in text form
in a variable is not very convenient. However, it is convenient to store the path to them within the variable.

For example, we use the variable api_ssl_key_file: "/path/to/file".

Since it is obvious that the key certificate will change from environment to environment, this is an environment-dependent variable, and it should therefore be located in the file
group_vars/myapi/vars inventory of variables and contain the value 'for example'.

It is most convenient in this case to place the key file in the playbook repository at the path
files/prod/certs/myapi.key, then the value of the variable will be:
api_ssl_key_file: "prod/certs/myapi.key". The convenience here is that the people responsible for deploying the system on a specific stand also have their designated space in the repository for storing their files. At the same time, there remains the possibility to indicate the absolute path to the certificate on the server, in case the certificates are provided by another system.

Multiple stands in one environment

Tihtipeale on vaja juurutada mitmeid praktiliselt identsed keskkondi minimaalsed erinevused. Sellisel juhul jaotame keskkonnapĂ”hised muutujad nende vahel, mis ei muutu selle keskkonna piires ja nende vahel, mis muutuvad. Viime viimased otse inventarifailidesse. PĂ€rast seda manipuleerimist on vĂ”imalik luua veel ĂŒks inventar otse keskkonna kataloogis.

See kasutab uuesti inventarigrupi muutujaid ning tal on vĂ”imalus ĂŒletada mĂ”ned muutujad otse enda alla.

LÔplik kataloogistruktuur juurutusprojekti jaoks:

mydeploy                        # Juurutuskaust
├── deploy.yml                  # Juurutuse mĂ€ngu fail
├── files                       # Juurutuse failide kaust
│   ├── prod                    # KeskkonnapĂ”histe failide kaust prod seismise jaoks
│   │   └── certs               # 
│   │       └── myapi.key       #
│   └── test1                   # KeskkonnapĂ”histe failide kaust test1 seismise jaoks
├── group_vars                  # MĂ€ngu muutuja kaust
│   ├── all.yml                 # Fail kogu sĂŒsteemi seotuse muutujate jaoks
│   ├── myapi.yml               # Fail myapi grupi omaduste muutujate jaoks
│   ├── bbauth.yml              # 
│   └── ghauth.yml              #
└── inventories                 #
    ├── prod                    # Prod keskkonna kaust
    │   ├── group_vars          # Inventarimuutujate kaust
    │   │   ├── myapi           #
    │   │   │   ├── vars.yml    # KeskkonnapĂ”hised myapi grupi muutujad
    │   │   │   └── vault.yml   # Salajased (alati keskkonnapĂ”hised)
    │   │   ├── bbauth          # 
    │   │   │   ├── vars.yml    #
    │   │   │   └── vault.yml   #
    │   │   └── ghauth          #
    │   │       ├── vars.yml    #
    │   │       └── vault.yml   #
    │   └── prod.ini            # Prod seismise inventar
    └── test                    # Test keskkonna kaust
        ├── group_vars          #
        │   ├── myapi           #
        │   │   ├── vars.yml    #
        │   │   └── vault.yml   #
        │   ├── bbauth          #
        │   │   ├── vars.yml    #
        │   │   └── vault.yml   #
        │   └── ghauth          #
        │       ├── vars.yml    #
        │       └── vault.yml   #
        ├── test1.ini           # Testi olukorra test1 inventar
        └── test2.ini           # Testi olukorra test2 inventar

KokkuvÔte

PĂ€rast muutujate korraldamist artikli jĂ€rgi: iga muutujafail vastutab teatud ĂŒlesande eest. Kuna failil on kindlad ĂŒlesanded, on vĂ”imalik mÀÀrata vastutav isik iga faili Ă”igsuse eest. NĂ€iteks playbook'i muutujate Ă”iguse eest vastutab sĂŒsteemi deploy arendaja, samas kui inventari muutujate tĂ€itmise eest vastutab otseselt administraator, kelle stall on inventaris kirjas.

Rollidest said iseseisvad arenduse ĂŒksused oma liidesele, mis vĂ”imaldas rolli arendajal arendada vĂ”imalusi, mitte kohandada rolli sĂŒsteemi jĂ€rgi. See probleem puudutas eriti ĂŒldisi rolle kogu kampaania sĂŒsteemide jaoks.

SĂŒsteemi administraatorid ei pea enam aru saama deploy koodist. KĂ”ik, mida neilt nĂ”utakse eduka deploy jaoks, on tĂ€ita keskkondade sĂ”ltuvate muutujate failid.

Kirjandus

  1. Dokumentatsioon

Autor

KaljuĆŸny Denis AleksandrovitĆĄ

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster