Utangulizi wa Puppet

Puppet ni mfumo wa usimamizi wa usanidi. Inatumika kuleta majeshi kwa hali inayotakiwa na kudumisha hali hii.

Nimekuwa nikifanya kazi na Puppet kwa zaidi ya miaka mitano sasa. Maandishi haya kimsingi ni mkusanyo uliotafsiriwa na kupangwa upya wa vidokezo muhimu kutoka kwa hati rasmi, ambayo itawaruhusu wanaoanza kuelewa haraka kiini cha Puppet.

Utangulizi wa Puppet

Maelezo ya msingi

Mfumo wa uendeshaji wa Puppet ni seva ya mteja, ingawa pia inasaidia utendakazi usio na seva na utendakazi mdogo.

Mfano wa kuvuta wa operesheni hutumiwa: kwa default, mara moja kila nusu saa, wateja huwasiliana na seva kwa usanidi na kuitumia. Ikiwa umefanya kazi na Ansible, basi hutumia mfano tofauti wa kushinikiza: msimamizi huanzisha mchakato wa kutumia usanidi, wateja wenyewe hawataomba chochote.

Wakati wa mawasiliano ya mtandao, usimbaji fiche wa TLS wa njia mbili hutumiwa: seva na mteja wana funguo zao za kibinafsi na vyeti vinavyolingana. Kwa kawaida seva hutoa vyeti kwa wateja, lakini kimsingi inawezekana kutumia CA ya nje.

Utangulizi wa manifesto

Katika istilahi za Puppet kwa seva ya bandia unganisha nodi (nodi). Configuration kwa nodes imeandikwa katika ilani katika lugha maalum ya programu - Puppet DSL.

Puppet DSL ni lugha ya kutangaza. Inaelezea hali inayotakiwa ya nodi katika mfumo wa matamko ya rasilimali za mtu binafsi, kwa mfano:

  • Faili ipo na ina maudhui maalum.
  • Kifurushi kimewekwa.
  • Huduma imeanza.

Rasilimali zinaweza kuunganishwa:

  • Kuna utegemezi, huathiri utaratibu ambao rasilimali hutumiwa.
    Kwa mfano, "kwanza sakinisha kifurushi, kisha uhariri faili ya usanidi, kisha uanze huduma."
  • Kuna arifa - ikiwa rasilimali imebadilika, hutuma arifa kwa rasilimali ulizojiandikisha.
    Kwa mfano, ikiwa faili ya usanidi inabadilika, unaweza kuanzisha upya huduma kiotomatiki.

Zaidi ya hayo, DSL ya Puppet ina kazi na vigezo, pamoja na kauli za masharti na wateuzi. Miundo mbalimbali ya violezo pia inatumika - EPP na ERB.

Puppet imeandikwa kwa Ruby, kwa hivyo miundo na istilahi nyingi zimechukuliwa kutoka hapo. Ruby inakuwezesha kupanua Puppet - kuongeza mantiki ngumu, aina mpya za rasilimali, kazi.

Wakati Puppet inaendeshwa, maonyesho ya kila nodi mahususi kwenye seva yanakusanywa katika saraka. Mbinu ni orodha ya rasilimali na uhusiano wao baada ya kuhesabu thamani ya kazi, vigezo na upanuzi wa taarifa za masharti.

Sintaksia na mtindo wa msimbo

Hapa kuna sehemu za hati rasmi ambazo zitakusaidia kuelewa sintaksia ikiwa mifano iliyotolewa haitoshi:

Huu hapa ni mfano wa jinsi faili ya maelezo inavyoonekana:

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

Ujongezaji na uvunjaji wa mstari si sehemu inayohitajika ya faili ya maelezo, lakini kuna mapendekezo mwongozo wa mtindo. Muhtasari:

  • Indenti za nafasi mbili, tabo hazitumiwi.
  • Braces zilizopinda hutenganishwa na nafasi; koloni hazitenganishwi na nafasi.
  • Koma baada ya kila parameta, pamoja na ya mwisho. Kila parameter iko kwenye mstari tofauti. Isipokuwa kwa kesi bila vigezo na parameta moja: unaweza kuandika kwenye mstari mmoja na bila comma (i.e. resource { 'title': } и resource { 'title': param => value }).
  • Mishale kwenye vigezo inapaswa kuwa katika kiwango sawa.
  • Mishale ya uhusiano wa rasilimali imeandikwa mbele yao.

Mahali pa faili kwenye pappetserver

Kwa maelezo zaidi, nitaanzisha dhana ya "saraka ya mizizi". Saraka ya mizizi ni saraka ambayo ina usanidi wa Puppet kwa nodi maalum.

Saraka ya mizizi inatofautiana kulingana na toleo la Puppet na mazingira yaliyotumiwa. Mazingira ni seti huru za usanidi ambazo zimehifadhiwa katika saraka tofauti. Kawaida hutumiwa pamoja na git, katika hali ambayo mazingira huundwa kutoka kwa matawi ya git. Ipasavyo, kila nodi iko katika mazingira moja au nyingine. Hii inaweza kusanidiwa kwenye node yenyewe, au katika ENC, ambayo nitazungumzia katika makala inayofuata.

  • Katika toleo la tatu ("Puppet ya zamani") saraka ya msingi ilikuwa /etc/puppet. Matumizi ya mazingira ni ya hiari - kwa mfano, hatutumii na Puppet ya zamani. Ikiwa mazingira yanatumiwa, kawaida huhifadhiwa ndani /etc/puppet/environments, saraka ya mizizi itakuwa saraka ya mazingira. Ikiwa mazingira hayatumiki, saraka ya mizizi itakuwa saraka ya msingi.
  • Kuanzia toleo la nne ("Kikaragosi kipya"), matumizi ya mazingira yakawa ya lazima, na saraka ya msingi ilihamishwa hadi /etc/puppetlabs/code. Ipasavyo, mazingira yanahifadhiwa ndani /etc/puppetlabs/code/environments, saraka ya mizizi ni saraka ya mazingira.

