Txotxongiloaren sarrera

Puppet konfigurazioa kudeatzeko sistema bat da. Ostalariak nahi den egoerara eramateko eta egoera hori mantentzeko erabiltzen da.

Bost urte baino gehiago daramatzat Puppet-ekin lanean. Testu hau, funtsean, dokumentazio ofizialeko puntu gakoen bilduma itzuli eta berrantolatu bat da, hasiberriei Puppet-en funtsa azkar ulertzeko aukera emango diena.

Txotxongiloaren sarrera

Oinarrizko informazioa

Puppet-en sistema eragilea bezero-zerbitzaria da, nahiz eta funtzionalitate mugatuarekin zerbitzaririk gabeko funtzionamendua onartzen duen.

Funtzionamendu pull-eredu bat erabiltzen da: lehenespenez, ordu erdian behin, bezeroak zerbitzariarekin harremanetan jartzen dira konfigurazio baterako eta aplikatzen dute. Ansiblerekin lan egin baduzu, beste push eredu bat erabiltzen dute: administratzaileak konfigurazioa aplikatzeko prozesua abiarazten du, bezeroek eurek ez dute ezer aplikatuko.

Sareko komunikazioan, bi norabideko TLS enkriptatzea erabiltzen da: zerbitzariak eta bezeroak gako pribatuak eta dagozkion ziurtagiriak dituzte. Normalean zerbitzariak bezeroentzako ziurtagiriak ematen ditu, baina printzipioz kanpoko CA bat erabiltzea posible da.

Manifestuen sarrera

Txotxongiloen terminologian txotxongilo zerbitzariari konektatu nodoak (nodoak). Nodoen konfigurazioa idazten da manifestuetan programazio-lengoaia berezi batean - Puppet DSL.

Puppet DSL hizkuntza deklaratiboa da. Nodoaren nahi den egoera deskribatzen du baliabide indibidualen adierazpenen moduan, adibidez:

  • Fitxategia existitzen da eta eduki zehatza du.
  • Paketea instalatuta dago.
  • Zerbitzua hasi da.

Baliabideak elkarren artean konektatu daitezke:

  • Mendekotasunak daude, baliabideak erabiltzen diren ordenan eragiten dute.
    Adibidez, "lehenik paketea instalatu, gero editatu konfigurazio fitxategia eta, ondoren, hasi zerbitzua".
  • Jakinarazpenak daude: baliabide bat aldatu bada, jakinarazpenak bidaltzen dizkie harpidetutako baliabideei.
    Adibidez, konfigurazio fitxategia aldatzen bada, automatikoki berrabia dezakezu zerbitzua.

Gainera, Puppet DSL-ak funtzioak eta aldagaiak ditu, baita baldintzapeko adierazpenak eta hautatzaileak ere. Hainbat txantiloi-mekanismo ere onartzen dira - EPP eta ERB.

Puppet Ruby-n idatzita dago, beraz, eraikuntza eta termino asko hortik atera dira. Ruby-k Puppet zabaltzeko aukera ematen dizu - gehi logika konplexua, baliabide mota berriak, funtzioak.

Puppet exekutatzen ari den bitartean, zerbitzariko nodo zehatz bakoitzaren manifestuak direktorio batean biltzen dira. Каталог Baliabideen eta haien erlazioen zerrenda bat da, funtzioen, aldagaien eta baldintzazko enuntziatuen hedapenaren balioa kalkulatu ondoren.

Sintaxia eta kode-estiloa

Hona hemen dokumentazio ofizialaren atalak, sintaxia ulertzen lagunduko dizuten adibideak nahikoak ez badira:

Hona hemen manifestuaren itxuraren adibide bat:

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

Koskak eta lerro-jauziak ez dira manifestuaren derrigorrezko zati bat, baina gomendagarria da estilo gida. Laburpen:

  • Bi espazioko koskak, tabulazioak ez dira erabiltzen.
  • Giltza kizkurrak zuriune batez bereizten dira; bi puntuak ez daude zuriunez bereizten.
  • Parametro bakoitzaren ondoren komak, azkena barne. Parametro bakoitza lerro bereizi batean dago. Parametrorik eta parametrorik gabeko kasurako salbuespena egiten da: lerro batean eta komarik gabe idatz dezakezu (hau da. resource { 'title': } и resource { 'title': param => value }).
  • Parametroetako geziek maila berean egon behar dute.
  • Baliabide-erlazio-geziak haien aurrean idazten dira.

Fitxategien kokapena pappetserver-n

Azalpen gehiagorako, "erro direktorioa" kontzeptua aurkeztuko dut. Erroko direktorioa nodo jakin baterako Puppet konfigurazioa duen direktorioa da.

Erro direktorioa aldatu egiten da Puppet-en bertsioaren eta erabiltzen diren inguruneen arabera. Inguruneak direktorio bereizietan gordetzen diren konfigurazio-multzo independenteak dira. Normalean git-ekin konbinatuta erabiltzen da, eta kasu horretan inguruneak git adarretatik sortzen dira. Horren arabera, nodo bakoitza ingurune batean edo bestean kokatzen da. Hau nodoan bertan konfigura daiteke, edo hurrengo artikuluan hitz egingo dudan ENCn.

  • Hirugarren bertsioan ("Txotxongilo zaharra") oinarrizko direktorioa zen /etc/puppet. Inguruneak erabiltzea hautazkoa da; adibidez, ez ditugu Txotxongilo zaharrarekin erabiltzen. Inguruneak erabiltzen badira, normalean bertan gordetzen dira /etc/puppet/environments, erroko direktorioa inguruneko direktorioa izango da. Inguruneak erabiltzen ez badira, erroko direktorioa izango da oinarrizko direktorioa.
  • Laugarren bertsiotik («Txotxongilo berria») hasita, inguruneen erabilera derrigorrezkoa bihurtu zen, eta oinarrizko direktorioa mugitu zen. /etc/puppetlabs/code. Horren arabera, inguruneak gordetzen dira /etc/puppetlabs/code/environments, root direktorioa ingurunearen direktorioa da.

