Agwedd system at newidynnau yn Ansible

anible devops codestyle

Hei! Fy enw i yw Denis Kalyuzhny Rwy'n gweithio fel peiriannydd yn yr adran awtomeiddio prosesau datblygu. Bob dydd, mae rhaglenni newydd yn cael eu hadeiladu i gannoedd o weinyddion ymgyrch. Ac yn yr erthygl hon, rwy'n rhannu fy mhrofiad o ddefnyddio Ansible at y dibenion hyn.

Mae'r canllaw hwn yn cynnig ffordd i drefnu newidynnau mewn defnydd. Mae'r canllaw hwn wedi'i gynllunio ar gyfer y rhai sydd eisoes yn defnyddio rolau yn eu llyfrau chwarae ac yn darllen Arferion gorauond yn rhedeg i mewn i broblemau tebyg:

  • Ar ôl dod o hyd i newidyn yn y cod, mae'n amhosibl deall ar unwaith yr hyn y mae'n gyfrifol amdano;
  • Mae yna sawl rôl, ac mae angen i'r newidynnau fod yn gysylltiedig ag un gwerth, ond nid yw'n gweithio;
  • Cael anhawster i esbonio i eraill sut mae rhesymeg y newidynnau yn eich llyfrau chwarae yn gweithio

Daethom ar draws y problemau hyn ar brosiectau yn ein cwmni, ac o ganlyniad daethom at y rheolau ar gyfer fformatio newidynnau yn ein llyfrau chwarae, a oedd i ryw raddau yn datrys y problemau hyn.

Agwedd system at newidynnau yn Ansible

Newidynnau mewn rolau

Mae Rôl yn Wrthrych System Defnyddio ar wahân. Fel unrhyw wrthrych o'r system, rhaid iddo gael rhyngwyneb ar gyfer rhyngweithio â gweddill y system. Mae newidynnau rôl yn rhyngwyneb o'r fath.

Cymerwch, er enghraifft, y rôl api, sy'n gosod cais Java ar y gweinydd. Pa newidynnau sydd ganddo?

Agwedd system at newidynnau yn Ansible

Gellir rhannu newidynnau rôl yn 2 fath yn ôl math:

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

Priodweddau amrywiol yn newidynnau sy'n diffinio ymddygiad rôl.

Newidynnau Ymholiad yn newidynnau y defnyddir eu gwerth i ddynodi adnoddau y tu allan i'r rôl.

Gwrandawyr amrywiol yn newidynnau y mae eu gwerth yn cael ei ddefnyddio i ffurfio newidynnau ymholiad.

Ar y llaw arall, mae 1a, 2a, 2b yn newidynnau nad ydynt yn dibynnu ar yr amgylchedd (haearn, adnoddau allanol, ac ati) a gellir eu llenwi â gwerthoedd rhagosodedig yn y rôl rhagosodiadau. Fodd bynnag, ni ellir llenwi newidynnau fel 1.b a 2.c â gwerthoedd heblaw 'enghraifft', gan y byddant yn newid o stand i stand yn dibynnu ar yr amgylchedd.

arddull cod

  • Rhaid i enw'r newidyn ddechrau gydag enw'r rôl. Bydd hyn yn ei gwneud hi'n hawdd darganfod yn y dyfodol o ba rôl y mae'r newidyn yn dod a beth mae'n gyfrifol amdano.
  • Wrth ddefnyddio newidynnau mewn rolau, rhaid i chi fod yn siŵr eich bod yn dilyn yr egwyddor o grynhoi a defnyddio newidynnau a ddiffinnir naill ai yn y rôl ei hun neu yn y rolau y mae'r un gyfredol yn dibynnu arnynt.
  • Ceisiwch osgoi defnyddio geiriaduron ar gyfer newidynnau. Nid yw Ansible yn caniatáu ichi ddiystyru gwerthoedd unigol yn gyfleus mewn geiriadur.

    Enghraifft o newidyn gwael:

    myrole_user:
        login: admin
        password: admin

    Yma, mewngofnodi yw'r newidyn canolrif, a chyfrinair yw'r newidyn dibynnol. Ond
    gan eu bod yn cael eu cyfuno mewn geiriadur, bydd yn rhaid i chi ei nodi'n llawn
    Bob amser. Sydd yn anghyfleus iawn. Gwell fel hyn:

    myrole_user_login: admin
    myrole_user_password: admin

Newidynnau mewn llyfrau chwarae lleoli

Wrth lunio llyfr chwarae lleoli (y cyfeirir ato o hyn ymlaen fel llyfr chwarae), rydym yn cadw at y rheol y dylid ei roi mewn ystorfa ar wahân. Yn union fel rolau: pob un yn ei gadwrfa git ei hun. Mae hyn yn eich galluogi i sylweddoli bod y rolau a'r llyfr chwarae yn wrthrychau annibynnol gwahanol o'r system leoli, ac ni ddylai newidiadau mewn un gwrthrych effeithio ar weithrediad y llall. Cyflawnir hyn trwy newid gwerthoedd rhagosodedig y newidynnau.