Lazima kuwe na saraka ndogo katika saraka ya mizizi manifests, ambayo ina onyesho moja au zaidi zinazoelezea nodi. Aidha, kuwe na subdirectory modules, ambayo ina moduli. Nitakuambia ni moduli gani baadaye kidogo. Kwa kuongeza, Puppet ya zamani inaweza pia kuwa na subdirectory files, ambayo ina faili mbalimbali ambazo tunakili kwenye nodi. Katika Puppet mpya, faili zote zimewekwa kwenye moduli.

Faili za maelezo zina kiendelezi .pp.

Mifano michache ya mapigano

Maelezo ya nodi na rasilimali juu yake

Kwenye nodi server1.testdomain faili lazima iundwe /etc/issue yenye maudhui Debian GNU/Linux n l. Faili lazima imilikiwe na mtumiaji na kikundi root, haki za ufikiaji lazima ziwe 644.

Tunaandika manifesto:

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

Uhusiano kati ya rasilimali kwenye nodi

Kwenye nodi server2.testdomain nginx lazima iwe inaendesha, inafanya kazi na usanidi uliotayarishwa hapo awali.

Wacha tujaribu kutatua shida:

  • Kifurushi kinahitaji kusakinishwa nginx.
  • Ni muhimu kwamba faili za usanidi zinakiliwa kutoka kwa seva.
  • Huduma inahitaji kuendeshwa nginx.
  • Ikiwa usanidi umesasishwa, huduma lazima ianzishwe tena.

Tunaandika manifesto:

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

Ili hii ifanye kazi, unahitaji takriban eneo lifuatalo la faili kwenye seva ya bandia:

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

Aina za Rasilimali

Orodha kamili ya aina za rasilimali zinazotumika zinaweza kupatikana hapa katika nyaraka, hapa nitaelezea aina tano za msingi, ambazo katika mazoezi yangu ni za kutosha kutatua matatizo mengi.

file

Hudhibiti faili, saraka, ulinganifu, yaliyomo na haki za ufikiaji.

Vigezo:

  • jina la rasilimali - njia ya faili (hiari)
  • njia - njia ya faili (ikiwa haijaainishwa kwa jina)
  • kuhakikisha - aina ya faili:
    • absent - kufuta faili
    • present - lazima kuwe na faili ya aina yoyote (ikiwa hakuna faili, faili ya kawaida itaundwa)
    • file - faili ya kawaida
    • directory - saraka
    • link - ulinganifu
  • yaliyomo - yaliyomo kwenye faili (yanafaa kwa faili za kawaida tu, haziwezi kutumika pamoja na chanzo au lengo)
  • chanzo - kiunga cha njia ambayo unataka kunakili yaliyomo kwenye faili (haiwezi kutumika pamoja na yaliyomo au lengo) Inaweza kubainishwa kama URI iliyo na mpango puppet: (basi faili kutoka kwa seva ya bandia zitatumika), na kwa mpango huo http: (Natumaini ni wazi nini kitatokea katika kesi hii), na hata kwa mchoro file: au kama njia kabisa bila schema (basi faili kutoka kwa FS ya ndani kwenye nodi itatumika)
  • lengo — ambapo ulinganifu unapaswa kuelekeza (hauwezi kutumika pamoja na yaliyomo au chanzo)
  • mmiliki - mtumiaji ambaye anapaswa kumiliki faili
  • kundi - kikundi ambacho faili inapaswa kuwa
  • mode - ruhusa za faili (kama kamba)
  • kurudisha - huwezesha uchakataji wa saraka unaorudiwa
  • asafishe - huwezesha kufuta faili ambazo hazijaelezewa kwenye Puppet
  • nguvu - huwezesha kufuta saraka ambazo hazijaelezewa kwenye Puppet

mfuko

Inasakinisha na kuondoa vifurushi. Inaweza kushughulikia arifa - inasakinisha tena kifurushi ikiwa kigezo kimebainishwa sakinisha_on_onyesha upya.

Vigezo:

  • jina la rasilimali - jina la kifurushi (hiari)
  • jina - jina la kifurushi (ikiwa halijaainishwa katika jina)
  • mtoa - meneja wa kifurushi cha kutumia
  • kuhakikisha - hali inayotakiwa ya kifurushi:
    • present, installed - toleo lolote limewekwa
    • latest - toleo la hivi karibuni limewekwa
    • absent - kufutwa (apt-get remove)
    • purged - imefutwa pamoja na faili za usanidi (apt-get purge)
    • held - toleo la kifurushi limefungwa (apt-mark hold)
    • любая другая строка - toleo maalum limewekwa
  • sakinisha_on_onyesha upya - ikiwa true, kisha baada ya kupokea arifa, kifurushi kitawekwa tena. Inatumika kwa usambazaji wa msingi, ambapo kuunda upya vifurushi kunaweza kuhitajika wakati wa kubadilisha vigezo vya ujenzi. Chaguomsingi false.

huduma

Inasimamia huduma. Inaweza kuchakata arifa - huanzisha upya huduma.