Erroko direktorioan azpidirektorio bat egon behar da manifests, nodoak deskribatzen dituzten manifestu bat edo gehiago dituena. Horrez gain, azpidirektorio bat egon beharko litzateke modules, moduluak biltzen dituena. Moduluak zer diren pixka bat geroago esango dizut. Horrez gain, Puppet zaharrak azpidirektorio bat ere izan dezake files, nodoetan kopiatzen ditugun hainbat fitxategi biltzen dituena. Puppet berrian, fitxategi guztiak moduluetan jartzen dira.

Manifest fitxategiek luzapena dute .pp.

Borroka adibide pare bat

Nodoaren eta bertan dagoen baliabidearen deskribapena

Nodoan server1.testdomain fitxategi bat sortu behar da /etc/issue edukiarekin Debian GNU/Linux n l. Fitxategiak erabiltzaile eta talde baten jabetza izan behar du root, sarbide-eskubideak izan behar dira 644.

Manifestu bat idazten dugu:

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 в начале будет воспринято как записанное в восьмеричной системе, и всё пойдёт не так, как задумано
    }
}

Nodo bateko baliabideen arteko erlazioak

Nodoan server2.testdomain nginx exekutatzen egon behar du, aldez aurretik prestatutako konfigurazio batekin lanean.

Deskonposa dezagun problema:

  • Paketea instalatu behar da nginx.
  • Beharrezkoa da konfigurazio-fitxategiak zerbitzaritik kopiatzea.
  • Zerbitzuak martxan egon behar du nginx.
  • Konfigurazioa eguneratzen bada, zerbitzua berrabiarazi behar da.

Manifestu bat idazten dugu:

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 получает уведомление,
  # соответствующий сервис перезапускается.
}

Honek funtziona dezan, gutxi gorabehera, fitxategi-kokapen hau behar duzu txotxongilo zerbitzarian:

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

Baliabide motak

Onartutako baliabide moten zerrenda osoa hemen aurki daiteke dokumentazioan, hemen oinarrizko bost mota deskribatuko ditut, nire praktikan arazo gehienak konpontzeko nahikoak direnak.

file

Fitxategiak, direktorioak, estekak, haien edukiak eta sarbide-eskubideak kudeatzen ditu.

Aukerak:

  • baliabidearen izena - fitxategirako bidea (aukerakoa)
  • bidea — fitxategiaren bidea (izenean ez badago)
  • bermatzeko - Fitxategi mota:
    • absent - fitxategi bat ezabatu
    • present — edozein motatako fitxategi bat egon behar da (fitxategirik ez badago, fitxategi arrunt bat sortuko da)
    • file - fitxategi arrunta
    • directory - direktorioa
    • link - esteka sinbolikoa
  • edukia — fitxategiaren edukia (fitxategi arruntetarako bakarrik egokia, ezin da batera erabili iturri edo helburu)
  • iturri — fitxategiaren edukia kopiatu nahi duzun biderako esteka (ezin da batera erabili edukia edo helburu). Eskema batekin URI gisa zehaztu daiteke puppet: (gero txotxongilo zerbitzariko fitxategiak erabiliko dira), eta eskemarekin http: (kasu honetan zer gertatuko den argi egotea espero dut), eta baita diagramarekin ere file: edo eskemarik gabeko bide absolutu gisa (orduan nodoko FS lokaleko fitxategia erabiliko da)
  • helburu — Esteka sinbolikoak nora zuzendu behar duen (ezin da batera erabili edukia edo iturri)
  • jabea — fitxategiaren jabea izan beharko lukeen erabiltzailea
  • taldea — Fitxategia zein taldea izan behar duen
  • modua - fitxategien baimenak (kate gisa)
  • madarikatu - direktorio errekurtsiboa prozesatzeko aukera ematen du
  • purge - Puppet-en deskribatzen ez diren fitxategiak ezabatzeko aukera ematen du
  • behartzeko - Puppet-en deskribatzen ez diren direktorioak ezabatzeko aukera ematen du

pakete

Paketeak instalatu eta kentzen ditu. Jakinarazpenak kudeatzeko gai da - paketea berriro instalatzen du parametroa zehaztuta badago reinstall_on_fresh.

Aukerak:

  • baliabidearen izena - paketearen izena (aukerakoa)
  • izena - paketearen izena (izenean zehaztu ez bada)
  • -hornitzaileak — Erabili beharreko paketeen kudeatzailea
  • bermatzeko — paketearen nahi den egoera:
    • present, installed - instalatutako edozein bertsio
    • latest - instalatutako azken bertsioa
    • absent - ezabatu (apt-get remove)
    • purged - konfigurazio fitxategiekin batera ezabatu da (apt-get purge)
    • held - paketearen bertsioa blokeatuta dago (apt-mark hold)
    • любая другая строка — zehaztutako bertsioa instalatuta dago
  • reinstall_on_fresh - a bada true, orduan jakinarazpena jaso ondoren paketea berriro instalatuko da. Baliagarria iturburuan oinarritutako banaketetarako, non paketeak berreraikitzea beharrezkoa izan daitekeen eraikuntza-parametroak aldatzean. Lehenetsia false.

