Sistema nga pamaagi sa mga variable sa Ansible

ansible devops codestyle

Hoy! Akong ngalan Denis Kalyuzhny Nagtrabaho ko isip usa ka engineer sa development process automation department. Kada adlaw, ang mga bag-ong aplikasyon nga gitukod gilukot sa gatusan nga mga server sa kampanya. Ug sa kini nga artikulo, gipaambit nako ang akong kasinatian sa paggamit sa Ansible alang sa kini nga mga katuyoan.

Kini nga giya nagtanyag usa ka paagi aron maorganisar ang mga variable sa usa ka pag-deploy. Kini nga giya gidisenyo alang niadtong naggamit na og mga tahas sa ilang mga playbook ug nagbasa Labing maayo nga mga gawiapan nagdagan sa parehas nga mga problema:

  • Kay nakit-an ang usa ka variable sa code, imposible nga masabtan dayon kung unsa ang responsable niini;
  • Adunay ubay-ubay nga mga tahas, ug ang mga variable kinahanglan nga adunay kalabotan sa usa ka kantidad, apan dili kini molihok;
  • Naglisud sa pagpatin-aw sa uban kung giunsa ang lohika sa mga variable sa imong mga playbook molihok

Nasugatan namon kini nga mga problema sa mga proyekto sa among kompanya, ingon usa ka sangputanan diin nakaabut kami sa mga lagda alang sa pag-format sa mga variable sa among mga playbook, nga sa pila ka bahin nakasulbad sa kini nga mga problema.

Sistema nga pamaagi sa mga variable sa Ansible

Mga variable sa mga tahas

Ang usa ka Papel usa ka bulag nga Deployment System Object. Sama sa bisan unsang butang sa sistema, kini kinahanglan nga adunay usa ka interface alang sa pakig-uban sa ubang bahin sa sistema. Ang mga variable sa papel usa ka interface.

Tagda, pananglitan, ang papel api, nga nag-instalar og Java nga aplikasyon sa server. Unsa nga mga variable ang naa niini?

Sistema nga pamaagi sa mga variable sa Ansible

Ang mga baryable sa papel mahimong bahinon sa 2 nga mga klase pinaagi sa tipo:

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

Variable nga mga kabtangan mao ang mga baryable nga naghubit sa kinaiya sa usa ka papel.

Mga Variable sa Pangutana mao ang mga variable kansang bili gigamit sa pagtudlo sa mga kahinguhaan sa gawas sa papel.

Variable Listeners mao ang mga variable kansang kantidad gigamit sa pagporma sa mga variable sa pangutana.

Sa laing bahin, ang 1a, 2a, 2b mga baryable nga wala magdepende sa palibot (iron, external resources, etc.) ug mahimong mapuno sa default values ​​sa defaults role. Bisan pa, ang mga variable sama sa 1.b ug 2.c dili mapuno sa mga kantidad gawas sa 'pananglitan', tungod kay kini magbag-o gikan sa stand hangtod sa stand depende sa palibot.

estilo sa code

  • Ang ngalan sa variable kinahanglan magsugod sa ngalan sa papel. Kini makapasayon ​​sa paghunahuna sa umaabot kung unsa ang papel sa variable ug kung unsa ang responsable niini.
  • Kung gigamit ang mga variable sa mga tahas, kinahanglan nga sigurado ka nga sundon ang prinsipyo sa encapsulation ug gamiton ang mga variable nga gihubit bisan sa papel mismo o sa mga tahas nga gisaligan sa karon.
  • Likayi ang paggamit sa mga diksyonaryo para sa mga variable. Ang Ansible wala magtugot kanimo nga dali nga ma-override ang mga indibidwal nga kantidad sa usa ka diksyonaryo.

    Usa ka pananglitan sa dili maayo nga variable:

    myrole_user:
        login: admin
        password: admin

    Dinhi, ang pag-login mao ang median nga variable, ug ang password mao ang dependent variable. Apan
    tungod kay sila gihiusa sa usa ka diksyonaryo, kinahanglan nimo nga ipiho kini sa tibuuk
    Kanunay. Nga inconvenient kaayo. Mas maayo niining paagiha:

    myrole_user_login: admin
    myrole_user_password: admin

Mga variable sa deployment playbook

Kung nag-compile sa usa ka deployment playbook (gitawag dinhi nga usa ka playbook), among gisunod ang lagda nga kini kinahanglan ibutang sa usa ka bulag nga repository. Sama sa mga tahas: ang matag usa sa kaugalingon nga git repository. Gitugotan ka niini nga mahibal-an nga ang mga tahas ug ang playbook lahi nga independente nga mga butang sa sistema sa pag-deploy, ug ang mga pagbag-o sa usa ka butang kinahanglan dili makaapekto sa operasyon sa lain. Nakab-ot kini pinaagi sa pagbag-o sa mga default nga kantidad sa mga variable.