Vigezo:

  • jina la rasilimali - huduma itasimamiwa (hiari)
  • jina - huduma ambayo inahitaji kusimamiwa (ikiwa haijaainishwa katika jina)
  • kuhakikisha - hali inayotakiwa ya huduma:
    • running - ilizinduliwa
    • stopped - kusimamishwa
  • kuwawezesha - inadhibiti uwezo wa kuanzisha huduma:
    • true - autorun imewezeshwa (systemctl enable)
    • mask - kujificha (systemctl mask)
    • false - autorun imezimwa (systemctl disable)
  • fungua tena - amri ya kuanzisha upya huduma
  • hadhi — amri ya kuangalia hali ya huduma
  • imeanzisha upya — onyesha kama hati ya intscript ya huduma inasaidia kuanzisha upya. Kama false na parameter imeelezwa fungua tena - thamani ya parameter hii inatumiwa. Kama false na parameter fungua tena haijabainishwa - huduma imesimamishwa na kuanza kuanza tena (lakini systemd hutumia amri systemctl restart).
  • hali — onyesha kama hati ya huduma inaunga mkono amri status. Ikiwa false, basi thamani ya parameter inatumiwa hadhi. Chaguomsingi true.

kutekeleza

Huendesha amri za nje. Ikiwa hutaja vigezo inajenga, endapo tu, isipokuwa au kwa kuburudisha, amri itaendeshwa kila wakati Puppet inaendeshwa. Inaweza kuchakata arifa - inaendesha amri.

Vigezo:

  • jina la rasilimali - amri ya kutekelezwa (hiari)
  • amri - amri ya kutekelezwa (ikiwa haijaainishwa katika jina)
  • njia - njia za kutafuta faili inayoweza kutekelezwa
  • endapo tu - ikiwa amri iliyotajwa katika parameter hii imekamilika na msimbo wa kurudi sifuri, amri kuu itatekelezwa
  • isipokuwa - ikiwa amri iliyoainishwa katika parameta hii imekamilika na nambari isiyo ya sifuri ya kurudi, amri kuu itatekelezwa.
  • inajenga - ikiwa faili iliyoainishwa katika parameta hii haipo, amri kuu itatekelezwa
  • kwa kuburudisha - ikiwa true, basi amri itaendeshwa tu wakati exec hii inapokea arifa kutoka kwa rasilimali zingine
  • cwd - saraka ambayo amri itatumika
  • user - mtumiaji ambaye ataendesha amri
  • mtoa - jinsi ya kuendesha amri:
    • tamaa - mchakato wa mtoto umeundwa tu, hakikisha kutaja njia
    • shell - amri imezinduliwa kwenye ganda /bin/sh, inaweza isibainishwe njia, unaweza kutumia globbing, mabomba na vipengele vingine vya shell. Kawaida hugunduliwa kiatomati ikiwa kuna herufi maalum (|, ;, &&, || na kadhalika).

cron

Inadhibiti cronjobs.

Vigezo:

  • jina la rasilimali - aina fulani tu ya kitambulisho
  • kuhakikisha - hali ya taji:
    • present - tengeneza ikiwa haipo
    • absent - kufuta ikiwa ipo
  • amri - ni amri gani ya kukimbia
  • mazingira - katika mazingira gani ya kutekeleza amri (orodha ya anuwai ya mazingira na maadili yao kupitia =)
  • user - kutoka kwa mtumiaji gani wa kutekeleza amri
  • dakika, saa, wiki, mwezi, siku ya mwezi - wakati wa kukimbia cron. Ikiwa mojawapo ya sifa hizi haijabainishwa, thamani yake katika crontab itakuwa *.

Katika Puppet 6.0 cron kama kuondolewa kwenye sanduku katika puppetserver, kwa hivyo hakuna nyaraka kwenye tovuti ya jumla. Lakini yeye iko kwenye sanduku katika wakala wa bandia, kwa hivyo hakuna haja ya kuiweka kando. Unaweza kuona hati zake katika nyaraka za toleo la tano la PuppetAu kwenye GitHub.

Kuhusu rasilimali kwa ujumla

Mahitaji ya upekee wa rasilimali

Makosa ya kawaida tunayokutana nayo ni Rudufu tamko. Hitilafu hii hutokea wakati rasilimali mbili au zaidi za aina moja na jina moja zinaonekana kwenye saraka.

Kwa hivyo, nitaandika tena: inadhihirisha kwa nodi sawa haipaswi kuwa na rasilimali za aina sawa na kichwa sawa!

Wakati mwingine kuna haja ya kusakinisha vifurushi vyenye jina moja, lakini kwa wasimamizi tofauti wa vifurushi. Katika kesi hii, unahitaji kutumia parameter nameili kuepuka kosa:

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

Aina zingine za rasilimali zina chaguo sawa ili kusaidia kuzuia kurudia - name у huduma, command у kutekeleza, Nakadhalika.

Metaparameters

Kila aina ya rasilimali ina vigezo maalum, bila kujali asili yake.

Orodha kamili ya vigezo vya meta katika nyaraka za Puppet.

Orodha fupi:

  • zinahitaji — parameta hii inaonyesha ni rasilimali gani inategemea rasilimali hii.
  • kabla ya - Kigezo hiki kinabainisha ni rasilimali zipi zinategemea rasilimali hii.
  • kujiunga — kigezo hiki kinabainisha kutoka kwa rasilimali ambayo rasilimali hii inapokea arifa.
  • kutaarifu - Kigezo hiki kinabainisha ni rasilimali zipi zinazopokea arifa kutoka kwa nyenzo hii.

Metaparamita zote zilizoorodheshwa zinakubali kiungo kimoja cha nyenzo au safu ya viungo katika mabano ya mraba.