zerbitzua

Zerbitzuak kudeatzen ditu. Jakinarazpenak prozesatzeko gai da - zerbitzua berrabiarazten du.

Aukerak:

  • baliabidearen izena - Kudeatu beharreko zerbitzua (aukerakoa)
  • izena — kudeatu behar den zerbitzua (izenean zehazten ez bada)
  • bermatzeko — Zerbitzuaren nahi den egoera:
    • running - martxan jarri
    • stopped - gelditu zen
  • gaitu — Zerbitzua hasteko gaitasuna kontrolatzen du:
    • true — Autorun gaituta dago (systemctl enable)
    • mask - mozorrotuta (systemctl mask)
    • false — Autorun desgaituta dago (systemctl disable)
  • berrabiarazi - Zerbitzua berrabiarazteko komandoa
  • egoera — zerbitzuaren egoera egiaztatzeko komandoa
  • berrabiarazi du — adierazi zerbitzuaren initscript-ak berrabiaraztea onartzen duen ala ez. Bada false eta parametroa zehazten da berrabiarazi — parametro honen balioa erabiltzen da. Bada false eta parametroa berrabiarazi zehaztu gabe - zerbitzua gelditu eta berrabiarazten hasten da (baina systemd-ek komandoa erabiltzen du systemctl restart).
  • dauka egoera — adierazi zerbitzuaren initscript-ak komandoa onartzen duen ala ez status. bada false, orduan parametroaren balioa erabiltzen da egoera. Lehenetsia true.

exec

Kanpoko komandoak exekutatzen ditu. Parametroak zehazten ez badituzu sortzen, bada bakarrik, ezean edo freskoki, Puppet exekutatzen den bakoitzean komandoa exekutatuko da. Jakinarazpenak prozesatzeko gai - komando bat exekutatzen du.

Aukerak:

  • baliabidearen izena - Exekutatu beharreko komandoa (aukerakoa)
  • komandoa — exekutatuko den komandoa (izenean zehazten ez bada)
  • bidea — fitxategi exekutagarria bilatzeko bideak
  • bada bakarrik — Parametro honetan zehaztutako komandoa zero itzulera-kode batekin osatu bada, komando nagusia exekutatuko da
  • ezean — Parametro honetan zehaztutako komandoa zero ez den itzulera-kode batekin osatu bada, komando nagusia exekutatuko da
  • sortzen — Parametro honetan zehaztutako fitxategia existitzen ez bada, komando nagusia exekutatuko da
  • freskoki - a bada true, orduan komandoa exekutibo honek beste baliabide batzuen jakinarazpena jasotzen duenean bakarrik exekutatuko da
  • cwd — komandoa exekutatzeko direktorioa
  • erabiltzaile — komandoa exekutatu behar duen erabiltzailea
  • -hornitzaileak - komandoa nola exekutatu:
    • POSIX — haur prozesu bat besterik gabe sortzen da, ziurtatu zehaztu duzula bidea
    • shell - komandoa shell-ean abiarazten da /bin/sh, baliteke zehaztu gabe egotea bidea, globbing, tutuak eta beste shell ezaugarriak erabil ditzakezu. Normalean automatikoki detektatzen da karaktere berezirik badago (|, ;, &&, || etab).

cron

Cronjob-ak kontrolatzen ditu.

Aukerak:

  • baliabidearen izena - Identifikatzaile moduko bat besterik ez
  • bermatzeko - koroaren egoera:
    • present - sortu existitzen ez bada
    • absent - ezabatu badago
  • komandoa - zein komando exekutatu
  • ingurumena — komandoa zein ingurunetan exekutatu (inguruko aldagaien zerrenda eta haien balioen bidez =)
  • erabiltzaile — zein erabiltzailetik exekutatu komandoa
  • minutu, ordu, astegunean, hilabete, hilabetea — noiz exekutatu cron. Atributu hauetakoren bat zehazten ez bada, bere balioa crontab-en izango da *.

Puppet 6.0-n cron balitz bezala kutxatik kenduta puppetserver-en, beraz, ez dago dokumentaziorik gune orokorrean. Baina berak kutxan dago txotxongilo-agentean, beraz, ez dago bereizita instalatu beharrik. Horren dokumentazioa ikus dezakezu Puppet-en bosgarren bertsioaren dokumentazioanEdo GitHub-en.

Baliabideei buruz, oro har

Baliabideen berezitasunaren baldintzak

Topatzen dugun akats ohikoena da Adierazpen bikoiztua. Errore hau direktorioan izen bereko mota bereko bi baliabide edo gehiago agertzen direnean gertatzen da.

Horregatik, berriro idatziko dut: nodo bererako manifestuek ez lukete titulu berdineko mota bereko baliabideak eduki behar!

Batzuetan, izen bereko paketeak instalatu beharra dago, baina pakete-kudeatzaile ezberdinekin. Kasu honetan, parametroa erabili behar duzu nameakatsa saihesteko:

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

Beste baliabide mota batzuek antzeko aukerak dituzte bikoizketak saihesteko − name у zerbitzua, command у exec, eta abar.

Metaparametroak

Baliabide mota bakoitzak parametro berezi batzuk ditu, bere izaera edozein dela ere.