Kung nag-compile sa usa ka playbook, sa pag-summarize, posible nga i-override ang default nga mga kantidad sa mga variable nga papel sa duha ka lugar: sa mga variable sa playbook ug sa mga variable sa imbentaryo.

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

* - Variable ug Vaults

Ang kalainan mao nga ang mga variable sa playbook kanunay nga gigamit kung nagtawag sa mga playbook nga nahimutang sa parehas nga lebel niini. Kini nagpasabut nga kini nga mga variable maayo alang sa pagbag-o sa mga default nga kantidad sa mga variable nga wala magdepende sa palibot. Sa kasukwahi, ang mga variable sa imbentaryo gamiton lamang alang sa usa ka partikular nga palibot, nga maayo alang sa mga variable nga piho sa palibot.

Mahinungdanon nga timan-an nga ang variable precedence dili magtugot kanimo sa pag-redefine sa mga variable una sa mga variable sa playbook ug dayon gilain sa parehas nga imbentaryo.

Kini nagpasabot nga sa niini nga yugto kinahanglan nimo nga magdesisyon kung ang variable ba nagsalig sa palibot o dili ug ibutang kini sa husto nga lugar.

Pananglitan, sa usa ka proyekto, ang variable nga responsable sa pagpagana sa SSL kay nagsalig sa kalikopan sa dugay nga panahon, tungod kay dili namo mahimo ang SSL sa mga rason nga dili namo makontrol sa usa sa mga stand. Pagkahuman namong giayo kini nga isyu, nahimo kini nga medium nga independente ug gibalhin sa mga variable sa playbook.

Mga Variable sa Property para sa mga Grupo

Atong palapdan ang atong modelo sa Figure 1 pinaagi sa pagdugang sa 2 ka grupo sa mga server nga adunay lain nga Java nga aplikasyon, apan adunay lain-laing mga setting.

Sistema nga pamaagi sa mga variable sa Ansible

Hunahunaa kung unsa ang hitsura sa playbook sa kini nga kaso:

- hosts: myapi
  roles:
    - api

- hosts: bbauth
  roles:
    - auth

- hosts: ghauth
  roles:
    - auth

Naa miy tulo ka grupo sa playbook, mao nga girekomendar ang paghimo ug daghang group files sa group_vars inventory variables ug playbook variables sa makausa. Ang usa ka grupo nga file niini nga kaso mao ang paghulagway sa usa ka bahin sa imong aplikasyon sa playbook. Kung ablihan nimo ang file sa grupo sa mga variable sa playbook, makita dayon nimo ang tanan nga mga kalainan gikan sa default nga pamatasan sa mga tahas nga gihatag sa grupo. Sa mga variable sa imbentaryo: mga kalainan sa pamatasan sa grupo gikan sa booth hangtod sa booth.

estilo sa code

  • Sulayi nga dili mogamit sa host_vars variable sa tanan, tungod kay wala nila gihulagway ang sistema, apan usa lamang ka espesyal nga kaso, nga sa kadugayan magdala sa mga pangutana: "Ngano nga kini nga host lahi sa uban?", Ang tubag diin mao ang dili kanunay sayon ​​nga pangitaon.

Link variables

Bisan pa, kana bahin sa mga variable sa kabtangan, apan unsa ang bahin sa mga variable sa link?
Ang ilang kalainan mao nga sila kinahanglan adunay parehas nga kantidad sa lainlaing mga grupo.

Sa sinugdanan naa ideya gamita ang usa ka makalilisang nga pagtukod sa porma:
hostvars[groups['bbauth'][0]]['auth_bind_port'], pero gibiyaan dayon
tungod kay kini adunay mga sayup. Una, ang bulkiness. Ikaduha, ang pagsalig sa usa ka piho nga host sa grupo. Ikatulo, gikinahanglan ang pagkolekta sa mga kamatuoran gikan sa tanan nga mga host sa dili pa magsugod ang deployment, kung dili nato gusto nga makakuha og usa ka dili matino nga variable error.

Ingon usa ka sangputanan, nakahukom nga gamiton ang mga variable sa link.

Link variables mga variable nga nahisakop sa playbook ug gikinahanglan aron masumpay ang mga butang sa sistema.

Ang mga baryable sa link kay gipuy-an sa kinatibuk-ang mga variable sa sistema group_vars/all/vars ug naporma pinaagi sa pagtangtang sa tanang tigpaminaw nga mga variable gikan sa matag grupo, ug pagdugang sa ngalan sa grupo diin ang tigpaminaw gikuha ngadto sa sinugdanan sa variable.

Sa ingon, ang pagkaparehas ug dili intersection sa mga ngalan gisiguro.