Viungo kwa rasilimali

Kiungo cha rasilimali ni kutaja tu rasilimali. Wao hutumiwa hasa kuonyesha utegemezi. Kurejelea rasilimali ambayo haipo kutasababisha hitilafu ya ujumuishaji.

Syntax ya kiunga ni kama ifuatavyo: aina ya rasilimali iliyo na herufi kubwa (ikiwa jina la aina lina koloni mbili, basi kila sehemu ya jina kati ya koloni ina herufi kubwa), kisha jina la rasilimali kwenye mabano ya mraba (kesi ya jina. haibadilika!). Haipaswi kuwa na nafasi; mabano ya mraba yameandikwa mara tu baada ya jina la aina.

Mfano:

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

Mategemeo na arifa

Nyaraka hapa.

Kama ilivyoelezwa hapo awali, utegemezi rahisi kati ya rasilimali ni wa mpito. Kwa njia, kuwa mwangalifu wakati wa kuongeza utegemezi - unaweza kuunda utegemezi wa mzunguko, ambayo itasababisha kosa la mkusanyiko.

Tofauti na vitegemezi, arifa si za mpito. Sheria zifuatazo zinatumika kwa arifa:

  • Ikiwa rasilimali itapokea arifa, inasasishwa. Vitendo vya kusasisha hutegemea aina ya rasilimali - kutekeleza anaendesha amri, huduma kuanzisha upya huduma, mfuko husakinisha tena kifurushi. Ikiwa rasilimali haina hatua ya sasisho iliyofafanuliwa, basi hakuna kinachotokea.
  • Wakati wa utekelezaji mmoja wa Puppet, rasilimali husasishwa si zaidi ya mara moja. Hili linawezekana kwa sababu arifa ni pamoja na vitegemezi na grafu tegemezi haina mizunguko.
  • Ikiwa Puppet itabadilisha hali ya rasilimali, rasilimali hutuma arifa kwa rasilimali zote zilizosajiliwa kwayo.
  • Rasilimali ikisasishwa, hutuma arifa kwa rasilimali zote ulizozisajili.

Kushughulikia vigezo ambavyo havijabainishwa

Kama sheria, ikiwa kigezo fulani cha rasilimali hakina thamani chaguo-msingi na kigezo hiki hakijabainishwa kwenye faili ya maelezo, basi Puppet haitabadilisha sifa hii kwa rasilimali inayolingana kwenye nodi. Kwa mfano, ikiwa ni rasilimali ya aina file parameta haijabainishwa owner, basi Puppet haitabadilisha mmiliki wa faili inayolingana.

Utangulizi wa madarasa, vigezo na ufafanuzi

Tuseme tuna nodi kadhaa ambazo zina sehemu sawa ya usanidi, lakini pia kuna tofauti - vinginevyo tunaweza kuelezea yote katika block moja. node {}. Kwa kweli, unaweza kunakili tu sehemu zinazofanana za usanidi, lakini kwa ujumla hii ni suluhisho mbaya - usanidi unakua, na ukibadilisha sehemu ya jumla ya usanidi, italazimika kuhariri kitu kimoja katika sehemu nyingi. Wakati huo huo, ni rahisi kufanya makosa, na kwa ujumla, kanuni ya KAVU (usijirudie) ilizuliwa kwa sababu.

Ili kutatua tatizo hili kuna kubuni kama vile tabaka la.

Madarasa

Hatari ni kizuizi kilichopewa jina la msimbo wa poppet. Madarasa yanahitajika ili kutumia tena msimbo.

Kwanza darasa linahitaji kuelezewa. Maelezo yenyewe hayaongezi rasilimali yoyote mahali popote. Darasa limeelezewa katika maonyesho:

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

Baada ya hayo, darasa linaweza kutumika:

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

Mfano kutoka kwa kazi iliyotangulia - wacha tuhamishe usakinishaji na usanidi wa nginx kwenye darasa:

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
}

Vighairi

Darasa kutoka kwa mfano uliopita halibadiliki hata kidogo kwa sababu daima huleta usanidi sawa wa nginx. Wacha tufanye njia ya utofauti wa usanidi, basi darasa hili linaweza kutumika kusakinisha nginx na usanidi wowote.

Inaweza kufanywa kwa kutumia vigezo.

Tahadhari: vigeu kwenye Puppet havibadiliki!

Kwa kuongeza, kutofautiana kunaweza kupatikana tu baada ya kutangazwa, vinginevyo thamani ya kutofautiana itakuwa undef.

Mfano wa kufanya kazi na anuwai:

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

Puppet ina nafasi za majina, na vigezo, ipasavyo, vina eneo la mwonekano: Tofauti yenye jina moja inaweza kufafanuliwa katika nafasi tofauti za majina. Wakati wa kutatua thamani ya kutofautiana, kutofautiana hutafutwa katika nafasi ya sasa ya jina, kisha katika nafasi ya jina iliyofungwa, na kadhalika.

Mifano ya nafasi ya majina:

  • kimataifa - vigezo nje ya darasa au maelezo ya nodi kwenda huko;
  • nafasi ya majina ya nodi katika maelezo ya nodi;
  • nafasi ya majina ya darasa katika maelezo ya darasa.

Ili kuzuia utata wakati wa kupata kutofautisha, unaweza kutaja nafasi ya majina katika jina la kutofautisha:

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

Wacha tukubaliane kuwa njia ya usanidi wa nginx iko kwenye kutofautisha $nginx_conf_source. Kisha darasa litaonekana kama hii:

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
}