Meta-parametroen zerrenda osoa Txotxongiloaren dokumentazioan.

Zerrenda laburra:

  • behar — Parametro honek baliabide hori zein baliabideren mende dagoen adierazten du.
  • aurretik - Parametro honek baliabide horren menpe dauden baliabideak zehazten ditu.
  • harpidetu — Parametro honek baliabide honek jakinarazpenak zein baliabidetatik jasotzen dituen zehazten du.
  • jakinaraziko — Parametro honek baliabide honen jakinarazpenak zein baliabide jasotzen dituen zehazten du.

Zerrendatutako metaparametro guztiek baliabideen esteka bakarra edo kortxete artean dauden esteka sorta onartzen dute.

Baliabideetarako estekak

Baliabideen esteka baliabidearen aipamena besterik ez da. Batez ere mendekotasunak adierazteko erabiltzen dira. Ez dagoen baliabide bati erreferentzia egiteak konpilazio-errore bat eragingo du.

Estekaren sintaxia honako hau da: baliabide mota letra larriz (motaren izenak bi puntu bikoitzak baditu, bi puntuen arteko izenaren zati bakoitza letra larriz idatzita dago), orduan baliabidearen izena kortxete artean (izenaren kasua ez da aldatzen!). Ez da zuriunerik egon behar; kortxeteak idazten dira motaren izenaren ondoren.

Adibidea:

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

Mendekotasunak eta jakinarazpenak

Dokumentazioa hemen.

Lehen esan bezala, baliabideen arteko menpekotasun sinpleak iragankorrak dira. Bide batez, kontuz mendekotasunak gehitzean - mendekotasun ziklikoak sor ditzakezu, eta horrek konpilazio-errore bat eragingo du.

Mendekotasunak ez bezala, jakinarazpenak ez dira iragankorrak. Jakinarazpenetarako arau hauek aplikatzen dira:

  • Baliabideak jakinarazpen bat jasotzen badu, eguneratu egiten da. Eguneratze ekintzak baliabide motaren araberakoak dira - exec komandoa exekutatzen du, zerbitzua zerbitzua berrabiarazten du, pakete paketea berriro instalatzen du. Baliabideak ez badu eguneratze ekintzarik definitu, ez da ezer gertatzen.
  • Puppet-en exekuzio batean, baliabidea behin baino gehiagotan eguneratzen da. Hau posible da jakinarazpenek mendekotasunak barne hartzen dituztelako eta mendekotasun grafikoak ez dituelako ziklorik.
  • Puppet-ek baliabide baten egoera aldatzen badu, baliabideak jakinarazpenak bidaltzen dizkie harpidetutako baliabide guztiei.
  • Baliabide bat eguneratzen bada, harpidetutako baliabide guztiei jakinarazpenak bidaltzen dizkie.

Zehaztu gabeko parametroak maneiatzea

Orokorrean, baliabide-parametroren batek balio lehenetsirik ez badu eta parametro hau manifestuan zehazten ez bada, Puppet-ek ez du propietate hau aldatuko nodoan dagokion baliabidearentzat. Adibidez, motako baliabidea bada file parametroa zehaztu gabe owner, orduan Puppet-ek ez du dagokion fitxategiaren jabea aldatuko.

Klaseen, aldagaien eta definizioen sarrera

Demagun konfigurazioaren zati bera duten hainbat nodo ditugula, baina ezberdintasunak ere badaudela; bestela, bloke bakarrean deskriba genezake. node {}. Jakina, konfigurazioaren zati berdinak kopiatu ditzakezu, baina, oro har, irtenbide txarra da - konfigurazioa hazten da, eta konfigurazioaren zati orokorra aldatzen baduzu, gauza bera editatu beharko duzu leku askotan. Aldi berean, erraza da akats bat egitea, eta, oro har, DRY (ez errepikatu) printzipioa arrazoi batengatik asmatu zen.

Arazo hau konpontzeko diseinu bat dago class.

klaseak

Class poppet kodearen bloke izendatua da. Klaseak behar dira kodea berrerabiltzeko.

Lehenik eta behin klasea deskribatu behar da. Deskribapenak berak ez du baliabiderik gehitzen inon. Klasea manifestuetan deskribatzen da:

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

Honen ondoren klasea erabil daiteke:

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

Aurreko zereginaren adibide bat - mugi ditzagun nginx-en instalazioa eta konfigurazioa klase batera:

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
}

aldagai

Aurreko adibideko klasea ez da batere malgua, beti nginx konfigurazio bera ekartzen duelako. Egin dezagun konfigurazio aldagaiaren bidea, gero klase hau nginx edozein konfiguraziorekin instalatzeko erabil daiteke.

Egin daiteke aldagaiak erabiliz.

Kontuz: Puppet-en aldagaiak aldaezinak dira!

Horrez gain, aldagai bat deklaratu ondoren bakarrik sar daiteke, bestela aldagaiaren balioa izango da undef.

Aldagaiekin lan egiteko adibidea:

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

Txotxongiloak ditu izen-espazioak, eta aldagaiek, horren arabera, dute ikusgarritasun eremua: Izen bereko aldagai bat izen-espazio ezberdinetan defini daiteke. Aldagai baten balioa ebaztean, aldagaia uneko izen-espazioan bilatzen da, gero inguratutako izen-espazioan, eta abar.