Wrth lunio llyfr chwarae, i grynhoi, mae'n bosibl diystyru gwerthoedd diofyn newidynnau rôl mewn dau le: mewn newidynnau llyfr chwarae ac mewn newidynnau rhestr eiddo.

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

* - Newidynnau a Vaults

Y gwahaniaeth yw bod newidynnau llyfrau chwarae bob amser yn cael eu defnyddio wrth alw llyfrau chwarae sydd wedi'u lleoli ar yr un lefel ag ef. Mae hyn yn golygu bod y newidynnau hyn yn wych ar gyfer newid gwerthoedd rhagosodedig newidynnau nad ydynt yn dibynnu ar yr amgylchedd. I'r gwrthwyneb, dim ond ar gyfer amgylchedd penodol y defnyddir newidynnau rhestr eiddo, sy'n ddelfrydol ar gyfer newidynnau amgylchedd-benodol.

Mae'n bwysig nodi na fydd blaenoriaeth newidiol yn caniatáu ichi ailddiffinio newidynnau yn gyntaf mewn newidynnau llyfr chwarae ac yna ar wahân yn yr un rhestr eiddo.

Mae hyn yn golygu bod angen i chi benderfynu ar hyn o bryd a yw'r newidyn yn dibynnu ar yr amgylchedd ai peidio a'i roi yn y lle iawn.

Er enghraifft, mewn un prosiect, roedd y newidyn a oedd yn gyfrifol am alluogi SSL yn ddibynnol ar yr amgylchedd am amser hir, gan na allem alluogi SSL am resymau y tu hwnt i'n rheolaeth yn un o'r standiau. Ar ôl i ni drwsio'r mater hwn, daeth yn ganolig annibynnol a symudodd i newidynnau llyfr chwarae.

Newidynnau Eiddo ar gyfer Grwpiau

Gadewch i ni ehangu ein model yn Ffigur 1 trwy ychwanegu 2 grŵp o weinyddion gyda chymhwysiad Java gwahanol, ond gyda gosodiadau gwahanol.

Agwedd system at newidynnau yn Ansible

Dychmygwch sut olwg fydd ar y llyfr chwarae yn yr achos hwn:

- hosts: myapi
  roles:
    - api

- hosts: bbauth
  roles:
    - auth

- hosts: ghauth
  roles:
    - auth

Mae gennym dri grŵp yn y llyfr chwarae, felly argymhellir creu cymaint o ffeiliau grŵp mewn newidynnau rhestr eiddo group_vars a newidynnau llyfrau chwarae ar unwaith. Un ffeil grŵp yn yr achos hwn yw'r disgrifiad o un gydran o'ch cais yn y llyfr chwarae. Pan fyddwch chi'n agor y ffeil grŵp yn y newidynnau llyfr chwarae, fe welwch ar unwaith yr holl wahaniaethau o ymddygiad diofyn y rolau a neilltuwyd i'r grŵp. Mewn newidynnau rhestr eiddo: gwahaniaethau mewn ymddygiad grŵp o fwth i fwth.

arddull cod

  • Ceisiwch beidio â defnyddio newidynnau host_vars o gwbl, gan nad ydynt yn disgrifio'r system, ond dim ond achos arbennig, a fydd yn y tymor hir yn arwain at gwestiynau: "Pam mae'r gwesteiwr hwn yn wahanol i'r gweddill?", Yr ateb yw ddim bob amser yn hawdd dod o hyd iddo.

Cyswllt newidynnau

Fodd bynnag, mae hynny'n ymwneud â newidynnau eiddo, ond beth am newidynnau cyswllt?
Eu gwahaniaeth yw bod yn rhaid iddynt gael yr un gwerth mewn gwahanol grwpiau.

Ar y dechreu yr oedd syniad defnyddiwch adeiladwaith gwrthun o'r ffurflen:
hostvars[groups['bbauth'][0]]['auth_bind_port'], ond rhoddwyd y gorau iddi ar unwaith
oherwydd mae ganddo ddiffygion. Yn gyntaf, y swmp. Yn ail, dibyniaeth ar westeiwr penodol yn y grŵp. Yn drydydd, mae angen casglu ffeithiau gan bob gwesteiwr cyn dechrau'r defnydd, os nad ydym am gael gwall newidiol heb ei ddiffinio.

O ganlyniad, penderfynwyd defnyddio newidynnau cyswllt.

Cyswllt newidynnau yn newidynnau sy'n perthyn i'r llyfr chwarae ac sydd eu hangen i gysylltu gwrthrychau system.

Mae newidynnau cyswllt yn cael eu poblogi mewn newidynnau system cyffredinol group_vars/all/vars ac fe'u ffurfir trwy dynnu pob newidyn gwrandäwr o bob grŵp, ac ychwanegu enw'r grŵp y tynnwyd y gwrandäwr ohono i ddechrau'r newidyn.

Felly, sicrheir unffurfiaeth a di- groestoriad enwau.