Walakini, mfano uliopeanwa ni mbaya kwa sababu kuna "maarifa ya siri" ambayo mahali fulani ndani ya darasa kutofautisha na jina kama hilo hutumiwa. Ni sahihi zaidi kufanya maarifa haya kuwa ya jumla - madarasa yanaweza kuwa na vigezo.

Vigezo vya darasa ni vigeuzo katika nafasi ya majina ya darasa, vimeainishwa kwenye kichwa cha darasa na vinaweza kutumika kama vigeuzo vya kawaida kwenye mwili wa darasa. Thamani za kigezo hubainishwa wakati wa kutumia darasa kwenye faili ya maelezo.

Kigezo kinaweza kuwekwa kwa thamani chaguo-msingi. Ikiwa kigezo hakina thamani chaguo-msingi na thamani haijawekwa inapotumiwa, itasababisha hitilafu ya utungaji.

Wacha tuangalie darasa kutoka kwa mfano hapo juu na kuongeza vigezo viwili: ya kwanza, inahitajika, ni njia ya usanidi, na ya pili, hiari, ni jina la kifurushi na nginx (katika Debian, kwa mfano, kuna vifurushi. 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',   # задаём параметры класса точно так же, как параметры для других ресурсов
  }
}

Katika Puppet, vigezo vinapigwa. Kula aina nyingi za data. Aina za data kwa kawaida hutumiwa kuthibitisha thamani za vigezo vinavyopitishwa kwa madarasa na ufafanuzi. Ikiwa parameter iliyopitishwa hailingani na aina maalum, hitilafu ya mkusanyiko itatokea.

Aina imeandikwa mara moja kabla ya jina la parameta:

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

Madarasa: ni pamoja na jina la darasa dhidi ya darasa{'classname':}

Kila darasa ni rasilimali ya aina darasa. Kama ilivyo kwa aina nyingine yoyote ya rasilimali, hakuwezi kuwa na hali mbili za darasa moja kwenye nodi moja.

Ukijaribu kuongeza darasa kwenye nodi hiyo hiyo mara mbili kwa kutumia class { 'classname':} (hakuna tofauti, na vigezo tofauti au kufanana), kutakuwa na hitilafu ya mkusanyiko. Lakini ikiwa unatumia darasa katika mtindo wa rasilimali, unaweza kuweka mara moja vigezo vyake vyote kwenye faili ya maelezo.

Walakini, ikiwa unatumia include, basi darasa linaweza kuongezwa mara nyingi unavyotaka. Ukweli ni kwamba include ni chaguo la kukokotoa ambalo hukagua ikiwa darasa limeongezwa kwenye saraka. Ikiwa darasa halipo kwenye saraka, inaiongeza, na ikiwa tayari iko, haifanyi chochote. Lakini katika kesi ya kutumia include Huwezi kuweka vigezo vya darasa wakati wa tamko la darasa - vigezo vyote vinavyohitajika lazima ziwekwe katika chanzo cha nje cha data - Hiera au ENC. Tutazungumza juu yao katika makala inayofuata.

Inafafanua

Kama ilivyosemwa katika block iliyotangulia, darasa sawa haliwezi kuwa kwenye nodi zaidi ya mara moja. Walakini, katika hali zingine unahitaji kuwa na uwezo wa kutumia kizuizi sawa cha nambari na vigezo tofauti kwenye nodi sawa. Kwa maneno mengine, kuna haja ya aina yake ya rasilimali.

Kwa mfano, ili kusakinisha moduli ya PHP, tunafanya yafuatayo katika Avito:

  1. Sakinisha kifurushi na moduli hii.
  2. Hebu tuunde faili ya usanidi kwa moduli hii.
  3. Tunaunda ulinganifu kwa usanidi wa php-fpm.
  4. Tunaunda ulinganifu kwa usanidi wa php cli.

Katika hali hiyo, kubuni kama vile fafanua (fafanua, aina iliyobainishwa, aina ya rasilimali iliyobainishwa). A Define ni sawa na darasa, lakini kuna tofauti: kwanza, kila Fafanua ni aina ya rasilimali, sio rasilimali; pili, kila ufafanuzi una parameta isiyo wazi $title, ambapo jina la rasilimali huenda linapotangazwa. Kama ilivyo kwa madarasa, ufafanuzi lazima uelezewe kwanza, baada ya hapo unaweza kutumika.

Mfano uliorahisishwa na moduli ya 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' }
}

Njia rahisi zaidi ya kupata hitilafu ya tamko la Nakala ni katika Define. Hii hutokea ikiwa ufafanuzi una rasilimali yenye jina la mara kwa mara, na kuna matukio mawili au zaidi ya ufafanuzi huu kwenye nodi fulani.

Ni rahisi kujikinga na hili: rasilimali zote ndani ya ufafanuzi lazima ziwe na jina kulingana na $title. Njia mbadala ni nyongeza isiyo na maana ya rasilimali; kwa hali rahisi, inatosha kuhamisha rasilimali zinazofanana kwa hali zote za ufafanuzi katika darasa tofauti na kujumuisha darasa hili katika ufafanuzi - kazi. include asiye na uwezo.

Kuna njia zingine za kufikia ujinga wakati wa kuongeza rasilimali, ambayo ni kutumia kazi defined и ensure_resources, lakini nitakuambia juu yake katika sehemu inayofuata.

Vitegemezi na arifa za madarasa na ufafanuzi