Izen-espazioen adibideak:

  • global - klase edo nodoaren deskribapenetik kanpoko aldagaiak hor doaz;
  • nodoaren izen-espazioa nodoaren deskribapenean;
  • klasearen izen-espazioa klasearen deskribapenean.

Aldagai batean sartzean anbiguotasuna saihesteko, aldagaiaren izenean izen-espazioa zehaztu dezakezu:

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

Onar dezagun nginx konfiguraziorako bidea aldagaian dagoela $nginx_conf_source. Ondoren, klasea honela izango da:

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
}

Hala ere, emandako adibidea txarra da, klasearen barruan nonbait halako eta halako izena duen aldagai bat erabiltzen den “ezagutza sekretu” bat dagoelako. Askoz zuzenagoa da ezagutza hori orokortzea -klaseek parametroak izan ditzakete.

Klase-parametroak klasearen izen-eremuko aldagaiak dira, klasearen goiburuan zehazten dira eta klasearen gorputzeko aldagai arrunt gisa erabil daitezke. Parametroen balioak manifestuan klasea erabiltzean zehazten dira.

Parametroa balio lehenetsi batean ezar daiteke. Parametro batek balio lehenetsirik ez badu eta erabiltzen denean balioa ezartzen ez bada, konpilazio-errore bat eragingo du.

Parametriza dezagun goiko adibideko klasea eta gehitu bi parametro: lehenengoa, beharrezkoa, konfiguraziorako bidea da, eta bigarrena, aukerakoa, nginx-ekin duen paketearen izena (Debian-en, adibidez, paketeak daude. 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',   # задаём параметры класса точно так же, как параметры для других ресурсов
  }
}

Puppet-en, aldagaiak idazten dira. Jan datu mota asko. Datu motak normalean klaseei eta definizioei emandako parametroen balioak balioztatzeko erabiltzen dira. Igorritako parametroa zehaztutako motarekin bat ez badator, konpilazio-errore bat gertatuko da.

Mota parametroaren izenaren aurretik berehala idazten da:

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

Klaseak: sartu klase izena vs klasea{'classname':}

Klase bakoitza motako baliabide bat da klase. Beste edozein baliabide-mota bezala, ezin dira nodo berean klase bereko bi instantzia egon.

Nodo berean klase bat gehitzen saiatzen bazara bi aldiz erabiliz class { 'classname':} (ez dago alderik, parametro ezberdin edo berdinekin), konpilazio-errore bat egongo da. Baina baliabideen estiloan klase bat erabiltzen baduzu, berehala ezar ditzakezu bere parametro guztiak manifestuan.

Hala ere, erabiltzen baduzu include, orduan klasea nahi adina aldiz gehi daiteke. Kontua da include direktorioari klase bat gehitu den egiaztatzen duen funtzio idempotentea da. Klasea direktorioan ez badago, gehitzen du, eta dagoeneko existitzen bada, ez du ezer egiten. Baina erabiliz gero include Ezin dituzu klase-parametroak ezarri klase-adierazpenean - beharrezko parametro guztiak kanpoko datu-iturburu batean ezarri behar dira - Hiera edo ENC. Hurrengo artikuluan haiei buruz hitz egingo dugu.

Definitzen du

Aurreko blokean esan bezala, klase bera ezin da egon nodo batean behin baino gehiagotan. Hala ere, zenbait kasutan kode-bloke berdina parametro desberdinekin erabili ahal izan behar duzu nodo berean. Beste era batera esanda, baliabide mota propio baten beharra dago.

Adibidez, PHP modulua instalatzeko, hau egiten dugu Avito-n:

  1. Instalatu paketea modulu honekin.
  2. Sortu dezagun modulu honen konfigurazio fitxategi bat.
  3. php-fpm-ren konfiguraziorako esteka sinbolikoa sortzen dugu.
  4. php cli-rako konfiguraziorako esteka sinbolikoa sortzen dugu.

Horrelakoetan, esaterako, diseinu bat definitu (definitu, definitu mota, definitu baliabide mota). Define bat klase baten antzekoa da, baina badira aldeak: lehenik, Define bakoitza baliabide mota bat da, ez baliabide bat; bigarrenik, definizio bakoitzak parametro inplizitu bat du $title, non baliabidearen izena doa deklaratzen denean. Klaseen kasuan bezala, lehenik definizio bat deskribatu behar da, ondoren erabili ahal izateko.

Adibide sinplifikatu bat PHPrako modulu batekin:

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' }
}

Bikoiztutako deklarazio-errorea atzemateko modurik errazena Definizioan dago. Hau gertatzen da definizio batek izen konstantea duen baliabide bat badu, eta definizio horren bi instantzia edo gehiago badaude nodoren batean.

Erraza da honetatik babestea: definizioaren barruan dauden baliabide guztiek izen bat izan behar dute horren arabera $title. Alternatiba bat baliabideen gehikuntza idempotentea da; kasurik errazenean, nahikoa da definizioaren instantzia guztien baliabide komunak klase bereiz batera eramatea eta klase hau definizio - funtzioan sartzea. include idempotente.

Baliabideak gehitzean idempotentzia lortzeko beste modu batzuk daude, funtzioak erabiliz, alegia defined и ensure_resources, baina hurrengo atalean kontatuko dizuet.

Klaseen eta definizioen menpekotasunak eta jakinarazpenak

