Cyflwyniad i Byped

Mae pyped yn system rheoli cyfluniad. Fe'i defnyddir i ddod â gwesteiwyr i'r cyflwr dymunol a chynnal y cyflwr hwn.

Rwyf wedi bod yn gweithio gyda Puppet ers dros bum mlynedd bellach. Mae'r testun hwn yn ei hanfod yn gasgliad wedi'i gyfieithu a'i aildrefnu o bwyntiau allweddol o'r ddogfennaeth swyddogol, a fydd yn caniatáu i ddechreuwyr ddeall hanfod Pyped yn gyflym.

Cyflwyniad i Byped

Gwybodaeth Sylfaenol

Mae system weithredu Pyped yn weinydd cleient, er ei fod hefyd yn cefnogi gweithrediad di-weinydd gyda swyddogaeth gyfyngedig.

Defnyddir model gweithredu tynnu: yn ddiofyn, unwaith bob hanner awr, mae cleientiaid yn cysylltu â'r gweinydd am ffurfweddiad a'i gymhwyso. Os ydych chi wedi gweithio gydag Ansible, yna maen nhw'n defnyddio model gwthio gwahanol: mae'r gweinyddwr yn cychwyn y broses o gymhwyso'r cyfluniad, ni fydd y cleientiaid eu hunain yn cymhwyso unrhyw beth.

Yn ystod cyfathrebu rhwydwaith, defnyddir amgryptio TLS dwy ffordd: mae gan y gweinydd a'r cleient eu bysellau preifat eu hunain a thystysgrifau cyfatebol. Yn nodweddiadol mae'r gweinydd yn rhoi tystysgrifau i gleientiaid, ond mewn egwyddor mae'n bosibl defnyddio CA allanol.

Cyflwyniad i faniffestos

Mewn terminoleg Pypedau i'r gweinydd pypedau cysylltu nodau (nodau). Mae'r ffurfweddiad ar gyfer y nodau wedi'i ysgrifennu mewn maniffestos mewn iaith raglennu arbennig - Pyped DSL.

Mae pyped DSL yn iaith ddatganiadol. Mae'n disgrifio cyflwr dymunol y nod ar ffurf datganiadau adnoddau unigol, er enghraifft:

  • Mae'r ffeil yn bodoli ac mae ganddi gynnwys penodol.
  • Mae'r pecyn wedi'i osod.
  • Mae'r gwasanaeth wedi dechrau.

Gellir cydgysylltu adnoddau:

  • Mae dibyniaethau, maent yn effeithio ar y drefn y defnyddir adnoddau.
    Er enghraifft, “gosodwch y pecyn yn gyntaf, yna golygwch y ffeil ffurfweddu, yna dechreuwch y gwasanaeth.”
  • Mae yna hysbysiadau - os yw adnodd wedi newid, mae'n anfon hysbysiadau i'r adnoddau y tanysgrifiwyd iddo.
    Er enghraifft, os bydd y ffeil ffurfweddu yn newid, gallwch ailgychwyn y gwasanaeth yn awtomatig.

Yn ogystal, mae gan y Pyped DSL swyddogaethau a newidynnau, yn ogystal â datganiadau amodol a detholwyr. Cefnogir amrywiol fecanweithiau templed hefyd - EPP ac ERB.

Mae pyped wedi'i ysgrifennu yn Ruby, felly mae llawer o'r lluniadau a'r termau wedi'u cymryd oddi yno. Mae Ruby yn caniatáu ichi ehangu Pyped - ychwanegu rhesymeg gymhleth, mathau newydd o adnoddau, swyddogaethau.

Tra bod Pyped yn rhedeg, mae maniffestau ar gyfer pob nod penodol ar y gweinydd yn cael eu crynhoi mewn cyfeiriadur. Каталог yn rhestr o adnoddau a'u perthnasoedd ar ôl cyfrifo gwerth ffwythiannau, newidynnau ac ehangiad datganiadau amodol.

Cystrawen a steil cod

Dyma adrannau o'r ddogfennaeth swyddogol a fydd yn eich helpu i ddeall y gystrawen os nad yw'r enghreifftiau a ddarperir yn ddigon:

Dyma enghraifft o sut olwg sydd ar y maniffest:

# Комментарии пишутся, как и много где, после решётки.
#
# Описание конфигурации ноды начинается с ключевого слова node,
# за которым следует селектор ноды — хостнейм (с доменом или без)
# или регулярное выражение для хостнеймов, или ключевое слово default.
#
# После этого в фигурных скобках описывается собственно конфигурация ноды.
#
# Одна и та же нода может попасть под несколько селекторов. Про приоритет
# селекторов написано в статье про синтаксис описания нод.
node 'hostname', 'f.q.d.n', /regexp/ {
  # Конфигурация по сути является перечислением ресурсов и их параметров.
  #
  # У каждого ресурса есть тип и название.
  #
  # Внимание: не может быть двух ресурсов одного типа с одинаковыми названиями!
  #
  # Описание ресурса начинается с его типа. Тип пишется в нижнем регистре.
  # Про разные типы ресурсов написано ниже.
  #
  # После типа в фигурных скобках пишется название ресурса, потом двоеточие,
  # дальше идёт опциональное перечисление параметров ресурса и их значений.
  # Значения параметров указываются через т.н. hash rocket (=>).
  resource { 'title':
    param1 => value1,
    param2 => value2,
    param3 => value3,
  }
}

Nid yw mewnoliad a thoriadau llinell yn rhan ofynnol o'r maniffest, ond argymhellir canllaw arddull. Crynodeb:

  • Ni ddefnyddir indentau dau ofod, tabiau.
  • Mae braces cyrliog yn cael eu gwahanu gan ofod; nid yw colon yn cael ei wahanu gan ofod.
  • Comas ar ôl pob paramedr, gan gynnwys yr un olaf. Mae pob paramedr ar linell ar wahân. Gwneir eithriad ar gyfer yr achos heb baramedrau ac un paramedr: gallwch ysgrifennu ar un llinell a heb goma (h.y. resource { 'title': } и resource { 'title': param => value }).
  • Dylai'r saethau ar y paramedrau fod ar yr un lefel.
  • Ysgrifennir saethau perthynas adnoddau o'u blaenau.

Lleoliad y ffeiliau ar papetserver

Am esboniad pellach, byddaf yn cyflwyno'r cysyniad o "cyfeiriadur gwraidd". Y cyfeiriadur gwraidd yw'r cyfeiriadur sy'n cynnwys y ffurfweddiad Pyped ar gyfer nod penodol.

Mae'r cyfeiriadur gwraidd yn amrywio yn dibynnu ar y fersiwn o Pyped a'r amgylcheddau a ddefnyddir. Mae amgylcheddau yn setiau annibynnol o ffurfweddiadau sy'n cael eu storio mewn cyfeirlyfrau ar wahân. Fe'i defnyddir fel arfer mewn cyfuniad â git, ac os felly mae amgylcheddau'n cael eu creu o ganghennau git. Yn unol â hynny, mae pob nod wedi'i leoli mewn un amgylchedd neu'r llall. Gellir ffurfweddu hyn ar y nod ei hun, neu yn ENC, y byddaf yn siarad amdano yn yr erthygl nesaf.

  • Yn y trydydd fersiwn ("hen Byped") oedd y cyfeiriadur sylfaen /etc/puppet. Mae'r defnydd o amgylcheddau yn ddewisol - er enghraifft, nid ydym yn eu defnyddio gyda'r hen Byped. Os defnyddir amgylcheddau, maent fel arfer yn cael eu storio ynddynt /etc/puppet/environments, y cyfeiriadur gwraidd fydd y cyfeiriadur amgylchedd. Os na ddefnyddir amgylcheddau, y cyfeiriadur gwraidd fydd y cyfeiriadur sylfaenol.
  • Gan ddechrau o'r pedwerydd fersiwn (“Puppet newydd”), daeth y defnydd o amgylcheddau yn orfodol, a symudwyd y cyfeiriadur sylfaenol i /etc/puppetlabs/code. Yn unol â hynny, mae amgylcheddau'n cael eu storio ynddynt /etc/puppetlabs/code/environments, cyfeiriadur gwraidd yw'r cyfeiriadur amgylchedd.