Madarasa na ufafanuzi huongeza sheria zifuatazo katika kushughulikia utegemezi na arifa:

  • utegemezi wa darasa/fafanuzi unaongeza utegemezi kwa rasilimali zote za darasa/fafanua;
  • utegemezi wa darasa/fafanua unaongeza utegemezi kwa rasilimali zote za darasa/fafanua;
  • class/define notification inaarifu rasilimali zote za darasa/define;
  • usajili wa class/define hujiandikisha kwa nyenzo zote za darasa/fafanua.

Taarifa za masharti na wateuzi

Nyaraka hapa.

if

Ni rahisi hapa:

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

isipokuwa

isipokuwa ikiwa ni kinyume: kizuizi cha msimbo kitatekelezwa ikiwa usemi ni wa uwongo.

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

kesi

Hakuna kitu ngumu hapa pia. Unaweza kutumia thamani za kawaida (mifuatano, nambari, n.k.), misemo ya kawaida, na aina za data kama thamani.

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

Wateuzi

Kiteuzi ni muundo wa lugha unaofanana na case, lakini badala ya kutekeleza kizuizi cha nambari, inarudisha thamani.

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

Modules

Wakati usanidi ni mdogo, unaweza kuwekwa kwa urahisi katika faili moja ya maelezo. Lakini kadiri tunavyoelezea usanidi, kadiri darasa na nodi zinavyozidi katika faili ya maelezo, inakua, na inakuwa tabu kufanya kazi nayo.

Kwa kuongeza, kuna tatizo la kutumia tena msimbo - wakati msimbo wote uko kwenye faili moja ya maelezo, ni vigumu kushiriki msimbo huu na wengine. Ili kutatua matatizo haya mawili, Puppet ina chombo kinachoitwa moduli.

Modules - hizi ni seti za madarasa, ufafanuzi na vyombo vingine vya Puppet vilivyowekwa kwenye saraka tofauti. Kwa maneno mengine, moduli ni kipande cha kujitegemea cha mantiki ya Puppet. Kwa mfano, kunaweza kuwa na moduli ya kufanya kazi na nginx, na itakuwa na kile kinachohitajika kufanya kazi na nginx, au kunaweza kuwa na moduli ya kufanya kazi na PHP, na kadhalika.

Moduli zimetolewa, na utegemezi wa moduli kwa kila mmoja pia unatumika. Kuna hazina wazi ya moduli - Puppet Forge.

Kwenye seva ya bandia, moduli ziko kwenye saraka ndogo ya moduli za saraka ya mizizi. Ndani ya kila moduli kuna mpango wa saraka ya kawaida - maonyesho, faili, templates, lib, na kadhalika.

Muundo wa faili katika moduli

Mzizi wa moduli unaweza kuwa na saraka zifuatazo zilizo na majina ya maelezo:

  • manifests - ina manifesto
  • files - ina faili
  • templates - ina templates
  • lib - ina msimbo wa Ruby

Hii sio orodha kamili ya saraka na faili, lakini inatosha kwa nakala hii kwa sasa.

Majina ya rasilimali na majina ya faili kwenye moduli

Nyaraka hapa.

Rasilimali (madarasa, ufafanuzi) katika moduli haziwezi kutajwa chochote unachopenda. Kwa kuongeza, kuna mawasiliano ya moja kwa moja kati ya jina la rasilimali na jina la faili ambayo Puppet itatafuta maelezo ya rasilimali hiyo. Ikiwa utakiuka sheria za kumtaja, basi Puppet haitapata maelezo ya rasilimali, na utapata kosa la mkusanyiko.

Sheria ni rahisi:

  • Rasilimali zote katika moduli lazima ziwe katika nafasi ya majina ya moduli. Ikiwa moduli inaitwa foo, basi rasilimali zote ndani yake zinapaswa kutajwa foo::<anything>, au tu foo.
  • Rasilimali iliyo na jina la moduli lazima iwe kwenye faili init.pp.
  • Kwa rasilimali zingine, mpango wa kumtaja faili ni kama ifuatavyo.
    • kiambishi awali chenye jina la moduli hutupwa
    • koloni zote mbili, ikiwa zipo, hubadilishwa na kufyeka
    • ugani huongezwa .pp

Nitaonyesha kwa mfano. Wacha tuseme ninaandika moduli nginx. Ina rasilimali zifuatazo:

  • tabaka la nginx iliyoelezwa katika dhihirisho init.pp;
  • tabaka la nginx::service iliyoelezwa katika dhihirisho service.pp;
  • fafanua nginx::server iliyoelezwa katika dhihirisho server.pp;
  • fafanua nginx::server::location iliyoelezwa katika dhihirisho server/location.pp.

Mifumo

Hakika wewe mwenyewe unajua templeti ni nini; sitazielezea kwa undani hapa. Lakini nitaiacha ikiwa tu kiungo kwa Wikipedia.

Jinsi ya kutumia violezo: Maana ya kiolezo inaweza kupanuliwa kwa kutumia kitendakazi template, ambayo hupitishwa njia ya kiolezo. Kwa rasilimali za aina file kutumika pamoja na parameter content. Kwa mfano, kama hii:

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

Angalia njia <modulename>/<filename> ina maana faili <rootdir>/modules/<modulename>/templates/<filename>.

Kwa kuongeza, kuna kazi inline_template - inapokea maandishi ya kiolezo kama ingizo, sio jina la faili.

Ndani ya violezo, unaweza kutumia vigeu vyote vya Puppet katika upeo wa sasa.

Puppet inasaidia violezo katika umbizo la ERB na EPP:

Kwa kifupi kuhusu ERB

Miundo ya udhibiti:

  • <%= ВЫРАЖЕНИЕ %> — weka thamani ya usemi
  • <% ВЫРАЖЕНИЕ %> — hesabu thamani ya usemi (bila kuiingiza). Taarifa za masharti (ikiwa) na vitanzi (kila moja) kwa kawaida huenda hapa.
  • <%# КОММЕНТАРИЙ %>