Klaseek eta definizioek arau hauek gehitzen dituzte mendekotasunak eta jakinarazpenak kudeatzeko:

  • klase/definizio baten menpekotasuna klase/definizioko baliabide guztien menpekotasunak gehitzen ditu;
  • klase/definitutako mendekotasun batek klase/definizio baliabide guztiei menpekotasunak gehitzen dizkie;
  • class/define jakinarazpena klase/definizio baliabide guztiei jakinarazten die;
  • class/define harpidetza klase/definizioko baliabide guztietara harpidetzen da.

Baldintzazko adierazpenak eta hautatzaileak

Dokumentazioa hemen.

if

Hemen erraza da:

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

ezean

alderantziz bada ezean: kodearen blokea exekutatu egingo da adierazpena faltsua bada.

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

Kasu

Hemen ere ez dago ezer konplikaturik. Balio erregularrak (kateak, zenbakiak, etab.), adierazpen erregularrak eta datu motak erabil ditzakezu balio gisa.

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

Hautatzaileak

Hautatzailea hizkuntzaren antzeko eraikuntza bat da case, baina kode bloke bat exekutatu beharrean, balio bat itzultzen du.

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

Moduluak

Konfigurazioa txikia denean, erraz gorde daiteke manifestu batean. Baina zenbat eta konfigurazio gehiago deskribatu, orduan eta klase eta nodo gehiago egongo dira manifestuan, hazi egiten da eta lan egitea deseroso bihurtzen da.

Horrez gain, kodea berrerabiltzearen arazoa dago: kode guztia manifestu batean dagoenean, zaila da kode hau besteekin partekatzea. Bi arazo hauek konpontzeko, Puppet-ek moduluak izeneko entitate bat du.

Moduluak - Klase, definizio eta Puppet beste direktorio batean kokatutako beste entitate multzoak dira. Beste era batera esanda, modulu bat Puppet logikaren pieza independente bat da. Esaterako, nginx-ekin lan egiteko modulu bat egon daiteke, eta nginx-ekin lan egiteko behar dena zer eta soilik edukiko du, edo PHPrekin lan egiteko modulu bat egon daiteke eta abar.

Moduluak bertsionatu egiten dira, eta moduluen elkarren menpekotasunak ere onartzen dira. Moduluen biltegi irekia dago - Txotxongilo Forja.

Txotxongilo zerbitzarian, moduluak erro direktorioko moduluen azpidirektorioan daude. Modulu bakoitzaren barruan direktorio-eskema estandar bat dago: manifestuak, fitxategiak, txantiloiak, lib, eta abar.

Fitxategien egitura modulu batean

Moduluaren erroak izen deskribatzaileak dituzten direktorio hauek izan ditzake:

  • manifests - manifestuak ditu
  • files - fitxategiak ditu
  • templates - txantiloiak ditu
  • lib — Ruby kodea dauka

Hau ez da direktorioen eta fitxategien zerrenda osoa, baina nahikoa da artikulu honetarako oraingoz.

Moduluko baliabideen izenak eta fitxategien izenak

Dokumentazioa hemen.

Modulu bateko baliabideak (klaseak, definizioak) ezin dira nahi duzun bezala izendatu. Horrez gain, korrespondentzia zuzena dago baliabide baten izenaren eta Puppet-ek baliabide horren deskribapena bilatuko duen fitxategiaren izenaren artean. Izen-arauak urratzen badituzu, Puppet-ek ez du baliabidearen deskribapena aurkituko, eta konpilazio-errore bat jasoko duzu.

Arauak sinpleak dira:

  • Modulu bateko baliabide guztiek moduluaren izen-espazioan egon behar dute. Moduluari deitzen bazaio foo, orduan bertan dauden baliabide guztiak izendatu behar dira foo::<anything>, edo besterik gabe foo.
  • Moduluaren izena duen baliabideak fitxategian egon behar du init.pp.
  • Beste baliabide batzuetarako, fitxategiak izendatzeko eskema hau da:
    • moduluaren izena duen aurrizkia baztertu egiten da
    • bi puntu bikoitz guztiak, hala badagokio, barrarekin ordezkatzen dira
    • luzapena gehitzen da .pp

Adibide batekin erakutsiko dut. Demagun modulu bat idazten ari naizela nginx. Baliabide hauek ditu:

  • class nginx manifestuan azaldutakoa init.pp;
  • class nginx::service manifestuan azaldutakoa service.pp;
  • definitu nginx::server manifestuan azaldutakoa server.pp;
  • definitu nginx::server::location manifestuan azaldutakoa server/location.pp.

txantiloiak

Seguru zuk zeuk badakizu zer diren txantiloiak; ez ditut hemen zehatz-mehatz deskribatuko. Baina badaezpada utziko dut Wikipediarako esteka.

Txantiloiak nola erabili: txantiloi baten esanahia zabal daiteke funtzio baten bidez template, txantiloiaren bidea pasatzen dena. Mota baliabideetarako file parametroarekin batera erabiltzen da content. Adibidez, honela:

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

Ikusi bidea <modulename>/<filename> fitxategia dakar <rootdir>/modules/<modulename>/templates/<filename>.

Horrez gain, funtzio bat dago inline_template — Txantiloiaren testua sarrera gisa jasotzen du, ez fitxategiaren izena.

Txantiloien barruan, Puppet aldagai guztiak erabil ditzakezu uneko esparruan.

Puppet-ek ERB eta EPP formatuan txantiloiak onartzen ditu:

ERBri buruz laburki