Atong sulayan ang pagbugkos sa mga variable gikan sa pananglitan sa ibabaw:

Sistema nga pamaagi sa mga variable sa Ansible

Hunahunaa nga kita adunay mga variable nga nagdepende sa usag usa:

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

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

Ibutang nato kini sa komon nga mga variable group_vars/all/vars tanan nga tigpaminaw, ug idugang ang ngalan sa grupo sa ngalan:

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

Karon, pinaagi sa pag-usab sa bili sa connector, kita makasiguro nga ang hangyo moadto sa samang pantalan.

estilo sa code

  • Tungod kay ang mga tahas ug mga grupo lainlain nga mga butang sa sistema, kinahanglan sila adunay lainlaing mga ngalan aron ang mga variable sa link tukma nga magpakita nga sila nahisakop sa usa ka piho nga grupo sa server, ug dili sa usa ka papel sa sistema.

Mga file sa palibot

Ang mga tahas makagamit sa mga file nga lahi sa palibot.

Ang mga sertipiko sa SSL usa ka pananglitan sa ingon nga mga file. Itago kini ingon nga teksto
sa usa ka variable dili kaayo kombenyente. Apan sayon ​​​​ang pagtipig sa agianan ngadto kanila sulod sa usa ka variable.

Pananglitan, gigamit nato ang variable api_ssl_key_file: "/path/to/file".

Tungod kay klaro nga ang yawe nga sertipiko mausab gikan sa kalikopan ngadto sa kalikopan, kini usa ka variable nga nagsalig sa kalikopan, nga nagpasabut nga kini kinahanglan nga nahimutang sa file
group_vars/myapi/vars imbentaryo sa mga variable, ug adunay sulud nga kantidad 'pananglitan'.

Ang labing sayon ​​​​nga paagi niini nga kaso mao ang pagbutang sa yawe nga file sa playbook repository sa daplin sa dalan
files/prod/certs/myapi.key, unya ang bili sa variable mahimong:
api_ssl_key_file: "prod/certs/myapi.key". Ang kasayon ​​anaa sa kamatuoran nga ang mga tawo nga responsable sa pag-deploy sa sistema sa usa ka partikular nga baruganan adunay ilang kaugalingon nga gipahinungod nga lugar sa repository aron matipigan ang ilang mga file. Sa parehas nga oras, nagpabilin nga posible nga ipiho ang hingpit nga agianan sa sertipiko sa server, kung ang mga sertipiko gihatag sa lain nga sistema.

Daghang baroganan sa usa ka palibot

Kasagaran adunay panginahanglan sa pag-deploy sa daghang halos parehas nga mga baruganan sa parehas nga palibot nga adunay gamay nga kalainan. Sa kini nga kaso, gibahin namon ang mga variable nga nagsalig sa kalikopan sa mga wala magbag-o sa sulod niini nga palibot ug sa mga nagbag-o. Ug among gikuha ang naulahi direkta sa mga file sa imbentaryo mismo. Pagkahuman sa kini nga pagmaniobra, mahimo’g mahimo ang paghimo og lain nga imbentaryo nga direkta sa direktoryo sa palibot.

Gamiton niini pag-usab ang imbentaryo sa group_vars ug mahimo usab nga mabag-o ang pipila ka mga variable nga direkta alang sa iyang kaugalingon.

Ang katapusan nga istruktura sa direktoryo alang sa proyekto sa pag-deploy:

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

Summing up

Human sa pag-organisar sa mga baryable sumala sa artikulo: ang matag file nga adunay mga baryable responsable sa usa ka piho nga buluhaton. Ug tungod kay ang file adunay pipila ka mga buluhaton, nahimo nga posible nga itudlo ang usa ka tawo nga responsable sa pagkahusto sa matag file. Pananglitan, ang nag-develop sa pag-deploy sa sistema mahimong responsable sa husto nga pagpuno sa mga variable sa playbook, samtang ang tagdumala, kansang baruganan gihulagway sa imbentaryo, direkta nga responsable sa pagpuno sa imbentaryo sa mga variable.

Ang mga tahas nahimong usa ka self-contained development unit nga adunay kaugalingong interface, nga nagtugot sa role developer sa pagpalambo sa mga feature kay sa pagpahaom sa papel nga mohaum sa sistema. Kini nga isyu ilabinang tinuod alang sa komon nga mga tahas alang sa tanang sistema sa usa ka kampanya.

Dili na kinahanglan nga masabtan sa mga tagdumala sa sistema ang deployment code. Ang tanan nga gikinahanglan kanila alang sa usa ka malampuson nga pag-deploy mao ang pagpuno sa mga file sa mga variable sa palibot.

Literatura

  1. Документация

awtor nga

Kalyuzhny Denis Alexandrovich

Source: www.habr.com

Idugang sa usa ka comment