Vielezi katika ERB vimeandikwa katika Ruby (ERB ni Rubi Iliyopachikwa).

Ili kufikia vigeu kutoka kwenye faili ya maelezo, unahitaji kuongeza @ kwa jina la kutofautiana. Ili kuondoa uvunjaji wa mstari unaoonekana baada ya ujenzi wa udhibiti, unahitaji kutumia lebo ya kufunga -%>.

Mfano wa kutumia template

Wacha tuseme ninaandika moduli ili kudhibiti ZooKeeper. Darasa linalohusika na kuunda usanidi linaonekana kama hii:

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

Na template inayolingana zoo.cfg.erb - Kwa hivyo:

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

Ukweli na Vigezo Vilivyojengwa

Mara nyingi sehemu maalum ya usanidi inategemea kile kinachotokea sasa kwenye node. Kwa mfano, kulingana na kutolewa kwa Debian ni nini, unahitaji kusanikisha toleo moja au lingine la kifurushi. Unaweza kufuatilia haya yote kwa mikono, kuandika upya hudhihirisha ikiwa nodi zitabadilika. Lakini hii sio njia kubwa; otomatiki ni bora zaidi.

Ili kupata habari kuhusu nodi, Puppet ina utaratibu unaoitwa ukweli. Ukweli - hii ni habari kuhusu nodi, inayopatikana katika maonyesho kwa namna ya vigezo vya kawaida katika nafasi ya majina ya kimataifa. Kwa mfano, jina la mwenyeji, toleo la mfumo wa uendeshaji, usanifu wa processor, orodha ya watumiaji, orodha ya miingiliano ya mtandao na anwani zao, na mengi zaidi. Ukweli unapatikana katika maonyesho na violezo kama vigeuzo vya kawaida.

Mfano wa kufanya kazi na ukweli:

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

Akizungumza rasmi, ukweli una jina (kamba) na thamani (aina mbalimbali zinapatikana: kamba, safu, kamusi). Kula seti ya ukweli uliojengwa ndani. Unaweza pia kuandika yako mwenyewe. Wakusanyaji wa ukweli wanaelezewa kama kazi katika Rubyama kama faili zinazoweza kutekelezwa. Ukweli unaweza pia kuwasilishwa kwa fomu faili za maandishi na data kwenye nodi.

Wakati wa operesheni, wakala wa puppet kwanza anakili wakusanyaji wote wa ukweli unaopatikana kutoka kwa pappetserver hadi nodi, baada ya hapo huwazindua na kutuma ukweli uliokusanywa kwa seva; Baada ya hayo, seva huanza kuandaa orodha.

Ukweli katika mfumo wa faili zinazoweza kutekelezwa

Ukweli kama huo umewekwa kwenye moduli kwenye saraka facts.d. Kwa kweli, faili lazima zitekelezwe. Inapoendeshwa, lazima zitoe maelezo kwa towe la kawaida katika umbizo la YAML au key=value.

Usisahau kwamba ukweli unatumika kwa nodi zote ambazo zinadhibitiwa na seva ya poppet ambayo moduli yako imetumwa. Kwa hiyo, katika script, jihadharini kuangalia kwamba mfumo una programu zote na faili muhimu kwa ukweli wako kufanya kazi.

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

Ukweli wa Ruby

Ukweli kama huo umewekwa kwenye moduli kwenye saraka 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

Ukweli wa maandishi

Ukweli kama huo umewekwa kwenye nodi kwenye saraka /etc/facter/facts.d katika Puppet ya zamani au /etc/puppetlabs/facts.d katika Puppet mpya.

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

Kupata Ukweli

Kuna njia mbili za kukabiliana na ukweli:

  • kupitia kamusi $facts: $facts['fqdn'];
  • kutumia jina la ukweli kama jina la kutofautisha: $fqdn.

Ni bora kutumia kamusi $facts, au bora zaidi, onyesha nafasi ya majina ya ulimwengu ($::facts).

Hapa kuna sehemu inayofaa ya nyaraka.

Vigezo Vilivyojengwa

Mbali na ukweli, kuna pia baadhi ya vigezo, inapatikana katika nafasi ya majina ya kimataifa.

  • ukweli unaoaminika — vigeu vinavyochukuliwa kutoka kwa cheti cha mteja (kwa kuwa cheti kawaida hutolewa kwenye seva ya poppet, wakala hawezi tu kuchukua na kubadilisha cheti chake, kwa hivyo vigezo "vinaaminika"): jina la cheti, jina la cheti. mwenyeji na kikoa, viendelezi kutoka kwa cheti.
  • ukweli wa seva -vigeu vinavyohusiana na habari kuhusu seva-toleo, jina, anwani ya IP ya seva, mazingira.
  • ukweli wa wakala — viambajengo vilivyoongezwa moja kwa moja na wakala wa vikaragosi, na si kwa ukweli — jina la cheti, toleo la wakala, toleo la vikaragosi.
  • vigezo bwana - Vigezo vya Pappetmaster (sic!). Ni sawa na katika ukweli wa seva, pamoja na maadili ya parameta ya usanidi yanapatikana.
  • vigezo vya mkusanyaji — vigezo vya mkusanyaji ambavyo vinatofautiana katika kila upeo: jina la moduli ya sasa na jina la moduli ambayo kitu cha sasa kilipatikana. Zinaweza kutumika, kwa mfano, kuangalia kuwa madarasa yako ya kibinafsi hayatumiwi moja kwa moja kutoka kwa moduli zingine.