Kontrol-egiturak:

  • <%= ВЫРАЖЕНИЕ %> — txertatu adierazpenaren balioa
  • <% ВЫРАЖЕНИЕ %> — kalkulatu adierazpen baten balioa (txertatu gabe). Baldintzazko adierazpenak (if) eta begiztak (bakoitza) normalean hona joaten dira.
  • <%# КОММЕНТАРИЙ %>

ERB-ko esamoldeak Ruby-n idazten dira (ERB benetan Embedded Ruby da).

Manifestutik aldagaietara sartzeko, gehitu behar duzu @ aldagaiaren izenari. Kontrol-eraikuntza baten ondoren agertzen den lerro-jauzi bat kentzeko, ixteko etiketa bat erabili behar duzu -%>.

Txantiloia erabiltzeko adibidea

Demagun ZooKeeper kontrolatzeko modulu bat idazten ari naizela. Konfigurazioa sortzeaz arduratzen den klaseak honelako itxura du:

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'),
  }
}

Eta dagokion txantiloia zoo.cfg.erb - Beraz:

<% 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 -%>

Gertaerak eta aldagai barneratuak

Askotan, konfigurazioaren zati zehatza nodoan unean gertatzen ari denaren araberakoa da. Adibidez, Debian bertsioaren arabera, paketearen bertsio bat edo beste instalatu behar duzu. Hori guztia eskuz kontrola dezakezu, nodoak aldatzen badira manifestuak berridatziz. Baina hau ez da ikuspegi serioa; automatizazioa askoz hobea da.

Nodoei buruzko informazioa lortzeko, Puppet-ek gertakariak izeneko mekanismoa du. facts - hau nodoari buruzko informazioa da, izen-espazio globaleko aldagai arrunten moduan manifestuetan eskuragarri. Adibidez, ostalariaren izena, sistema eragilearen bertsioa, prozesadorearen arkitektura, erabiltzaileen zerrenda, sareko interfazeen zerrenda eta haien helbideak, eta askoz, askoz gehiago. Gertaerak manifestuetan eta txantiloietan eskuragarri daude aldagai arrunt gisa.

Gertakariekin lan egiteko adibide bat:

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

Formalki hitz eginez, egitate batek izena (katea) eta balio bat ditu (hainbat mota daude eskuragarri: kateak, matrizeak, hiztegiak). Jan integratutako egitateen multzoa. Zurea ere idatzi dezakezu. Datu-biltzaileak deskribatzen dira Ruby-n funtzioak bezala, edo biak fitxategi exekutagarriak. Gertaerak formularioan ere aurkez daitezke datuekin testu fitxategiak nodoetan.

Funtzionamenduan, txotxongilo-agenteak lehenik pappetzerbitzaritik nodora kopiatzen ditu datu-biltzaile eskuragarri guztiak, ondoren abiarazi eta bildutako gertaerak zerbitzarira bidaltzen ditu; Horren ondoren, zerbitzaria katalogoa osatzen hasten da.

Fitxategi exekutagarrien formako gertaerak

Horrelako gertaerak direktorioko moduluetan jartzen dira facts.d. Noski, fitxategiak exekutagarriak izan behar dira. Exekutatzen direnean, informazioa irteera estandarrera atera behar dute YAML edo gako=balio formatuan.

Ez ahaztu gertaerak zure modulua inplementatzen duen poppet zerbitzariak kontrolatzen dituen nodo guztiei aplikatzen zaiela. Hori dela eta, gidoian, zaindu sistemak zure gertakariak funtziona dezan beharrezkoak diren programa eta fitxategi guztiak dituela egiaztatzea.

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

Ruby gertaerak

Horrelako gertaerak direktorioko moduluetan jartzen dira 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

Testuaren gertaerak

Horrelako gertaerak direktorioko nodoetan jartzen dira /etc/facter/facts.d Txotxongilo zaharrean edo /etc/puppetlabs/facts.d Txotxongilo berrian.

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

Gertaeretara iristea

Gertaeretara hurbiltzeko bi modu daude:

  • hiztegiaren bitartez $facts: $facts['fqdn'];
  • egitatearen izena aldagai izen gisa erabiliz: $fqdn.

Hobe da hiztegia erabiltzea $facts, edo are hobeto, adierazi izen-espazio globala ($::facts).

Hona hemen dokumentazioaren dagokion atala.

Aldagai barneratuak

Gertakariez gain, badago ere aldagai batzuk, izen-espazio orokorrean eskuragarri.

  • egitate fidagarriak — bezeroaren ziurtagiritik hartzen diren aldagaiak (normalean ziurtagiria poppet zerbitzari batean jaulkitzen denez, agenteak ezin du bere ziurtagiria hartu eta aldatu, beraz, aldagaiak “fidagarriak” dira): ziurtagiriaren izena, ostalari eta domeinua, ziurtagiriaren luzapenak.
  • zerbitzariaren gertaerak —zerbitzariari buruzko informazioari lotutako aldagaiak—bertsioa, izena, zerbitzariaren IP helbidea, ingurunea.
  • agente gertaerak — txotxongilo-agenteak zuzenean gehitutako aldagaiak, eta ez faktoreak — ziurtagiriaren izena, agentearen bertsioa, txotxongiloaren bertsioa.
  • aldagai nagusiak - Pappetmaster aldagaiak (sic!). Inguruko berdina da zerbitzariaren gertaerak, gehi konfigurazio-parametroen balioak eskuragarri daude.
  • konpiladorearen aldagaiak — esparru bakoitzean desberdinak diren konpiladore-aldagaiak: uneko moduluaren izena eta uneko objektura sartu den moduluaren izena. Erabili daitezke, adibidez, zure klase partikularrak beste moduluetatik zuzenean erabiltzen ez ote diren egiaztatzeko.