Rhaid bod is-gyfeiriadur yn y cyfeiriadur gwraidd manifests, sy'n cynnwys un neu fwy o faniffestau sy'n disgrifio'r nodau. Yn ogystal, dylai fod is-gyfeiriadur modules, sy'n cynnwys y modiwlau. Fe ddywedaf wrthych beth yw'r modiwlau ychydig yn ddiweddarach. Yn ogystal, efallai y bydd gan yr hen Byped hefyd is-gyfeiriadur files, sy'n cynnwys ffeiliau amrywiol yr ydym yn eu copïo i'r nodau. Yn y Pyped newydd, gosodir pob ffeil mewn modiwlau.

Mae gan y ffeiliau maniffest yr estyniad .pp.

Cwpl o enghreifftiau ymladd

Disgrifiad o'r nod a'r adnodd arno

Ar y nôd server1.testdomain rhaid creu ffeil /etc/issue gyda chynnwys Debian GNU/Linux n l. Rhaid i'r ffeil fod yn eiddo i ddefnyddiwr a grŵp root, rhaid i hawliau mynediad fod 644.

Rydym yn ysgrifennu maniffesto:

node 'server1.testdomain' {   # блок конфигурации, относящийся к ноде server1.testdomain
    file { '/etc/issue':   # описываем файл /etc/issue
        ensure  => present,   # этот файл должен существовать
        content => 'Debian GNU/Linux n l',   # у него должно быть такое содержимое
        owner   => root,   # пользователь-владелец
        group   => root,   # группа-владелец
        mode    => '0644',   # права на файл. Они заданы в виде строки (в кавычках), потому что иначе число с 0 в начале будет воспринято как записанное в восьмеричной системе, и всё пойдёт не так, как задумано
    }
}

Perthynas rhwng adnoddau ar nod

Ar y nôd server2.testdomain rhaid i nginx fod yn rhedeg, gan weithio gyda chyfluniad a baratowyd yn flaenorol.

Gadewch i ni ddadelfennu'r broblem:

  • Mae angen gosod y pecyn nginx.
  • Mae angen copïo'r ffeiliau ffurfweddu o'r gweinydd.
  • Mae angen i'r gwasanaeth fod yn rhedeg nginx.
  • Os caiff y cyfluniad ei ddiweddaru, rhaid ailgychwyn y gwasanaeth.

Rydym yn ysgrifennu maniffesto:

node 'server2.testdomain' {   # блок конфигурации, относящийся к ноде server2.testdomain
    package { 'nginx':   # описываем пакет nginx
        ensure => installed,   # он должен быть установлен
    }
  # Прямая стрелка (->) говорит о том, что ресурс ниже должен
  # создаваться после ресурса, описанного выше.
  # Такие зависимости транзитивны.
    -> file { '/etc/nginx':   # описываем файл /etc/nginx
        ensure  => directory,   # это должна быть директория
        source  => 'puppet:///modules/example/nginx-conf',   # её содержимое нужно брать с паппет-сервера по указанному адресу
        recurse => true,   # копировать файлы рекурсивно
        purge   => true,   # нужно удалять лишние файлы (те, которых нет в источнике)
        force   => true,   # удалять лишние директории
    }
  # Волнистая стрелка (~>) говорит о том, что ресурс ниже должен
  # подписаться на изменения ресурса, описанного выше.
  # Волнистая стрелка включает в себя прямую (->).
    ~> service { 'nginx':   # описываем сервис nginx
        ensure => running,   # он должен быть запущен
        enable => true,   # его нужно запускать автоматически при старте системы
    }
  # Когда ресурс типа service получает уведомление,
  # соответствующий сервис перезапускается.
}

Er mwyn i hyn weithio, mae angen tua'r lleoliad ffeil canlynol arnoch ar y gweinydd pypedau:

/etc/puppetlabs/code/environments/production/ # (это для нового Паппета, для старого корневой директорией будет /etc/puppet)
├── manifests/
│   └── site.pp
└── modules/
    └── example/
        └── files/
            └── nginx-conf/
                ├── nginx.conf
                ├── mime.types
                └── conf.d/
                    └── some.conf

Mathau o Adnoddau

Mae rhestr gyflawn o'r mathau o adnoddau a gefnogir i'w gweld yma yn y ddogfennaeth, yma byddaf yn disgrifio pum math sylfaenol, sydd yn fy arfer yn ddigon i ddatrys y rhan fwyaf o broblemau.

file

Yn rheoli ffeiliau, cyfeiriaduron, dolenni syml, eu cynnwys, a hawliau mynediad.

Paramedrau:

  • enw adnodd - llwybr i'r ffeil (dewisol)
  • llwybr — llwybr i'r ffeil (os nad yw wedi'i nodi yn yr enw)
  • sicrhau - math o ffeil:
    • absent - dileu ffeil
    • present — rhaid cael ffeil o unrhyw fath (os nad oes ffeil, bydd ffeil reolaidd yn cael ei chreu)
    • file - ffeil rheolaidd
    • directory - cyfeiriadur
    • link - symlink
  • cynnwys — cynnwys ffeil (yn addas ar gyfer ffeiliau arferol yn unig, ni ellir ei ddefnyddio ynghyd â ffynhonnell neu targed)
  • ffynhonnell — dolen i'r llwybr yr ydych am gopïo cynnwys y ffeil ohono (ni ellir ei ddefnyddio ynghyd â cynnwys neu targed). Gellir ei nodi fel naill ai URI gyda chynllun puppet: (yna bydd ffeiliau o'r gweinydd pypedau yn cael eu defnyddio), a chyda'r cynllun http: (Rwy'n gobeithio ei bod yn glir beth fydd yn digwydd yn yr achos hwn), a hyd yn oed gyda'r diagram file: neu fel llwybr absoliwt heb sgema (yna bydd y ffeil o'r FS lleol ar y nod yn cael ei ddefnyddio)
  • targed — lle dylai'r ddolen syml bwyntio (ni ellir ei ddefnyddio ynghyd â cynnwys neu ffynhonnell)
  • perchennog — y defnyddiwr a ddylai fod yn berchen ar y ffeil
  • grŵp — y grŵp y dylai'r ffeil berthyn iddo
  • modd — caniatadau ffeil (fel llinyn)
  • ail-ddigwydd - galluogi prosesu cyfeiriadur ailadroddus
  • carthu - galluogi dileu ffeiliau nad ydynt yn cael eu disgrifio yn Pyped
  • gorfodi - galluogi dileu cyfeiriaduron nad ydynt yn cael eu disgrifio yn Puppet

pecyn

Yn gosod ac yn dileu pecynnau. Yn gallu trin hysbysiadau - yn ailosod y pecyn os yw'r paramedr wedi'i nodi ailosod_on_refresh.