Gadewch i ni geisio rhwymo newidynnau o'r enghraifft uchod:

Agwedd system at newidynnau yn Ansible

Dychmygwch fod gennym ni newidynnau sy'n dibynnu ar ei gilydd:

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

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

Gadewch i ni ei roi mewn newidynnau cyffredin group_vars/all/vars holl wrandawyr, ac ychwanegu enw'r grŵp at yr enw:

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

Nawr, trwy newid gwerth y cysylltydd, byddwn yn sicr y bydd y cais yn mynd i'r un porthladd.

arddull cod

  • Gan fod rolau a grwpiau yn wrthrychau gwahanol yn y system, mae angen i chi gael enwau gwahanol ar eu cyfer, yna bydd y newidynnau cyswllt yn dangos yn gywir eu bod yn perthyn i grŵp penodol o weinyddion, ac nid i rôl yn y system.

Ffeiliau amgylchedd

Gall rolau ddefnyddio ffeiliau sy'n amrywio o amgylchedd i amgylchedd.

Mae tystysgrifau SSL yn enghraifft o ffeiliau o'r fath. Storiwch nhw fel testun
Nid yw mewn newidyn yn gyfleus iawn. Ond mae'n gyfleus storio'r llwybr iddynt y tu mewn i newidyn.

Er enghraifft, rydym yn defnyddio'r newidyn api_ssl_key_file: "/path/to/file".

Gan ei bod yn amlwg y bydd y dystysgrif allweddol yn newid o amgylchedd i amgylchedd, mae hwn yn newidyn sy'n dibynnu ar yr amgylchedd, sy'n golygu y dylid ei leoli yn y ffeil
group_vars/myapi/vars rhestr o newidynnau, ac yn cynnwys y gwerth 'er enghraifft'.

Y ffordd fwyaf cyfleus yn yr achos hwn yw rhoi'r ffeil allweddol yn y storfa llyfr chwarae ar hyd y llwybr
files/prod/certs/myapi.key, yna gwerth y newidyn fydd:
api_ssl_key_file: "prod/certs/myapi.key". Mae'r cyfleustra yn gorwedd yn y ffaith bod gan y bobl sy'n gyfrifol am ddefnyddio'r system ar stondin benodol eu lle pwrpasol eu hunain yn y storfa i storio eu ffeiliau. Ar yr un pryd, mae'n dal yn bosibl nodi'r llwybr absoliwt i'r dystysgrif ar y gweinydd, rhag ofn y bydd y tystysgrifau'n cael eu cyflenwi gan system arall.

Stondinau lluosog mewn un amgylchedd

Yn aml mae angen gosod sawl clystyrau sydd bron yn union yr un fath yn yr un amgylchedd heb fawr ddim gwahaniaethau. Yn yr achos hwn, rydym yn rhannu newidynnau sy'n dibynnu ar yr amgylchedd i'r rhai nad ydynt yn newid o fewn yr amgylchedd hwn a'r rhai sy'n newid. Ac rydym yn cymryd yr olaf allan yn uniongyrchol i'r ffeiliau rhestr eiddo eu hunain. Ar ôl y driniaeth hon, daw'n bosibl creu rhestr eiddo arall yn uniongyrchol yn y cyfeiriadur amgylchedd.

Bydd yn ailddefnyddio'r rhestr grŵp_vars a hefyd yn gallu ailddiffinio rhai newidynnau yn uniongyrchol iddo'i hun.

Y strwythur cyfeiriadur terfynol ar gyfer y prosiect lleoli:

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

Crynhoi

Ar ôl trefnu'r newidynnau yn unol â'r erthygl: mae pob ffeil â newidynnau yn gyfrifol am dasg benodol. A chan fod gan y ffeil rai tasgau, daeth yn bosibl penodi person sy'n gyfrifol am gywirdeb pob ffeil. Er enghraifft, mae datblygwr y gosodiad system yn dod yn gyfrifol am lenwi'r newidynnau llyfr chwarae yn gywir, tra bod y gweinyddwr, y mae ei stondin yn cael ei ddisgrifio yn y rhestr eiddo, yn uniongyrchol gyfrifol am lenwi'r rhestr o newidynnau.

Daeth Rolau yn uned ddatblygu hunangynhwysol gyda'u rhyngwyneb eu hunain, gan ganiatáu i'r datblygwr rôl ddatblygu nodweddion yn hytrach na theilwra'r rôl i ffitio'r system. Roedd y mater hwn yn arbennig o wir ar gyfer rolau cyffredin ar gyfer pob system mewn ymgyrch.

Nid oes angen i weinyddwyr systemau ddeall y cod defnyddio mwyach. Y cyfan sy'n ofynnol ganddynt ar gyfer defnydd llwyddiannus yw llenwi'r ffeiliau o newidynnau amgylchedd.

Llenyddiaeth

  1. Cofnodion

Awdur

Kalyuzhny Denis Alexandrovich

Ffynhonnell: hab.com

Ychwanegu sylw