Nyongeza 1: jinsi ya kuendesha na kurekebisha haya yote?

Nakala hiyo ilikuwa na mifano mingi ya msimbo wa vikaragosi, lakini haikutuambia hata kidogo jinsi ya kuendesha msimbo huu. Naam, ninajirekebisha.

Wakala anatosha kuendesha Puppet, lakini kwa hali nyingi utahitaji pia seva.

Wakala

Angalau tangu toleo la XNUMX, vifurushi vya wakala wa vikaragosi kutoka hazina rasmi ya Puppetlabs vyenye utegemezi wote (rubi na vito vinavyolingana), kwa hivyo hakuna shida za usakinishaji (ninazungumza juu ya usambazaji wa msingi wa Debian - hatutumii usambazaji wa msingi wa RPM).

Katika kesi rahisi, kutumia usanidi wa puppet, inatosha kuzindua wakala katika hali isiyo na seva: mradi msimbo wa puppet unakiliwa kwenye nodi, uzinduzi. 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

Ni bora, kwa kweli, kusanidi seva na kuendesha mawakala kwenye nodi katika hali ya daemon - basi mara moja kila nusu saa watatumia usanidi uliopakuliwa kutoka kwa seva.

Unaweza kuiga mfano wa kushinikiza wa kazi - nenda kwenye node unayopenda na uanze sudo puppet agent -t. Ufunguo -t (--test) kwa kweli inajumuisha chaguo kadhaa ambazo zinaweza kuwezeshwa kibinafsi. Chaguzi hizi ni pamoja na zifuatazo:

  • usikimbie katika hali ya daemon (kwa chaguo-msingi wakala huanza katika hali ya daemon);
  • kuzima baada ya kutumia orodha (kwa default, wakala ataendelea kufanya kazi na kutumia usanidi mara moja kila nusu saa);
  • andika logi ya kina ya kazi;
  • onyesha mabadiliko katika faili.

Wakala ana hali ya kufanya kazi bila mabadiliko - unaweza kuitumia wakati huna uhakika kwamba umeandika usanidi sahihi na unataka kuangalia ni nini hasa wakala atabadilika wakati wa operesheni. Hali hii imewezeshwa na kigezo --noop kwenye mstari wa amri: sudo puppet agent -t --noop.

Kwa kuongeza, unaweza kuwezesha logi ya utatuzi wa kazi - ndani yake, puppet inaandika juu ya vitendo vyote vinavyofanya: kuhusu rasilimali ambayo inasindika kwa sasa, kuhusu vigezo vya rasilimali hii, kuhusu mipango gani inazindua. Bila shaka hii ni parameter --debug.

Seva

Sitazingatia usanidi kamili wa pappetserver na nambari ya kupeleka kwake katika nakala hii; nitasema tu kuwa nje ya boksi kuna toleo linalofanya kazi kikamilifu la seva ambalo hauitaji usanidi wa ziada kufanya kazi na idadi ndogo ya nodi (sema, hadi mia). Idadi kubwa ya nodi itahitaji tuning - kwa default, puppetserver inazindua si zaidi ya wafanyakazi wanne, kwa utendaji mkubwa unahitaji kuongeza idadi yao na usisahau kuongeza mipaka ya kumbukumbu, vinginevyo seva itakusanya takataka mara nyingi.

Uwekaji wa nambari - ikiwa unaihitaji haraka na kwa urahisi, basi angalia (kwa r10k)[https://github.com/puppetlabs/r10k], kwa usakinishaji mdogo inapaswa kutosha kabisa.

Nyongeza ya 2: Miongozo ya Usimbaji

  1. Weka mantiki yote katika madarasa na ufafanuzi.
  2. Weka madarasa na ufafanuzi katika moduli, sio katika faili za maelezo zinazoelezea nodi.
  3. Tumia ukweli.
  4. Usifanye ifs kulingana na majina ya wapangishaji.
  5. Jisikie huru kuongeza vigezo vya madarasa na ufafanuzi - hii ni bora kuliko mantiki fiche iliyofichwa kwenye mwili wa darasa/fafanua.

Nitaelezea kwa nini ninapendekeza kufanya hivyo katika makala inayofuata.

Hitimisho

Tumalizie na utangulizi. Katika makala inayofuata nitakuambia kuhusu Hiera, ENC na PuppetDB.

Watumiaji waliojiandikisha pekee ndio wanaweza kushiriki katika utafiti. Weka sahihitafadhali.

Kwa kweli, kuna nyenzo nyingi zaidi - naweza kuandika nakala juu ya mada zifuatazo, kupiga kura juu ya kile ungependa kusoma juu yake:

  • 59,1%Miundo ya hali ya juu ya vikaragosi - baadhi ya mambo ya ngazi inayofuata: vitanzi, uchoraji ramani na usemi mwingine wa lambda, wakusanyaji rasilimali, rasilimali zinazosafirishwa nje na mawasiliano baina ya mwenyeji kupitia Puppet, lebo, watoa huduma, aina za data dhahania.13
  • 31,8%"Mimi ni msimamizi wa mama yangu" au jinsi sisi katika Avito tulifanya urafiki na seva kadhaa za poppet za matoleo tofauti, na, kimsingi, sehemu kuhusu kusimamia seva ya poppet.7
  • 81,8%Jinsi tunavyoandika msimbo wa puppet: ala, uwekaji kumbukumbu, upimaji, CI/CD.18

Watumiaji 22 walipiga kura. Watumiaji 9 walijizuia.

Chanzo: mapenzi.com