Paramedrau:

  • enw adnodd — enw pecyn (dewisol)
  • enw — enw pecyn (os nad yw wedi'i nodi yn yr enw)
  • darparwr - rheolwr pecyn i'w ddefnyddio
  • sicrhau - cyflwr dymunol y pecyn:
    • present, installed - unrhyw fersiwn wedi'i osod
    • latest - fersiwn diweddaraf wedi'i osod
    • absent - dileu (apt-get remove)
    • purged — dileu ynghyd â ffeiliau ffurfweddu (apt-get purge)
    • held - mae fersiwn pecyn wedi'i gloi (apt-mark hold)
    • любая другая строка - mae'r fersiwn penodedig wedi'i osod
  • ailosod_on_refresh - os true, yna ar ôl derbyn yr hysbysiad bydd y pecyn yn cael ei ailosod. Yn ddefnyddiol ar gyfer dosbarthiadau seiliedig ar ffynhonnell, lle gall fod angen pecynnau ailadeiladu wrth newid paramedrau adeiladu. Diofyn false.

gwasanaeth

Yn rheoli gwasanaethau. Yn gallu prosesu hysbysiadau - yn ailgychwyn y gwasanaeth.

Paramedrau:

  • enw adnodd — gwasanaeth i'w reoli (dewisol)
  • enw — y gwasanaeth sydd angen ei reoli (os nad yw wedi ei nodi yn yr enw)
  • sicrhau — cyflwr dymunol y gwasanaeth:
    • running - lansio
    • stopped - stopio
  • alluogi — yn rheoli'r gallu i gychwyn y gwasanaeth:
    • true — mae autorun wedi'i alluogi (systemctl enable)
    • mask - cuddiedig (systemctl mask)
    • false — mae autorun wedi ei analluogi (systemctl disable)
  • ail-gychwyn - gorchymyn i ailgychwyn y gwasanaeth
  • statws - gorchymyn i wirio statws gwasanaeth
  • wedi ailgychwyn - nodwch a yw'r initscript gwasanaeth yn cefnogi ailgychwyn. Os false ac mae'r paramedr wedi'i nodi ail-gychwyn — defnyddir gwerth y paramedr hwn. Os false a pharamedr ail-gychwyn heb ei nodi - mae'r gwasanaeth yn cael ei stopio a dechrau ailgychwyn (ond mae systemd yn defnyddio'r gorchymyn systemctl restart).
  • hasstatus - nodwch a yw'r initscript gwasanaeth yn cefnogi'r gorchymyn status. Os false, yna defnyddir y gwerth paramedr statws. Diofyn true.

exec

Yn rhedeg gorchmynion allanol. Os nad ydych yn nodi paramedrau yn creu, unigif, oni bai neu adfywiol, bydd y gorchymyn yn cael ei redeg bob tro y bydd Pyped yn cael ei redeg. Yn gallu prosesu hysbysiadau - yn rhedeg gorchymyn.

Paramedrau:

  • enw adnodd - gorchymyn i'w weithredu (dewisol)
  • gorchymyn - y gorchymyn i'w weithredu (os nad yw wedi'i nodi yn yr enw)
  • llwybr — llwybrau i chwilio am y ffeil gweithredadwy
  • unigif - os yw'r gorchymyn a nodir yn y paramedr hwn wedi'i gwblhau gyda chod dychwelyd sero, bydd y prif orchymyn yn cael ei weithredu
  • oni bai - os yw'r gorchymyn a nodir yn y paramedr hwn wedi'i gwblhau â chod dychwelyd nad yw'n sero, bydd y prif orchymyn yn cael ei weithredu
  • yn creu — os nad yw'r ffeil a nodir yn y paramedr hwn yn bodoli, gweithredir y prif orchymyn
  • adfywiol - os true, yna dim ond pan fydd y gweithredydd hwn yn derbyn hysbysiad gan adnoddau eraill y bydd y gorchymyn yn cael ei redeg
  • cwd - cyfeiriadur i redeg y gorchymyn ohono
  • defnyddiwr - y defnyddiwr i redeg y gorchymyn ganddo
  • darparwr - sut i redeg y gorchymyn:
    • posix - proses plentyn yn cael ei greu yn syml, gofalwch eich bod yn nodi llwybr
    • cragen - mae'r gorchymyn yn cael ei lansio yn y gragen /bin/sh, efallai na chaiff ei nodi llwybr, gallwch ddefnyddio globio, pibellau a nodweddion cregyn eraill. Fel arfer canfyddir yn awtomatig os oes unrhyw nodau arbennig (|, ;, &&, || ac ati).

cron

Yn rheoli cronjobs.

Paramedrau:

  • enw adnodd - dim ond rhyw fath o ddynodwr
  • sicrhau - cyflwr swydd y goron:
    • present - creu os nad yw'n bodoli
    • absent - dileu os yw'n bodoli
  • gorchymyn — pa orchymyn i'w redeg
  • amgylchedd — ym mha amgylchedd i redeg y gorchymyn (rhestr o newidynnau amgylchedd a'u gwerthoedd trwyddynt =)
  • defnyddiwr - gan ba ddefnyddiwr i redeg y gorchymyn
  • munud, awr, yn ystod yr wythnos, mis, mis — pryd i redeg cron. Os na nodir unrhyw un o'r priodoleddau hyn, ei werth yn y crontab fydd *.

Mewn Pyped 6.0 cron fel petai tynnu o'r blwch mewn pypedserver, felly nid oes dogfennaeth ar y wefan gyffredinol. Ond efe sydd yn y blwch mewn pyped-asiant, felly nid oes angen ei osod ar wahân. Gallwch weld y ddogfennaeth ar ei gyfer yn y ddogfennaeth ar gyfer y pumed fersiwn o BypedNeu ar GitHub.

Am adnoddau yn gyffredinol

Gofynion ar gyfer unigrywiaeth adnoddau

Y camgymeriad mwyaf cyffredin rydyn ni'n dod ar ei draws yw Datganiad dyblyg. Mae'r gwall hwn yn digwydd pan fydd dau neu fwy o adnoddau o'r un math gyda'r un enw yn ymddangos yn y cyfeiriadur.

Felly, ysgrifennaf eto: ni ddylai maniffestau ar gyfer yr un nod gynnwys adnoddau o'r un math gyda'r un teitl!

Weithiau mae angen gosod pecynnau gyda'r un enw, ond gyda gwahanol reolwyr pecynnau. Yn yr achos hwn, mae angen i chi ddefnyddio'r paramedr namei osgoi'r gwall:

package { 'ruby-mysql':
  ensure   => installed,
  name     => 'mysql',
  provider => 'gem',
}
package { 'python-mysql':
  ensure   => installed,
  name     => 'mysql',
  provider => 'pip',
}

Mae gan fathau eraill o adnoddau opsiynau tebyg i helpu i osgoi dyblygu − name у gwasanaeth, command у exec, ac yn y blaen.

Metaparamedrau

Mae gan bob math o adnodd rai paramedrau arbennig, waeth beth fo'u natur.

Rhestr lawn o baramedrau meta yn y ddogfennaeth Pypedau.

Rhestr fer:

  • ei gwneud yn ofynnol — mae'r paramedr hwn yn nodi pa adnoddau y mae'r adnodd hwn yn dibynnu arnynt.
  • cyn - Mae'r paramedr hwn yn nodi pa adnoddau sy'n dibynnu ar yr adnodd hwn.
  • tanysgrifio — mae'r paramedr hwn yn nodi o ba adnoddau y mae'r adnodd hwn yn derbyn hysbysiadau.
  • hysbysu — Mae'r paramedr hwn yn nodi pa adnoddau sy'n derbyn hysbysiadau o'r adnodd hwn.

Mae pob un o'r metaparamedrau rhestredig yn derbyn naill ai dolen adnodd sengl neu amrywiaeth o ddolenni mewn cromfachau sgwâr.

Dolenni i adnoddau

Dim ond sôn am yr adnodd yw dolen adnodd. Fe'u defnyddir yn bennaf i nodi dibyniaethau. Bydd cyfeirio at adnodd nad yw'n bodoli yn achosi gwall llunio.

Mae cystrawen y ddolen fel a ganlyn: math o adnodd gyda phrif lythyren (os yw enw'r math yn cynnwys colonau dwbl, yna priflythrennau yw pob rhan o'r enw rhwng y colonau), yna enw'r adnodd mewn cromfachau sgwâr (sef achos yr enw ddim yn newid!). Ni ddylai fod bylchau; ysgrifennir cromfachau sgwâr yn syth ar ôl enw'r teip.

Enghraifft:

file { '/file1': ensure => present }
file { '/file2':
  ensure => directory,
  before => File['/file1'],
}
file { '/file3': ensure => absent }
File['/file1'] -> File['/file3']

Dibyniaethau a hysbysiadau

Dogfennaeth yma.

Fel y nodwyd yn gynharach, mae dibyniaethau syml rhwng adnoddau yn drosiannol. Gyda llaw, byddwch yn ofalus wrth ychwanegu dibyniaethau - gallwch greu dibyniaethau cylchol, a fydd yn achosi gwall llunio.

Yn wahanol i ddibyniaethau, nid yw hysbysiadau yn drosiannol. Mae'r rheolau canlynol yn berthnasol ar gyfer hysbysiadau:

  • Os bydd yr adnodd yn derbyn hysbysiad, caiff ei ddiweddaru. Mae'r camau diweddaru yn dibynnu ar y math o adnodd − exec yn rhedeg y gorchymyn, gwasanaeth yn ailgychwyn y gwasanaeth, pecyn yn ailosod y pecyn. Os nad oes gan yr adnodd weithred diweddaru wedi'i diffinio, yna nid oes dim yn digwydd.
  • Yn ystod un rhediad o Bypedau, ni chaiff yr adnodd ei ddiweddaru fwy nag unwaith. Mae hyn yn bosibl oherwydd bod hysbysiadau yn cynnwys dibyniaethau ac nid yw'r graff dibyniaeth yn cynnwys cylchoedd.
  • Os bydd Puppet yn newid cyflwr adnodd, mae'r adnodd yn anfon hysbysiadau i'r holl adnoddau sy'n tanysgrifio iddo.
  • Os yw adnodd yn cael ei ddiweddaru, mae'n anfon hysbysiadau i'r holl adnoddau sydd wedi tanysgrifio iddo.

Trin paramedrau amhenodol

Fel rheol, os nad oes gan rai paramedr adnoddau werth diofyn ac nad yw'r paramedr hwn wedi'i nodi yn y maniffest, yna ni fydd Pyped yn newid yr eiddo hwn ar gyfer yr adnodd cyfatebol ar y nod. Er enghraifft, os yw adnodd o fath file paramedr heb ei nodi owner, yna ni fydd Puppet yn newid perchennog y ffeil cyfatebol.

Cyflwyniad i ddosbarthiadau, newidynnau a diffiniadau

Tybiwch fod gennym nifer o nodau sydd â'r un rhan o'r ffurfweddiad, ond mae gwahaniaethau hefyd - fel arall gallem ddisgrifio'r cyfan mewn un bloc node {}. Wrth gwrs, gallwch chi gopïo rhannau union yr un fath o'r cyfluniad, ond yn gyffredinol mae hwn yn ddatrysiad gwael - mae'r cyfluniad yn tyfu, ac os byddwch chi'n newid rhan gyffredinol y cyfluniad, bydd yn rhaid i chi olygu'r un peth mewn sawl man. Ar yr un pryd, mae'n hawdd gwneud camgymeriad, ac yn gyffredinol, dyfeisiwyd yr egwyddor SYCH (peidiwch ag ailadrodd eich hun) am reswm.

I ddatrys y broblem hon mae dyluniad o'r fath dosbarth.

Dosbarthiadau

Dosbarth yn floc a enwir o god poppet. Mae angen dosbarthiadau i ailddefnyddio cod.

Yn gyntaf mae angen disgrifio'r dosbarth. Nid yw'r disgrifiad ei hun yn ychwanegu unrhyw adnoddau yn unman. Disgrifir y dosbarth mewn maniffestau:

# Описание класса начинается с ключевого слова class и его названия.
# Дальше идёт тело класса в фигурных скобках.
class example_class {
    ...
}

Ar ôl hyn gellir defnyddio'r dosbarth:

# первый вариант использования — в стиле ресурса с типом class
class { 'example_class': }
# второй вариант использования — с помощью функции include
include example_class
# про отличие этих двух вариантов будет рассказано дальше

Enghraifft o'r dasg flaenorol - gadewch i ni symud gosodiad a ffurfwedd nginx i mewn i ddosbarth:

class nginx_example {
    package { 'nginx':
        ensure => installed,
    }
    -> file { '/etc/nginx':
        ensure => directory,
        source => 'puppet:///modules/example/nginx-conf',
        recure => true,
        purge  => true,
        force  => true,
    }
    ~> service { 'nginx':
        ensure => running,
        enable => true,
    }
}

node 'server2.testdomain' {
    include nginx_example
}

Newidynnau

Nid yw'r dosbarth o'r enghraifft flaenorol yn hyblyg o gwbl oherwydd ei fod bob amser yn dod â'r un ffurfwedd nginx. Gadewch i ni wneud y llwybr i'r newidyn cyfluniad, yna gellir defnyddio'r dosbarth hwn i osod nginx gydag unrhyw ffurfweddiad.

Gellir ei wneud defnyddio newidynnau.

Sylw: mae newidynnau mewn Pyped yn ddigyfnewid!

Yn ogystal, dim ond ar ôl iddo gael ei ddatgan y gellir cyrchu newidyn, fel arall bydd gwerth y newidyn undef.

Enghraifft o weithio gyda newidynnau:

# создание переменных
$variable = 'value'
$var2 = 1
$var3 = true
$var4 = undef
# использование переменных
$var5 = $var6
file { '/tmp/text': content => $variable }
# интерполяция переменных — раскрытие значения переменных в строках. Работает только в двойных кавычках!
$var6 = "Variable with name variable has value ${variable}"

Mae gan byped gofodau enwau, a'r newidynnau, yn unol â hynny, wedi maes gwelededd: Gellir diffinio newidyn gyda'r un enw mewn gofodau enwau gwahanol. Wrth ddatrys gwerth newidyn, chwilir y newidyn yn y gofod enw cyfredol, yna yn y gofod enw amgáu, ac ati.

Enghreifftiau gofod enw:

  • global - mae newidynnau y tu allan i’r disgrifiad dosbarth neu nod yn mynd yno;
  • gofod enw nodau yn y disgrifiad nod;
  • gofod enw dosbarth yn nisgrifiad y dosbarth.

Er mwyn osgoi amwysedd wrth gyrchu newidyn, gallwch chi nodi'r gofod enw yn enw'r newidyn:

# переменная без пространства имён
$var
# переменная в глобальном пространстве имён
$::var
# переменная в пространстве имён класса
$classname::var
$::classname::var

Gadewch i ni gytuno bod y llwybr i'r cyfluniad nginx yn gorwedd yn y newidyn $nginx_conf_source. Yna bydd y dosbarth yn edrych fel hyn:

class nginx_example {
    package { 'nginx':
        ensure => installed,
    }
    -> file { '/etc/nginx':
        ensure => directory,
        source => $nginx_conf_source,   # здесь используем переменную вместо фиксированной строки
        recure => true,
        purge  => true,
        force  => true,
    }
    ~> service { 'nginx':
        ensure => running,
        enable => true,
    }
}

node 'server2.testdomain' {
    $nginx_conf_source = 'puppet:///modules/example/nginx-conf'
    include nginx_example
}

Fodd bynnag, mae'r enghraifft a roddir yn ddrwg oherwydd bod rhywfaint o “wybodaeth gyfrinachol” bod newidyn ag enw o'r fath yn cael ei ddefnyddio rhywle y tu mewn i'r dosbarth. Mae'n llawer mwy cywir gwneud y wybodaeth hon yn gyffredinol - gall dosbarthiadau gael paramedrau.

Paramedrau dosbarth yn newidynnau yn y gofod enw dosbarth, maent wedi'u nodi ym mhennyn y dosbarth a gellir eu defnyddio fel newidynnau rheolaidd yng nghorff y dosbarth. Pennir gwerthoedd paramedr wrth ddefnyddio'r dosbarth yn y maniffest.

Gellir gosod y paramedr i werth diofyn. Os nad oes gan baramedr werth rhagosodedig ac nad yw'r gwerth wedi'i osod pan gaiff ei ddefnyddio, bydd yn achosi gwall llunio.

Gadewch i ni baramedroli'r dosbarth o'r enghraifft uchod ac ychwanegu dau baramedr: y cyntaf, sy'n ofynnol, yw'r llwybr i'r ffurfweddiad, a'r ail, dewisol, yw enw'r pecyn gyda nginx (yn Debian, er enghraifft, mae pecynnau nginx, nginx-light, nginx-full).

# переменные описываются сразу после имени класса в круглых скобках
class nginx_example (
  $conf_source,
  $package_name = 'nginx-light', # параметр со значением по умолчанию
) {
  package { $package_name:
    ensure => installed,
  }
  -> file { '/etc/nginx':
    ensure  => directory,
    source  => $conf_source,
    recurse => true,
    purge   => true,
    force   => true,
  }
  ~> service { 'nginx':
    ensure => running,
    enable => true,
  }
}

node 'server2.testdomain' {
  # если мы хотим задать параметры класса, функция include не подойдёт* — нужно использовать resource-style declaration
  # *на самом деле подойдёт, но про это расскажу в следующей серии. Ключевое слово "Hiera".
  class { 'nginx_example':
    conf_source => 'puppet:///modules/example/nginx-conf',   # задаём параметры класса точно так же, как параметры для других ресурсов
  }
}

Mewn Pyped, mae newidynnau'n cael eu teipio. Bwyta llawer o fathau o ddata. Yn nodweddiadol, defnyddir mathau o ddata i ddilysu gwerthoedd paramedr a drosglwyddir i ddosbarthiadau a diffiniadau. Os nad yw'r paramedr a basiwyd yn cyfateb i'r math penodedig, bydd gwall llunio yn digwydd.

Ysgrifennir y math yn union cyn enw'r paramedr:

class example (
  String $param1,
  Integer $param2,
  Array $param3,
  Hash $param4,
  Hash[String, String] $param5,
) {
  ...
}

Dosbarthiadau: cynnwys enw dosbarth yn erbyn dosbarth{'classname':}

Mae pob dosbarth yn adnodd o fath dosbarth. Fel gydag unrhyw fath arall o adnodd, ni all fod dau enghraifft o'r un dosbarth ar yr un nod.

Os ceisiwch ychwanegu dosbarth at yr un nod ddwywaith gan ddefnyddio class { 'classname':} (dim gwahaniaeth, gyda pharamedrau gwahanol neu union yr un fath), bydd gwall llunio. Ond os ydych chi'n defnyddio dosbarth yn yr arddull adnoddau, gallwch chi osod ei holl baramedrau yn y maniffest ar unwaith.

Fodd bynnag, os ydych yn defnyddio include, yna gellir ychwanegu'r dosbarth gymaint o weithiau ag y dymunir. Y ffaith yw bod include yn swyddogaeth analluog sy'n gwirio a yw dosbarth wedi'i ychwanegu at y cyfeiriadur. Os nad yw'r dosbarth yn y cyfeiriadur, mae'n ei ychwanegu, ac os yw'n bodoli eisoes, nid yw'n gwneud dim. Ond rhag ofn defnyddio include Ni allwch osod paramedrau dosbarth yn ystod datganiad dosbarth - rhaid gosod yr holl baramedrau gofynnol mewn ffynhonnell ddata allanol - Hiera neu ENC. Byddwn yn siarad amdanynt yn yr erthygl nesaf.

Yn diffinio

Fel y dywedwyd yn y bloc blaenorol, ni all yr un dosbarth fod yn bresennol ar nod fwy nag unwaith. Fodd bynnag, mewn rhai achosion mae angen i chi allu defnyddio'r un bloc o god gyda pharamedrau gwahanol ar yr un nod. Mewn geiriau eraill, mae angen ei fath o adnodd ei hun.

Er enghraifft, er mwyn gosod y modiwl PHP, rydym yn gwneud y canlynol yn Avito:

  1. Gosodwch y pecyn gyda'r modiwl hwn.
  2. Gadewch i ni greu ffeil ffurfweddu ar gyfer y modiwl hwn.
  3. Rydyn ni'n creu cyswllt syml i'r ffurfwedd ar gyfer php-fpm.
  4. Rydyn ni'n creu cyswllt syml i'r ffurfwedd ar gyfer php cli.

Mewn achosion o'r fath, mae dyluniad fel diffinio (diffinio, math diffiniedig, math o adnodd diffiniedig). A Mae Diffiniad yn debyg i ddosbarth, ond mae gwahaniaethau: yn gyntaf, mae pob Diffiniad yn fath o adnodd, nid yn adnodd; yn ail, mae gan bob diffiniad baramedr ymhlyg $title, i ble mae enw'r adnodd yn mynd pan gaiff ei ddatgan. Yn union fel yn achos dosbarthiadau, rhaid disgrifio diffiniad yn gyntaf, ac ar ôl hynny gellir ei ddefnyddio.

Enghraifft symlach gyda modiwl ar gyfer PHP:

define php74::module (
  $php_module_name = $title,
  $php_package_name = "php7.4-${title}",
  $version = 'installed',
  $priority = '20',
  $data = "extension=${title}.son",
  $php_module_path = '/etc/php/7.4/mods-available',
) {
  package { $php_package_name:
    ensure          => $version,
    install_options => ['-o', 'DPkg::NoTriggers=true'],  # триггеры дебиановских php-пакетов сами создают симлинки и перезапускают сервис php-fpm - нам это не нужно, так как и симлинками, и сервисом мы управляем с помощью Puppet
  }
  -> file { "${php_module_path}/${php_module_name}.ini":
    ensure  => $ensure,
    content => $data,
  }
  file { "/etc/php/7.4/cli/conf.d/${priority}-${php_module_name}.ini":
    ensure  => link,
    target  => "${php_module_path}/${php_module_name}.ini",
  }
  file { "/etc/php/7.4/fpm/conf.d/${priority}-${php_module_name}.ini":
    ensure  => link,
    target  => "${php_module_path}/${php_module_name}.ini",
  }
}

node server3.testdomain {
  php74::module { 'sqlite3': }
  php74::module { 'amqp': php_package_name => 'php-amqp' }
  php74::module { 'msgpack': priority => '10' }
}

Y ffordd hawsaf i ddal y gwall datganiad Dyblyg yw Diffiniwch. Mae hyn yn digwydd os oes gan ddiffiniad adnodd ag enw cyson arno, a bod dau neu fwy o achosion o'r diffiniad hwn ar ryw nod.

Mae'n hawdd amddiffyn eich hun rhag hyn: rhaid i'r holl adnoddau y tu mewn i'r diffiniad fod ag enw yn dibynnu ar $title. Dewis arall yw ychwanegu adnoddau yn ddiamwys; yn yr achos symlaf, mae'n ddigon symud yr adnoddau sy'n gyffredin i bob achos o'r diffiniad i ddosbarth ar wahân a chynnwys y dosbarth hwn yn y diffiniad - swyddogaeth include analluog.

Mae ffyrdd eraill o gyflawni analluedd wrth ychwanegu adnoddau, sef defnyddio swyddogaethau defined и ensure_resources, ond dywedaf wrthych am y peth yn y bennod nesaf.

Dibyniaethau a hysbysiadau ar gyfer dosbarthiadau a diffiniadau

Mae dosbarthiadau a diffiniadau yn ychwanegu'r rheolau canlynol at drin dibyniaethau a hysbysiadau:

  • mae dibyniaeth ar ddosbarth/diffiniad yn ychwanegu dibyniaeth ar holl adnoddau'r dosbarth/diffiniad;
  • mae dibyniaeth dosbarth/diffiniad yn ychwanegu dibyniaethau at yr holl adnoddau dosbarth/diffiniad;
  • hysbysiad dosbarth/diffiniad yn hysbysu'r holl adnoddau o'r dosbarth/diffiniad;
  • tanysgrifiad dosbarth/diffiniad yn tanysgrifio i holl adnoddau'r dosbarth/diffiniad.

Datganiadau amodol a detholwyr

Dogfennaeth yma.

if

Mae'n syml yma:

if ВЫРАЖЕНИЕ1 {
  ...
} elsif ВЫРАЖЕНИЕ2 {
  ...
} else {
  ...
}

oni bai

oni bai ei fod yn wrthdroad: gweithredir y bloc o god os yw'r mynegiad yn ffug.

unless ВЫРАЖЕНИЕ {
  ...
}

achos

Does dim byd cymhleth yma chwaith. Gallwch ddefnyddio gwerthoedd rheolaidd (llinynnau, rhifau, ac ati), ymadroddion rheolaidd, a mathau o ddata fel gwerthoedd.

case ВЫРАЖЕНИЕ {
  ЗНАЧЕНИЕ1: { ... }
  ЗНАЧЕНИЕ2, ЗНАЧЕНИЕ3: { ... }
  default: { ... }
}

Detholwyr

Mae dewisydd yn lluniad iaith tebyg i case, ond yn lle gweithredu bloc o god, mae'n dychwelyd gwerth.

$var = $othervar ? { 'val1' => 1, 'val2' => 2, default => 3 }

Modiwlau

Pan fo'r cyfluniad yn fach, gellir ei gadw'n hawdd mewn un maniffest. Ond po fwyaf o gyfluniadau rydyn ni'n eu disgrifio, y mwyaf o ddosbarthiadau a nodau sydd yn y maniffest, mae'n tyfu, ac mae'n dod yn anghyfleus i weithio gyda nhw.

Yn ogystal, mae problem ailddefnyddio cod - pan fydd yr holl god mewn un maniffest, mae'n anodd rhannu'r cod hwn ag eraill. I ddatrys y ddwy broblem hyn, mae gan Puppet endid o'r enw modiwlau.

Modiwlau - mae'r rhain yn setiau o ddosbarthiadau, diffiniadau ac endidau Pypedau eraill wedi'u gosod mewn cyfeiriadur ar wahân. Mewn geiriau eraill, mae modiwl yn ddarn annibynnol o resymeg Pypedau. Er enghraifft, efallai y bydd modiwl ar gyfer gweithio gyda nginx, a bydd yn cynnwys yr hyn a dim ond yr hyn sydd ei angen i weithio gyda nginx, neu efallai y bydd modiwl ar gyfer gweithio gyda PHP, ac ati.

Caiff modiwlau eu fersiynau, a chefnogir dibyniaeth modiwlau ar ei gilydd hefyd. Mae ystorfa agored o fodiwlau - Efail Byped.

Ar y gweinydd pypedau, mae modiwlau wedi'u lleoli yn is-gyfeiriadur modiwlau'r cyfeiriadur gwraidd. Y tu mewn i bob modiwl mae cynllun cyfeiriadur safonol - maniffestau, ffeiliau, templedi, lib, ac ati.

Strwythur ffeil mewn modiwl

Gall gwraidd y modiwl gynnwys y cyfeiriaduron canlynol gydag enwau disgrifiadol:

  • manifests - mae'n cynnwys maniffestos
  • files - mae'n cynnwys ffeiliau
  • templates - mae'n cynnwys templedi
  • lib - mae'n cynnwys cod Ruby

Nid yw hon yn rhestr gyflawn o gyfeiriaduron a ffeiliau, ond mae'n ddigon ar gyfer yr erthygl hon am y tro.

Enwau adnoddau ac enwau ffeiliau yn y modiwl

Dogfennaeth yma.

Ni ellir enwi adnoddau (dosbarthiadau, diffiniadau) mewn modiwl beth bynnag y dymunwch. Yn ogystal, mae cyfatebiaeth uniongyrchol rhwng enw adnodd ac enw'r ffeil y bydd Pyped yn chwilio am ddisgrifiad o'r adnodd hwnnw ynddi. Os byddwch yn torri'r rheolau enwi, yna ni fydd Puppet yn dod o hyd i'r disgrifiad o'r adnodd, a byddwch yn cael gwall llunio.

Mae'r rheolau yn syml:

  • Rhaid i holl adnoddau modiwl fod yng ngofod enw'r modiwl. Os gelwir y modiwl foo, yna dylid enwi pob adnodd ynddo foo::<anything>, neu dim ond foo.
  • Rhaid i'r adnodd gydag enw'r modiwl fod yn y ffeil init.pp.
  • Ar gyfer adnoddau eraill, mae'r cynllun enwi ffeiliau fel a ganlyn:
    • mae'r rhagddodiad gydag enw'r modiwl yn cael ei daflu
    • gosodir slaes yn lle pob colon dwbl, os o gwbl
    • estyniad yn cael ei ychwanegu .pp

Byddaf yn arddangos gydag enghraifft. Gadewch i ni ddweud fy mod yn ysgrifennu modiwl nginx. Mae’n cynnwys yr adnoddau canlynol:

  • dosbarth nginx a ddisgrifir yn y maniffest init.pp;
  • dosbarth nginx::service a ddisgrifir yn y maniffest service.pp;
  • diffinio nginx::server a ddisgrifir yn y maniffest server.pp;
  • diffinio nginx::server::location a ddisgrifir yn y maniffest server/location.pp.

templedi

Siawns eich bod chi eich hun yn gwybod beth yw templedi; ni fyddaf yn eu disgrifio'n fanwl yma. Ond gadawaf hi rhag ofn dolen i Wicipedia.

Sut i ddefnyddio templedi: Gellir ehangu ystyr templed gan ddefnyddio ffwythiant template, sy'n cael ei basio y llwybr i'r templed. Am adnoddau o fath file ei ddefnyddio ynghyd â'r paramedr content. Er enghraifft, fel hyn:

file { '/tmp/example': content => template('modulename/templatename.erb')

Gweld llwybr <modulename>/<filename> yn awgrymu ffeil <rootdir>/modules/<modulename>/templates/<filename>.

Yn ogystal, mae swyddogaeth inline_template — mae'n derbyn testun y templed fel mewnbwn, nid enw'r ffeil.

O fewn templedi, gallwch ddefnyddio'r holl newidynnau Pypedau yn y cwmpas presennol.

Mae pyped yn cefnogi templedi mewn fformat ERB ac EPP:

Yn fyr am ERB

Strwythurau rheoli:

  • <%= ВЫРАЖЕНИЕ %> — mewnosoder gwerth y mynegiad
  • <% ВЫРАЖЕНИЕ %> — cyfrifwch werth mynegiad (heb ei fewnosod). Mae datganiadau amodol (os) a dolenni (pob un) fel arfer yn mynd yma.
  • <%# КОММЕНТАРИЙ %>

Mae mynegiadau mewn ERB wedi'u hysgrifennu yn Ruby (ERB yw Ruby Embedded mewn gwirionedd).

I gael mynediad at newidynnau o'r maniffest, mae angen ichi ychwanegu @ i'r enw newidyn. I gael gwared ar doriad llinell sy'n ymddangos ar ôl lluniad rheoli, mae angen i chi ddefnyddio tag cau -%>.

Enghraifft o ddefnyddio'r templed

Gadewch i ni ddweud fy mod yn ysgrifennu modiwl i reoli ZooKeeper. Mae'r dosbarth sy'n gyfrifol am greu'r ffurfwedd yn edrych rhywbeth fel hyn:

class zookeeper::configure (
  Array[String] $nodes,
  Integer $port_client,
  Integer $port_quorum,
  Integer $port_leader,
  Hash[String, Any] $properties,
  String $datadir,
) {
  file { '/etc/zookeeper/conf/zoo.cfg':
    ensure  => present,
    content => template('zookeeper/zoo.cfg.erb'),
  }
}

A'r templed cyfatebol zoo.cfg.erb - Felly:

<% if @nodes.length > 0 -%>
<% @nodes.each do |node, id| -%>
server.<%= id %>=<%= node %>:<%= @port_leader %>:<%= @port_quorum %>;<%= @port_client %>
<% end -%>
<% end -%>

dataDir=<%= @datadir %>

<% @properties.each do |k, v| -%>
<%= k %>=<%= v %>
<% end -%>

Ffeithiau a Newidynnau Adeiledig

Yn aml, mae rhan benodol y cyfluniad yn dibynnu ar yr hyn sy'n digwydd ar y nod ar hyn o bryd. Er enghraifft, yn dibynnu ar beth yw rhyddhau Debian, mae angen i chi osod un neu fersiwn arall o'r pecyn. Gallwch fonitro hyn i gyd â llaw, gan ailysgrifennu maniffestau os bydd nodau'n newid. Ond nid yw hwn yn ddull difrifol; mae awtomeiddio yn llawer gwell.

I gael gwybodaeth am nodau, mae gan Pyped fecanwaith o'r enw ffeithiau. Ffeithiau - dyma wybodaeth am y nod, sydd ar gael mewn maniffestau ar ffurf newidynnau cyffredin yn y gofod enwau byd-eang. Er enghraifft, enw gwesteiwr, fersiwn system weithredu, pensaernïaeth prosesydd, rhestr o ddefnyddwyr, rhestr o ryngwynebau rhwydwaith a'u cyfeiriadau, a llawer, llawer mwy. Mae ffeithiau ar gael mewn maniffestau a thempledi fel newidynnau rheolaidd.

Enghraifft o weithio gyda ffeithiau:

notify { "Running OS ${facts['os']['name']} version ${facts['os']['release']['full']}": }
# ресурс типа notify просто выводит сообщение в лог

Yn ffurfiol, mae gan ffaith enw (llinyn) a gwerth (mae mathau amrywiol ar gael: llinynnau, araeau, geiriaduron). Bwyta set o ffeithiau adeiledig. Gallwch hefyd ysgrifennu eich un eich hun. Disgrifir casglwyr ffeithiau fel swyddogaethau yn Rubynaill ai fel ffeiliau gweithredadwy. Gellir cyflwyno ffeithiau ar y ffurf hefyd ffeiliau testun gyda data ar y nodau.

Yn ystod y llawdriniaeth, mae'r asiant pypedau yn gyntaf yn copïo'r holl gasglwyr ffeithiau sydd ar gael o'r gweinydd pap i'r nod, ac ar ôl hynny mae'n eu lansio ac yn anfon y ffeithiau a gasglwyd i'r gweinydd; Ar ôl hyn, mae'r gweinydd yn dechrau llunio'r catalog.

Ffeithiau ar ffurf ffeiliau gweithredadwy

Rhoddir ffeithiau o'r fath mewn modiwlau yn y cyfeiriadur facts.d. Wrth gwrs, rhaid i'r ffeiliau fod yn weithredadwy. Wrth redeg, rhaid iddynt allbynnu gwybodaeth i allbwn safonol naill ai mewn fformat YAML neu allwedd = gwerth.

Peidiwch ag anghofio bod y ffeithiau'n berthnasol i bob nod sy'n cael ei reoli gan y gweinydd poppet y mae eich modiwl wedi'i ddefnyddio iddo. Felly, yn y sgript, gofalwch eich bod yn gwirio bod gan y system yr holl raglenni a ffeiliau sy'n angenrheidiol i'ch ffaith weithio.

#!/bin/sh
echo "testfact=success"
#!/bin/sh
echo '{"testyamlfact":"success"}'

Ffeithiau Ruby

Rhoddir ffeithiau o'r fath mewn modiwlau yn y cyfeiriadur lib/facter.

# всё начинается с вызова функции Facter.add с именем факта и блоком кода
Facter.add('ladvd') do
# в блоках confine описываются условия применимости факта — код внутри блока должен вернуть true, иначе значение факта не вычисляется и не возвращается
  confine do
    Facter::Core::Execution.which('ladvdc') # проверим, что в PATH есть такой исполняемый файл
  end
  confine do
    File.socket?('/var/run/ladvd.sock') # проверим, что есть такой UNIX-domain socket
  end
# в блоке setcode происходит собственно вычисление значения факта
  setcode do
    hash = {}
    if (out = Facter::Core::Execution.execute('ladvdc -b'))
      out.split.each do |l|
        line = l.split('=')
        next if line.length != 2
        name, value = line
        hash[name.strip.downcase.tr(' ', '_')] = value.strip.chomp(''').reverse.chomp(''').reverse
      end
    end
    hash  # значение последнего выражения в блоке setcode является значением факта
  end
end

Ffeithiau testun

Rhoddir ffeithiau o'r fath ar nodau yn y cyfeiriadur /etc/facter/facts.d mewn hen Byped neu /etc/puppetlabs/facts.d yn y Pyped newydd.

examplefact=examplevalue
---
examplefact2: examplevalue2
anotherfact: anothervalue

Cyrraedd y Ffeithiau

Mae dwy ffordd o fynd at y ffeithiau:

  • trwy'r geiriadur $facts: $facts['fqdn'];
  • defnyddio'r enw ffaith fel yr enw newidyn: $fqdn.

Mae'n well defnyddio geiriadur $facts, neu hyd yn oed yn well, nodwch y gofod enw byd-eang ($::facts).

Dyma'r adran berthnasol o'r ddogfennaeth.

Newidynnau adeiledig

Heblaw am y ffeithiau, mae yna hefyd rhai newidynnau, ar gael yn y gofod enwau byd-eang.

  • ffeithiau y gellir ymddiried ynddynt — newidynnau sy'n cael eu cymryd o dystysgrif y cleient (gan fod y dystysgrif fel arfer yn cael ei chyhoeddi ar weinydd poppet, ni all yr asiant gymryd a newid ei dystysgrif, felly mae'r newidynnau yn “ymddiried”): enw'r dystysgrif, gwesteiwr ac enw parth, estyniadau o'r dystysgrif.
  • ffeithiau gweinydd —newidynnau yn ymwneud â gwybodaeth am y gweinydd — fersiwn, enw, cyfeiriad IP gweinydd, amgylchedd.
  • ffeithiau asiant — newidynnau a ychwanegir yn uniongyrchol gan asiant-pypedau, ac nid trwy facter — enw tystysgrif, fersiwn asiant, fersiwn pypedau.
  • newidynnau meistr - Newidynnau Papetmaster (sic!). Mae tua'r un peth ag yn ffeithiau gweinydd, ynghyd â gwerthoedd paramedr cyfluniad ar gael.
  • newidynnau casglwr — newidynnau crynhoydd sy'n wahanol ym mhob cwmpas: enw'r modiwl cyfredol ac enw'r modiwl y cyrchwyd y gwrthrych cyfredol ynddo. Gellir eu defnyddio, er enghraifft, i wirio nad yw eich dosbarthiadau preifat yn cael eu defnyddio'n uniongyrchol o fodiwlau eraill.

Ychwanegiad 1: sut i redeg a dadfygio hyn i gyd?

Roedd yr erthygl yn cynnwys llawer o enghreifftiau o god pypedau, ond ni ddywedodd wrthym o gwbl sut i redeg y cod hwn. Wel, dwi'n cywiro fy hun.

Mae asiant yn ddigon i redeg Puppet, ond yn y rhan fwyaf o achosion bydd angen gweinydd arnoch chi hefyd.

Asiant

O leiaf ers fersiwn XNUMX, pecynnau asiant pypedau o ystorfa swyddogol Pypedlabs cynnwys yr holl ddibyniaethau (rhuddem a'r gemau cyfatebol), felly nid oes unrhyw anawsterau gosod (rwy'n siarad am ddosbarthiadau Debian - nid ydym yn defnyddio dosraniadau sy'n seiliedig ar RPM).

Yn yr achos symlaf, i ddefnyddio'r cyfluniad pyped, mae'n ddigon i lansio'r asiant yn y modd di-weinydd: ar yr amod bod y cod pyped yn cael ei gopïo i'r nod, lansio puppet apply <путь к манифесту>:

atikhonov@atikhonov ~/puppet-test $ cat helloworld.pp 
node default {
    notify { 'Hello world!': }
}
atikhonov@atikhonov ~/puppet-test $ puppet apply helloworld.pp 
Notice: Compiled catalog for atikhonov.localdomain in environment production in 0.01 seconds
Notice: Hello world!
Notice: /Stage[main]/Main/Node[default]/Notify[Hello world!]/message: defined 'message' as 'Hello world!'
Notice: Applied catalog in 0.01 seconds

Mae'n well, wrth gwrs, sefydlu'r gweinydd a rhedeg asiantau ar y nodau yn y modd daemon - yna unwaith bob hanner awr byddant yn cymhwyso'r cyfluniad a lawrlwythwyd o'r gweinydd.

Gallwch chi efelychu'r model gwaith gwthio - ewch i'r nod y mae gennych ddiddordeb ynddo a dechreuwch sudo puppet agent -t. Allwedd -t (--test) mewn gwirionedd yn cynnwys nifer o opsiynau y gellir eu galluogi yn unigol. Mae'r opsiynau hyn yn cynnwys y canlynol:

  • peidiwch â rhedeg yn y modd daemon (yn ddiofyn mae'r asiant yn dechrau yn y modd daemon);
  • cau i lawr ar ôl cymhwyso'r catalog (yn ddiofyn, bydd yr asiant yn parhau i weithio a chymhwyso'r cyfluniad unwaith bob hanner awr);
  • ysgrifennu log gwaith manwl;
  • dangos newidiadau mewn ffeiliau.

Mae gan yr asiant fodd gweithredu heb newidiadau - gallwch ei ddefnyddio pan nad ydych yn siŵr eich bod wedi ysgrifennu'r ffurfweddiad cywir ac eisiau gwirio beth yn union y bydd yr asiant yn ei newid yn ystod y llawdriniaeth. Mae'r modd hwn wedi'i alluogi gan y paramedr --noop ar y llinell orchymyn: sudo puppet agent -t --noop.

Yn ogystal, gallwch chi alluogi log dadfygio'r gwaith - ynddo, mae pyped yn ysgrifennu am yr holl gamau y mae'n eu cyflawni: am yr adnodd y mae'n ei brosesu ar hyn o bryd, am baramedrau'r adnodd hwn, pa raglenni y mae'n eu lansio. Wrth gwrs mae hwn yn baramedr --debug.

Gweinydd

Ni fyddaf yn ystyried gosodiad llawn y gweinydd pappet a defnyddio cod iddo yn yr erthygl hon; Ni fyddaf ond yn dweud bod allan o'r blwch fersiwn gwbl weithredol o'r gweinydd nad oes angen cyfluniad ychwanegol arno i weithio gyda nifer fach o nodau (dyweder, hyd at gant). Bydd angen tiwnio nifer fwy o nodau - yn ddiofyn, nid yw gweinydd pypedau yn lansio mwy na phedwar gweithiwr, er mwyn cael mwy o berfformiad mae angen i chi gynyddu eu nifer a pheidiwch ag anghofio cynyddu'r terfynau cof, fel arall bydd y gweinydd yn casglu sbwriel y rhan fwyaf o'r amser.

Defnyddio cod - os oes ei angen arnoch yn gyflym ac yn hawdd, yna edrychwch (ar r10k)[https://github.com/puppetlabs/r10k], ar gyfer gosodiadau bach dylai fod yn ddigon eithaf.

Atodiad 2: Canllawiau Codio

  1. Rhowch yr holl resymeg mewn dosbarthiadau a diffiniadau.
  2. Cadwch ddosbarthiadau a diffiniadau mewn modiwlau, nid mewn maniffestau sy'n disgrifio nodau.
  3. Defnyddiwch y ffeithiau.
  4. Peidiwch â gwneud ifs yn seiliedig ar enwau gwesteiwr.
  5. Mae croeso i chi ychwanegu paramedrau ar gyfer dosbarthiadau a diffiniadau - mae hyn yn well na rhesymeg ymhlyg sydd wedi'i chuddio yng nghorff y dosbarth/diffiniad.

Byddaf yn esbonio pam yr wyf yn argymell gwneud hyn yn yr erthygl nesaf.

Casgliad

Gadewch i ni orffen gyda'r cyflwyniad. Yn yr erthygl nesaf byddaf yn dweud wrthych am Hiera, ENC a PuppetDB.

Dim ond defnyddwyr cofrestredig all gymryd rhan yn yr arolwg. Mewngofnodios gwelwch yn dda.

Yn wir, mae llawer mwy o ddeunydd - gallaf ysgrifennu erthyglau ar y pynciau canlynol, pleidleisio ar yr hyn y byddai gennych ddiddordeb mewn darllen amdano:

  • 59,1%Lluniadau pyped uwch - rhywfaint o cachu lefel nesaf: dolenni, mapio ac ymadroddion lambda eraill, casglwyr adnoddau, adnoddau wedi'u hallforio a chyfathrebu rhyng-westeiwr trwy gyfrwng Pyped, tagiau, darparwyr, mathau data haniaethol.13
  • 31,8%“Gweinyddwr fy mam ydw i” neu sut y gwnaethon ni yn Avito ffrindiau â sawl gweinydd poppet o wahanol fersiynau, ac, mewn egwyddor, y rhan am weinyddu'r gweinydd poppet.7
  • 81,8%Sut rydym yn ysgrifennu cod pyped: offeryniaeth, dogfennaeth, profi, CI/CD.18

Pleidleisiodd 22 o ddefnyddwyr. Ymataliodd 9 o ddefnyddwyr.

Ffynhonnell: hab.com