1. gehigarria: nola exekutatu eta arazteko hau guztia?

Artikuluak txotxongilo-kodearen adibide asko zituen, baina ez zigun batere esaten kode hau nola exekutatu. Tira, neure burua zuzentzen ari naiz.

Agente bat nahikoa da Puppet exekutatzeko, baina kasu gehienetan zerbitzari bat ere beharko duzu.

agentea

Gutxienez XNUMX. bertsiotik, txotxongilo-agente paketeak Puppetlabs biltegi ofiziala mendekotasun guztiak ditu (ruby eta dagozkion harribitxiak), beraz, ez dago instalazio-zailtasunik (Debian oinarritutako banaketaz ari naiz - ez dugu RPM-n oinarritutako banaketarik erabiltzen).

Kasurik errazenean, txotxongiloen konfigurazioa erabiltzeko, nahikoa da agentea zerbitzaririk gabeko moduan abiarazteko: baldin eta txotxongiloaren kodea nodoan kopiatzen bada, abiarazi 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

Hobe da, noski, zerbitzaria konfiguratzea eta nodoetan agenteak exekutatu deabru moduan; orduan, ordu erdian behin zerbitzaritik deskargatutako konfigurazioa aplikatuko dute.

Lanaren push eredua imitatu dezakezu: joan interesatzen zaizun nodora eta hasi sudo puppet agent -t. Gakoa -t (--test) benetan banaka gaitu daitezkeen hainbat aukera biltzen ditu. Aukera hauek honako hauek dira:

  • ez exekutatu daemon moduan (lehenespenez agentea daemon moduan abiarazten da);
  • katalogoa aplikatu ondoren itzali (lehenespenez, agenteak lanean jarraituko du eta konfigurazioa ordu erdian behin aplikatuko du);
  • laneko erregistro zehatza idatzi;
  • fitxategietan aldaketak erakutsi.

Agenteak aldaketarik gabeko funtzionamendu-modua du - konfigurazio zuzena idatzi duzula ziur ez zaudenean erabil dezakezu eta agenteak zer aldatuko duen egiaztatu nahi baduzu. Modu hau parametroak gaituta dago --noop komando lerroan: sudo puppet agent -t --noop.

Horrez gain, lanaren arazketa-erregistroa gaitu dezakezu; bertan, txotxongiloak egiten dituen ekintza guztiei buruz idazten du: prozesatzen ari den baliabideari buruz, baliabide honen parametroei buruz, abiarazten dituen programari buruz. Jakina, hau parametro bat da --debug.

zerbitzaria

Ez dut artikulu honetan pappetserver-aren konfigurazio osoa eta kodea hedatzea kontuan hartuko; Kutxatik kanpo zerbitzariaren bertsio guztiz funtzionala dagoela esango dut, konfigurazio gehigarririk behar ez duena, kopuru txiki batekin lan egiteko. nodoak (esan, ehun arte). Nodo kopuru handiagoak sintonizazioa eskatuko du; lehenespenez, puppetserver-ek lau langile baino gehiago abiarazten ditu, errendimendu handiagoa lortzeko haien kopurua handitu behar duzu eta ez ahaztu memoria-mugak handitzea, bestela zerbitzariak zaborra bilduko du gehienetan.

Kodearen hedapena - azkar eta erraz behar baduzu, begiratu (r10k)[https://github.com/puppetlabs/r10k], instalazio txikietarako nahikoa izan beharko luke.

2. eranskina: Kodeketa jarraibideak

  1. Jarri logika guztia klase eta definizioetan.
  2. Gorde klaseak eta definizioak moduluetan, ez nodoak deskribatzen dituzten manifestuetan.
  3. Erabili gertaerak.
  4. Ez egin ifs ostalari-izenetan oinarrituta.
  5. Anima zaitez klase eta definizioetarako parametroak gehitzeko - hau klase/definizio gorputzean ezkutatuta dagoen logika inplizitua baino hobea da.

Hurrengo artikuluan azalduko dut zergatik gomendatzen dudan hori egitea.

Ondorioa

Buka dezagun sarrerarekin. Hurrengo artikuluan Hiera, ENC eta PuppetDBren berri emango dizuet.

Erregistratutako erabiltzaileek soilik parte hartu dezakete inkestan. Hasi saioa, mesedez.

Izan ere, askoz ere material gehiago dago - gai hauei buruzko artikuluak idatz ditzaket, irakurtzea gustatuko litzaizukeenari buruz bozkatu:

  • 59,1%Txotxongiloen eraikuntza aurreratuak - hurrengo mailako kaka batzuk: begiztak, mapak eta bestelako lambda adierazpenak, baliabide-biltzaileak, esportatutako baliabideak eta ostalarien arteko komunikazioa Puppet bidez, etiketak, hornitzaileak, datu abstraktuak.13
  • 31,8%“Nire amaren administratzailea naiz” edo Avito-n nola lagun egin genituen bertsio ezberdinetako hainbat poppet zerbitzariekin, eta, printzipioz, poppet zerbitzaria administratzeari buruzko atala.7
  • 81,8%Txotxongilo kodea nola idazten dugun: tresneria, dokumentazioa, probak, CI/CD.18

22 erabiltzailek eman dute botoa. 9 erabiltzaile abstenitu ziren.

Iturria: www.habr.com