Pasiuna sa Puppet

Ang puppet usa ka sistema sa pagdumala sa configuration. Gigamit kini aron madala ang mga host sa gusto nga estado ug mapadayon kini nga estado.

Kapin na sa lima ka tuig nga nagtrabaho ko sa Puppet. Kini nga teksto usa ka gihubad ug gi-reorder nga paghugpong sa mga yawe nga punto gikan sa opisyal nga dokumentasyon, nga magtugot sa mga nagsugod nga dali nga masabtan ang esensya sa Puppet.

Pasiuna sa Puppet

Mga sukaranan nga kasayuran

Ang operating system sa Puppet kay client-server, bisan tuod nagsuporta usab kini sa walay server nga operasyon nga adunay limitado nga gamit.

Ang usa ka modelo sa pagbitad sa operasyon gigamit: sa default, kausa sa matag tunga sa oras, ang mga kliyente makontak sa server alang sa usa ka pagsumpo ug ipadapat kini. Kung nagtrabaho ka sa Ansible, unya mogamit sila usa ka lahi nga modelo sa pagduso: gisugdan sa tagdumala ang proseso sa pag-apply sa pagsumpo, ang mga kliyente mismo dili mag-aplay bisan unsa.

Atol sa komunikasyon sa network, ang duha ka paagi nga TLS encryption gigamit: ang server ug kliyente adunay ilang kaugalingong pribadong mga yawe ug katugbang nga mga sertipiko. Kasagaran ang server nag-isyu og mga sertipiko alang sa mga kliyente, apan sa prinsipyo posible nga gamiton ang usa ka eksternal nga CA.

Pasiuna sa mga manifesto

Sa Puppet terminolohiya sa puppet server magkonektar mga node (mga node). Ang pagsumpo alang sa mga node gisulat sa mga manifesto sa usa ka espesyal nga programming language - Puppet DSL.

Ang Puppet DSL usa ka deklaratibo nga pinulongan. Gihubit niini ang gitinguha nga kahimtang sa node sa porma sa mga deklarasyon sa indibidwal nga mga kahinguhaan, pananglitan:

  • Ang file anaa ug kini adunay piho nga sulod.
  • Gi-install ang package.
  • Nagsugod na ang serbisyo.

Ang mga kapanguhaan mahimong magkadugtong:

  • Adunay mga dependency, kini makaapekto sa han-ay diin ang mga kapanguhaan gigamit.
    Pananglitan, "una nga i-install ang package, dayon i-edit ang configuration file, dayon sugdi ang serbisyo."
  • Adunay mga pahibalo - kung nabag-o ang usa ka kapanguhaan, nagpadala kini mga pahibalo sa mga kapanguhaan nga naka-subscribe niini.
    Pananglitan, kung mausab ang configuration file, mahimo nimong awtomatiko nga i-restart ang serbisyo.

Dugang pa, ang Puppet DSL adunay mga function ug variables, ingon man mga conditional statement ug mga tigpili. Gisuportahan usab ang lainlaing mga mekanismo sa template - EPP ug ERB.

Ang puppet gisulat sa Ruby, daghan kaayo sa mga construct ug termino ang gikuha gikan didto. Gitugotan ka ni Ruby nga mapalapad ang Puppet - pagdugang komplikado nga lohika, bag-ong mga lahi sa mga kapanguhaan, mga gimbuhaton.

Samtang nagdagan ang Puppet, ang mga pagpakita alang sa matag piho nga node sa server gitipon sa usa ka direktoryo. Directory usa ka lista sa mga kahinguhaan ug ang ilang mga relasyon pagkahuman sa pagkalkulo sa kantidad sa mga gimbuhaton, mga variable ug pagpalapad sa mga kondisyon nga pahayag.

Syntax ug codestyle

Ania ang mga seksyon sa opisyal nga dokumentasyon nga makatabang kanimo nga masabtan ang syntax kung ang mga pananglitan nga gihatag dili igo:

Ania ang usa ka pananglitan kung unsa ang hitsura sa manifest:

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

Ang indentation ug line break dili kinahanglan nga bahin sa manifest, apan adunay girekomenda gabay sa estilo. Katingbanan:

  • Duha ka luna indents, tabs wala gigamit.
  • Ang mga kulot nga braces gibulag sa usa ka luna; ang mga colon dili gibulag sa usa ka luna.
  • Mga koma pagkahuman sa matag parameter, lakip ang katapusan. Ang matag parameter naa sa usa ka lahi nga linya. Ang usa ka eksepsiyon gihimo alang sa kaso nga walay mga parametro ug usa ka parametro: mahimo nimong isulat sa usa ka linya ug walay comma (ie. resource { 'title': } и resource { 'title': param => value }).
  • Ang mga pana sa mga parameter kinahanglan nga parehas nga lebel.
  • Ang mga pana sa relasyon sa kahinguhaan gisulat sa ilang atubangan.

Lokasyon sa mga file sa pappetserver

Alang sa dugang katin-awan, akong ipaila ang konsepto sa "root directory". Ang root directory mao ang direktoryo nga naglangkob sa Puppet configuration alang sa usa ka piho nga node.

Ang gamut nga direktoryo lainlain depende sa bersyon sa Puppet ug sa mga palibot nga gigamit. Ang mga palibot kay independente nga set sa configuration nga gitipigan sa separado nga mga direktoryo. Kasagaran gigamit sa kombinasyon sa git, diin ang mga palibot gihimo gikan sa mga sanga sa git. Busa, ang matag node nahimutang sa usa ka palibot o sa lain. Mahimo kini nga ma-configure sa node mismo, o sa ENC, nga akong hisgutan sa sunod nga artikulo.

  • Sa ikatulo nga bersyon ("daan nga Puppet") ang base nga direktoryo mao ang /etc/puppet. Opsyonal ang paggamit sa mga palibot - pananglitan, wala namo kini gamita sa karaang Puppet. Kung gigamit ang mga palibot, kasagaran kini gitipigan /etc/puppet/environments, ang root directory mao ang environment directory. Kung dili gamiton ang mga palibot, ang root directory mao ang base nga direktoryo.
  • Sugod sa ikaupat nga bersyon ("bag-ong Puppet"), ang paggamit sa mga palibot nahimong mandatory, ug ang base nga direktoryo gibalhin ngadto sa /etc/puppetlabs/code. Tungod niini, ang mga palibot gitipigan sa /etc/puppetlabs/code/environments, ang root directory mao ang environment directory.

Kinahanglang adunay subdirectory sa root directory manifests, nga adunay usa o daghan pa nga mga pagpakita nga naghulagway sa mga node. Dugang pa, kinahanglan adunay usa ka subdirectory modules, nga naglangkob sa mga module. Isulti ko kanimo kung unsa nga mga module ang ulahi. Dugang pa, ang daan nga Puppet mahimo usab nga adunay usa ka subdirektoryo files, nga adunay lainlaing mga file nga among gikopya sa mga node. Sa bag-ong Puppet, ang tanan nga mga file gibutang sa mga module.

Ang mga manifest file adunay extension .pp.

Pipila ka mga pananglitan sa panagsangka

Deskripsyon sa node ug kahinguhaan niini

Sa node server1.testdomain usa ka file kinahanglan nga buhaton /etc/issue uban sa sulod Debian GNU/Linux n l. Ang file kinahanglan nga gipanag-iya sa usa ka user ug grupo root, ang mga katungod sa pag-access kinahanglan 644.

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

Mga relasyon tali sa mga kahinguhaan sa usa ka node

Sa node server2.testdomain Ang nginx kinahanglan nga nagdagan, nagtrabaho uban ang usa ka giandam nga pag-configure kaniadto.

Atong wagtangon ang problema:

  • Kinahanglang i-install ang package nginx.
  • Kinahanglan nga kopyahon ang mga file sa pag-configure gikan sa server.
  • Ang serbisyo kinahanglan nga modagan nginx.
  • Kung gi-update ang pag-configure, kinahanglan nga i-restart ang serbisyo.

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

Aron kini molihok, kinahanglan nimo ang gibana-bana nga mosunud nga lokasyon sa file sa puppet server:

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

Mga Matang sa Kapanguhaan

Ang usa ka kompleto nga lista sa gisuportahan nga mga tipo sa kapanguhaan makit-an dinhi sa dokumentasyon, dinhi akong ihulagway ang lima ka sukaranan nga mga tipo, nga sa akong praktis igo na aron masulbad ang kadaghanan sa mga problema.

file

Nagdumala sa mga file, direktoryo, symlink, mga sulod niini, ug mga katungod sa pag-access.

Parameter:

  • ngalan sa kapanguhaan - dalan sa file (opsyonal)
  • dalan - agianan sa file (kung wala kini gipiho sa ngalan)
  • sa pagsiguro - tipo sa file:
    • absent - pagtangtang sa usa ka file
    • present — kinahanglan adunay usa ka file sa bisan unsang klase (kung wala’y file, usa ka regular nga file ang himuon)
    • file - regular nga file
    • directory - direktoryo
    • link - symlink
  • sulod — mga sulud sa file (angay ra alang sa regular nga mga file, dili magamit kauban ang tinubdan o target)
  • tinubdan — usa ka link sa dalan diin gusto nimong kopyahon ang mga sulud sa file (dili magamit kauban ang sulod o target). Mahimong ipiho nga usa ka URI nga adunay laraw puppet: (dayon ang mga file gikan sa puppet server gamiton), ug uban sa laraw http: (Naglaum ko nga klaro kung unsa ang mahitabo sa kini nga kaso), ug bisan sa diagram file: o ingon usa ka hingpit nga agianan nga wala’y schema (dayon ang file gikan sa lokal nga FS sa node gamiton)
  • target — diin ang symlink kinahanglan magpunting (dili magamit kauban ang sulod o tinubdan)
  • tag-iya — ang user nga kinahanglan tag-iya sa file
  • grupo — ang grupo diin ang file kinahanglan nga nahisakop
  • mode - mga pagtugot sa file (ingon usa ka hilo)
  • pagsubli - makapahimo sa recursive nga pagproseso sa direktoryo
  • limpyo - makapahimo sa pagtangtang sa mga file nga wala gihulagway sa Puppet
  • puwersa - makapahimo sa pagtangtang sa mga direktoryo nga wala gihulagway sa Puppet

Pakete

Pag-instalar ug pagtangtang sa mga pakete. Makadumala sa mga pahibalo - i-install pag-usab ang package kung ang parameter gitakda reinstall_on_refresh.

Parameter:

  • ngalan sa kapanguhaan - ngalan sa pakete (opsyonal)
  • ngalan - ngalan sa pakete (kung wala gipiho sa ngalan)
  • provider - tagdumala sa pakete nga gamiton
  • sa pagsiguro - gitinguha nga kahimtang sa pakete:
    • present, installed - bisan unsang bersyon nga na-install
    • latest - pinakabag-o nga bersyon nga na-install
    • absent - gitangtang (apt-get remove)
    • purged - gitangtang kauban ang mga file sa pag-configure (apt-get purge)
    • held - ang bersyon sa pakete gi-lock (apt-mark hold)
    • любая другая строка - ang gitakda nga bersyon gi-install
  • reinstall_on_refresh - kung true, unya sa pagkadawat sa pahibalo ang package i-install pag-usab. Mapuslanon alang sa mga pag-apod-apod nga nakabase sa gigikanan, kung diin kinahanglan ang mga pakete sa pagtukod pag-usab kung magbag-o sa mga parameter sa pagtukod. Default false.

nga pag-alagad

Nagdumala sa mga serbisyo. Makahimo sa pagproseso sa mga pahibalo - i-restart ang serbisyo.

Parameter:

  • ngalan sa kapanguhaan — serbisyo nga dumalahon (opsyonal)
  • ngalan — ang serbisyo nga kinahanglan madumala (kung wala gipiho sa ngalan)
  • sa pagsiguro — gitinguha nga kahimtang sa serbisyo:
    • running - gilusad
    • stopped - mihunong
  • makahimo — nagkontrol sa abilidad sa pagsugod sa serbisyo:
    • true — gipalihok ang autorun (systemctl enable)
    • mask - nagtakuban (systemctl mask)
    • false — ang autorun gi-disable (systemctl disable)
  • Pagsugod pag-usab - sugo nga i-restart ang serbisyo
  • status — sugo aron susihon ang kahimtang sa serbisyo
  • gi-restart — ipakita kung ang serbisyo initscript nagsuporta sa pagsugod pag-usab. Kung false ug ang parameter gitakda Pagsugod pag-usab - ang bili niini nga parameter gigamit. Kung false ug parameter Pagsugod pag-usab wala gipiho - ang serbisyo gipahunong ug gisugdan pag-usab (apan gigamit sa systemd ang command systemctl restart).
  • hasstatus — ipakita kung ang serbisyo initscript nagsuporta sa sugo status. Kon false, unya ang parameter value gigamit status. Default true.

exec

Nagdagan sa gawas nga mga sugo. Kung dili nimo ipiho ang mga parameter nagmugna, kung, gawas kon o refreshonly, ang command ipadagan sa matag Puppet nga ipadagan. Makahimo sa pagproseso sa mga pahibalo - nagpadagan sa usa ka sugo.

Parameter:

  • ngalan sa kapanguhaan - sugo nga ipatuman (opsyonal)
  • sugo — ang mando nga ipatuman (kung wala kini gipiho sa ngalan)
  • dalan — mga dalan diin pangitaon ang executable file
  • kung — kung ang mando nga gipiho sa kini nga parameter nakompleto sa usa ka zero return code, ang panguna nga mando ipatuman
  • gawas kon - kung ang mando nga gipiho sa kini nga parameter nahuman sa usa ka non-zero return code, ang panguna nga mando ipatuman
  • nagmugna - kung ang file nga gitakda sa kini nga parameter wala maglungtad, ang panguna nga mando ipatuman
  • refreshonly - kung true, unya ang sugo ipadagan lamang kung kini nga exec makadawat og pahibalo gikan sa ubang mga kapanguhaan
  • cwd — direktoryo nga gikan diin ipadagan ang mando
  • user — ang tiggamit gikan kang kinsa modagan sa sugo
  • provider - unsaon pagpadagan ang sugo:
    • posix — usa ka proseso sa bata ang gihimo ra, siguruha nga ipiho dalan
    • kabhang - ang sugo gilunsad sa kabhang /bin/sh, mahimong dili espesipiko dalan, mahimo nimong gamiton ang globbing, mga tubo ug uban pang mga bahin sa kabhang. Kasagaran nga awtomatikong makit-an kung adunay bisan unsang espesyal nga mga karakter (|, ;, &&, || ug uban pa).

cron

Gikontrol ang mga cronjob.

Parameter:

  • ngalan sa kapanguhaan - usa lang ka matang sa identifier
  • sa pagsiguro - estado sa korona:
    • present - paghimo kung wala
    • absent - delete kung naa
  • sugo - unsa nga sugo sa pagdagan
  • palibot — diin ang palibot ipadagan ang mando (lista sa mga variable sa palibot ug ang ilang mga kantidad pinaagi sa =)
  • user — diin gikan ang tiggamit nga modagan sa mando
  • minuto, oras, adlaw sa semana, bulan, adlaw sa bulan - kanus-a modagan ang cron. Kung ang bisan unsa niini nga mga hiyas wala gitino, ang kantidad niini sa crontab mahimong *.

Sa Puppet 6.0 cron ingon nga gikuha gikan sa kahon sa puppetserver, mao nga walay dokumentasyon sa kinatibuk-ang site. Pero siya naa sa kahon sa puppet-agent, mao nga dili kinahanglan nga i-install kini nga gilain. Makita nimo ang dokumentasyon alang niini sa dokumentasyon para sa ikalima nga bersyon sa Puppet, o sa GitHub.

Mahitungod sa mga kapanguhaan sa kinatibuk-an

Mga kinahanglanon alang sa pagkatalagsaon sa kahinguhaan

Ang kasagarang sayop nga atong masugatan mao Duplicate nga deklarasyon. Kini nga sayup mahitabo kung ang duha o daghang mga kapanguhaan sa parehas nga tipo nga adunay parehas nga ngalan makita sa direktoryo.

Busa, ako mosulat pag-usab: Ang mga pagpakita alang sa parehas nga node kinahanglan dili maglangkob sa mga kapanguhaan sa parehas nga tipo nga adunay parehas nga titulo!

Usahay adunay panginahanglan sa pag-instalar sa mga pakete nga adunay parehas nga ngalan, apan adunay lainlaing mga managers sa package. Sa kini nga kaso, kinahanglan nimo nga gamiton ang parameter namepara malikayan ang error:

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

Ang ubang mga tipo sa kahinguhaan adunay susama nga mga kapilian aron makatabang sa paglikay sa pagdoble - name у nga pag-alagad, command у exec, ug uban pa.

Metaparameter

Ang matag matang sa kapanguhaan adunay pipila ka espesyal nga mga parameter, bisan unsa pa ang kinaiyahan niini.

Kompleto nga lista sa mga meta parameter sa Puppet nga dokumentasyon.

Mubo nga listahan:

  • nagkinahanglan — kini nga parameter nagpaila kung unsang mga kapanguhaan ang gisaligan niini nga kapanguhaan.
  • sa atubangan sa - Kini nga parameter nagtino kung unsang mga kapanguhaan ang nagdepende niini nga kapanguhaan.
  • subscribe — kini nga parametro nagpiho gikan sa diin nga mga kapanguhaan kini nga kapanguhaan makadawat mga pahibalo.
  • pahibal-a — Kini nga parameter nagtino kung unsang mga kapanguhaan ang makadawat mga pahibalo gikan sa kini nga kapanguhaan.

Ang tanan nga nalista nga metaparameter modawat sa usa ka link sa kapanguhaan o usa ka han-ay sa mga link sa square bracket.

Mga link sa mga kapanguhaan

Ang usa ka sumpay sa kapanguhaan usa lamang ka paghisgot sa kapanguhaan. Kini kasagarang gigamit sa pagpaila sa mga dependency. Ang paghisgot sa usa ka wala-naglungtad nga kapanguhaan mahimong hinungdan sa usa ka sayup sa pagtipon.

Ang syntax sa link mao ang mosunod: resource type nga adunay kapital nga letra (kung ang type name adunay double colons, nan ang matag bahin sa ngalan tali sa colon kay gi-capitalize), unya ang resource name sa square brackets (ang kaso sa ngalan. dili mausab!). Kinahanglang walay mga luna; ang mga square bracket gisulat dayon human sa ngalan sa tipo.

Pananglitan:

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

Mga pagsalig ug mga pahibalo

Dokumentasyon dinhi.

Sama sa giingon sa sayo pa, ang yano nga mga dependency tali sa mga kahinguhaan kay transitive. Pinaagi sa dalan, pag-amping sa pagdugang sa mga dependency - mahimo ka nga maghimo cyclic dependencies, nga magpahinabog usa ka sayup sa pag-compile.

Dili sama sa mga dependency, ang mga pahibalo dili transitive. Ang mosunod nga mga lagda magamit alang sa mga pahibalo:

  • Kung ang kapanguhaan makadawat usa ka pahibalo, kini gi-update. Ang mga aksyon sa pag-update nagdepende sa tipo sa kapanguhaan − exec nagpadagan sa mando, nga pag-alagad i-restart ang serbisyo, Pakete i-install pag-usab ang package. Kung ang kapanguhaan walay gihubit nga aksyon sa pag-update, nan walay mahitabo.
  • Atol sa usa ka run sa Puppet, ang kahinguhaan gi-update dili labaw sa kausa. Posible kini tungod kay ang mga pahibalo naglakip sa mga dependency ug ang dependency graph walay mga siklo.
  • Kung ang Puppet magbag-o sa kahimtang sa usa ka kapanguhaan, ang kapanguhaan magpadala mga pahibalo sa tanan nga mga kapanguhaan nga naka-subscribe niini.
  • Kung ang usa ka kapanguhaan gi-update, nagpadala kini mga pahibalo sa tanan nga mga kapanguhaan nga naka-subscribe niini.

Pagdumala sa wala matino nga mga parameter

Ingon sa usa ka lagda, kung ang pipila ka parametro sa kahinguhaan walay default nga bili ug kini nga parameter wala gipiho sa manifest, nan ang Puppet dili mag-usab niini nga kabtangan alang sa katugbang nga kapanguhaan sa node. Pananglitan, kon ang usa ka kapanguhaan sa matang file wala gipiho ang parameter owner, unya ang Puppet dili mag-usab sa tag-iya sa katugbang nga file.

Pasiuna sa mga klase, mga variable ug mga kahulugan

Ibutang ta nga kita adunay daghang mga node nga adunay parehas nga bahin sa pagsumpo, apan adunay usab mga kalainan - kung dili mahimo naton ihulagway kini tanan sa usa ka bloke. node {}. Siyempre, mahimo nimong kopyahon ang parehas nga mga bahin sa pagsumpo, apan sa kinatibuk-an kini usa ka dili maayo nga solusyon - ang pag-configure motubo, ug kung imong usbon ang kinatibuk-ang bahin sa pagsumpo, kinahanglan nimo nga i-edit ang parehas nga butang sa daghang mga lugar. Sa samang higayon, sayon ​​​​ang masayop, ug sa kinatibuk-an, ang DRY (ayaw pag-usab sa imong kaugalingon) nga prinsipyo giimbento alang sa usa ka rason.

Aron masulbad kini nga problema adunay usa ka disenyo sama sa класс.

Mga klase

Класс mao ang usa ka ginganlan block sa poppet code. Kinahanglan ang mga klase aron magamit pag-usab ang code.

Una kinahanglan nga ihulagway ang klase. Ang paghulagway mismo wala magdugang bisan unsang mga kahinguhaan bisan asa. Ang klase gihulagway sa mga pagpakita:

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

Human niini ang klase mahimong gamiton:

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

Usa ka pananglitan gikan sa miaging buluhaton - atong ibalhin ang pag-install ug pag-configure sa nginx sa usa ka klase:

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
}

Mga variable

Ang klase gikan sa miaging pananglitan dili gyud mabag-o tungod kay kanunay kini nagdala sa parehas nga pagsumpo sa nginx. Himoon nato ang dalan paingon sa configuration variable, unya kini nga klase mahimong gamiton sa pag-instalar sa nginx sa bisan unsang configuration.

Mahimo kini gamit ang mga variable.

Atensyon: ang mga variable sa Puppet dili mausab!

Dugang pa, ang usa ka variable mahimo ra ma-access pagkahuman nga kini gideklarar, kung dili ang kantidad sa variable mahimong undef.

Pananglitan sa pagtrabaho sa mga variable:

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

Puppet adunay mga namespace, ug ang mga variable, sumala niana, adunay lugar nga makita: Ang usa ka variable nga adunay parehas nga ngalan mahimong ipasabut sa lainlaing mga namespaces. Kung gisulbad ang kantidad sa usa ka variable, ang variable gipangita sa karon nga namespace, dayon sa gilakip nga namespace, ug uban pa.

Mga pananglitan sa namespace:

  • global - ang mga variable sa gawas sa klase o paghulagway sa node moadto didto;
  • node namespace sa deskripsyon sa node;
  • namespace sa klase sa deskripsyon sa klase.

Aron malikayan ang kalabuan kung mag-access sa usa ka variable, mahimo nimong ipiho ang namespace sa variable nga ngalan:

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

Mouyon kita nga ang dalan sa pag-configure sa nginx naa sa variable $nginx_conf_source. Dayon ang klase mahimong sama niini:

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
}

Bisan pa, ang gihatag nga pananglitan dili maayo tungod kay adunay pipila nga "tinago nga kahibalo" nga sa usa ka lugar sa sulod sa klase usa ka variable nga adunay ingon ug ingon nga ngalan ang gigamit. Mas husto nga himuon kini nga kahibalo nga kinatibuk-an - ang mga klase mahimong adunay mga parameter.

Mga parametro sa klase mga variable sa namespace sa klase, gipiho kini sa header sa klase ug mahimong magamit sama sa regular nga mga variable sa lawas sa klase. Ang mga kantidad sa parameter gitino kung gigamit ang klase sa manifest.

Ang parameter mahimong itakda sa usa ka default nga kantidad. Kung ang usa ka parameter walay default nga kantidad ug ang kantidad wala itakda kung gigamit, kini hinungdan sa usa ka sayup sa pag-compile.

Atong i-parameter ang klase gikan sa panig-ingnan sa ibabaw ug idugang ang duha ka mga parameter: ang una, gikinahanglan, mao ang dalan sa pag-configure, ug ang ikaduha, opsyonal, mao ang ngalan sa package nga adunay nginx (sa Debian, pananglitan, adunay mga pakete. 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',   # задаём параметры класса точно так же, как параметры для других ресурсов
  }
}

Sa Puppet, gi-type ang mga variable. Kaon daghang mga tipo sa datos. Ang mga tipo sa datos kasagarang gigamit aron ma-validate ang mga kantidad sa parameter nga gipasa sa mga klase ug mga kahulugan. Kung ang gipasa nga parameter dili motakdo sa gipiho nga tipo, mahitabo ang usa ka sayup sa pag-compile.

Ang tipo gisulat dayon sa wala pa ang ngalan sa parameter:

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

Mga klase: iapil ang classname vs class{'classname':}

Ang matag klase usa ka kapanguhaan sa tipo klase. Sama sa bisan unsang lain nga matang sa kapanguhaan, dili mahimo nga duha ka mga higayon sa parehas nga klase sa parehas nga node.

Kung mosulay ka pagdugang usa ka klase sa parehas nga node kaduha gamit class { 'classname':} (walay kalainan, nga adunay lainlain o parehas nga mga parameter), adunay usa ka sayup sa pagtipon. Apan kung mogamit ka usa ka klase sa istilo sa kapanguhaan, mahimo nimo nga klaro nga itakda ang tanan nga mga parameter niini sa manifest.

Apan, kon imong gamiton include, unya ang klase mahimong idugang sa makadaghang higayon nga gusto. Ang kamatuoran mao kana include usa ka function nga idempotent nga nagsusi kung ang usa ka klase gidugang sa direktoryo. Kung ang klase wala sa direktoryo, idugang kini, ug kung naglungtad na kini, wala’y mahimo. Apan sa kaso sa paggamit include Dili nimo mahimo ang mga parameter sa klase sa panahon sa deklarasyon sa klase - ang tanan nga gikinahanglan nga mga parameter kinahanglan ibutang sa usa ka eksternal nga tinubdan sa datos - Hiera o ENC. Atong hisgotan sila sa sunod nga artikulo.

Nagpasabot

Sama sa giingon sa miaging block, ang parehas nga klase dili mahimong naa sa usa ka node labaw sa usa ka beses. Bisan pa, sa pipila ka mga kaso kinahanglan nimo nga magamit ang parehas nga bloke sa code nga adunay lainlaing mga parameter sa parehas nga node. Sa laing pagkasulti, adunay panginahanglan alang sa usa ka matang sa kapanguhaan sa iyang kaugalingon.

Pananglitan, aron ma-install ang PHP module, buhaton namo ang mosunod sa Avito:

  1. I-install ang package gamit kini nga module.
  2. Magbuhat ta ug configuration file para niini nga module.
  3. Naghimo kami og symlink sa config para sa php-fpm.
  4. Naghimo kami usa ka symlink sa config para sa php cli.

Sa maong mga kaso, usa ka disenyo sama sa ipasabot (paghubit, gihubit nga tipo, gipiho nga tipo sa kapanguhaan). Ang usa ka Define susama sa usa ka klase, apan adunay mga kalainan: una, ang matag Define usa ka tipo sa kapanguhaan, dili usa ka kapanguhaan; ikaduha, ang matag kahulugan adunay implicit nga parameter $title, diin ang ngalan sa kapanguhaan moadto kung kini gipahayag. Sama sa kaso sa mga klase, ang usa ka kahulugan kinahanglan una nga ihulagway, pagkahuman kini magamit.

Usa ka gipasimple nga pananglitan nga adunay usa ka module alang sa 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' }
}

Ang pinakasayon ​​nga paagi sa pagdakop sa Duplicate nga deklarasyon nga sayop anaa sa Define. Mahitabo kini kung ang usa ka kahulugan adunay usa ka kapanguhaan nga adunay kanunay nga ngalan, ug adunay duha o daghan pa nga mga higayon sa kini nga kahulugan sa pila ka node.

Sayon ang pagpanalipod sa imong kaugalingon gikan niini: ang tanan nga mga kapanguhaan sa sulod sa kahulugan kinahanglan adunay usa ka ngalan depende sa $title. Ang usa ka alternatibo mao ang idempotent nga pagdugang sa mga kahinguhaan; sa pinakasimple nga kaso, igo na nga ibalhin ang mga kapanguhaan nga komon sa tanan nga mga higayon sa kahulugan ngadto sa usa ka lain nga klase ug ilakip kini nga klase sa kahulugan - function include idempotent.

Adunay uban nga mga paagi aron makab-ot ang idempotency kung magdugang mga kapanguhaan, nga mao ang paggamit sa mga gimbuhaton defined и ensure_resources, apan isulti ko kanimo ang bahin niini sa sunod nga yugto.

Dependencies ug mga pahibalo alang sa mga klase ug mga kahulugan

Ang mga klase ug mga kahulugan nagdugang sa mosunod nga mga lagda sa pagdumala sa mga dependency ug mga pahibalo:

  • dependency sa usa ka klase / define nagdugang dependencies sa tanan nga mga kapanguhaan sa klase / define;
  • ang usa ka klase/gihubit nga dependency nagdugang mga dependency sa tanan nga klase/gipasabut nga mga kapanguhaan;
  • class/define nga pahibalo nagpahibalo sa tanang kahinguhaan sa klase/define;
  • class/define subscription subscribes sa tanang resources sa class/define.

Mga pahayag sa kondisyon ug mga tigpili

Dokumentasyon dinhi.

if

Simple ra dinhi:

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

gawas kon

gawas kung usa ka kung baliskad: ang block sa code ipatuman kung ang ekspresyon bakak.

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

kaso

Wala'y bisan unsa nga komplikado dinhi. Mahimo nimong gamiton ang mga regular nga kantidad (mga kuwerdas, numero, ug uban pa), regular nga mga ekspresyon, ug mga tipo sa datos ingon mga kantidad.

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

Mga tigpili

Ang usa ka tigpili usa ka lengguwahe nga pagtukod nga susama sa case, apan imbis nga ipatuman ang usa ka bloke sa code, nagbalik kini usa ka kantidad.

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

Mga Modulo

Kung gamay ra ang pag-configure, dali kini matipigan sa usa ka pagpakita. Apan ang daghang mga pag-configure nga atong gihulagway, ang daghang mga klase ug mga node naa sa pagpakita, kini motubo, ug kini mahimong dili kombenyente sa pagtrabaho.

Dugang pa, adunay problema sa paggamit pag-usab sa code - kung ang tanan nga code naa sa usa ka manifest, lisud nga ipaambit kini nga code sa uban. Aron masulbad kining duha ka problema, ang Puppet adunay entidad nga gitawag og modules.

Mga Modulo - kini ang mga set sa mga klase, kahulugan ug uban pang Puppet entity nga gibutang sa usa ka lahi nga direktoryo. Sa laing pagkasulti, ang module kay independente nga piraso sa Puppet logic. Pananglitan, mahimo nga adunay usa ka module alang sa pagtrabaho sa nginx, ug kini adunay sulod kung unsa ug kung unsa lamang ang gikinahanglan aron magtrabaho sa nginx, o adunay usa ka module alang sa pagtrabaho sa PHP, ug uban pa.

Ang mga module gi-bersyon, ug ang mga dependency sa mga module sa usag usa gisuportahan usab. Adunay usa ka bukas nga repository sa mga module - Puppet Forge.

Sa puppet server, ang mga module nahimutang sa modules subdirectory sa root directory. Sa sulod sa matag module adunay usa ka sumbanan nga laraw sa direktoryo - mga pagpakita, mga file, mga template, lib, ug uban pa.

Ang istruktura sa file sa usa ka module

Ang gamut sa module mahimong adunay mga musunod nga mga direktoryo nga adunay mga deskriptibo nga ngalan:

  • manifests - kini adunay mga manifesto
  • files - kini adunay mga file
  • templates - kini adunay mga templates
  • lib - kini adunay Ruby code

Dili kini usa ka kompleto nga lista sa mga direktoryo ug mga file, apan igo na kini alang sa kini nga artikulo sa pagkakaron.

Mga ngalan sa mga kapanguhaan ug mga ngalan sa mga file sa module

Dokumentasyon dinhi.

Ang mga kapanguhaan (mga klase, mga kahulugan) sa usa ka module dili mahimong nganlan kung unsa ang gusto nimo. Dugang pa, adunay usa ka direkta nga sulat tali sa ngalan sa usa ka kapanguhaan ug ang ngalan sa file diin ang Puppet mangita alang sa usa ka paghulagway sa kana nga kapanguhaan. Kung gilapas nimo ang mga lagda sa pagngalan, nan ang Puppet dili gyud makit-an ang paghulagway sa kapanguhaan, ug makakuha ka usa ka sayup sa pag-compile.

Simple ra ang mga lagda:

  • Ang tanan nga mga kapanguhaan sa usa ka module kinahanglan nga naa sa namespace sa module. Kung ang module gitawag foo, unya ang tanan nga mga kapanguhaan niini kinahanglan nganlan foo::<anything>, o lang foo.
  • Ang kapanguhaan nga adunay ngalan sa module kinahanglan nga naa sa file init.pp.
  • Alang sa ubang mga kapanguhaan, ang laraw sa pagngalan sa file mao ang mosunod:
    • ang prefix nga adunay ngalan sa module gilabay
    • ang tanan nga doble nga colon, kung adunay, gipulihan sa mga laslas
    • gidugang ang extension .pp

Akong ipakita uban ang usa ka pananglitan. Ingnon ta nga nagsulat ko og module nginx. Kini naglangkob sa mosunod nga mga kapanguhaan:

  • класс nginx gihulagway sa manifest init.pp;
  • класс nginx::service gihulagway sa manifest service.pp;
  • ipasabot nginx::server gihulagway sa manifest server.pp;
  • ipasabot nginx::server::location gihulagway sa manifest server/location.pp.

Mga pattern

Sigurado nga nahibal-an nimo mismo kung unsa ang mga template; Dili ko kini ihulagway sa detalye dinhi. Pero biyaan ra nako link sa Wikipedia.

Giunsa paggamit ang mga template: Ang kahulugan sa usa ka template mahimong mapalapad gamit ang usa ka function template, nga gipasa sa agianan padulong sa template. Alang sa mga kapanguhaan sa tipo file gigamit kauban ang parameter content. Pananglitan, sama niini:

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

Tan-awa ang dalan <modulename>/<filename> nagpasabot sa file <rootdir>/modules/<modulename>/templates/<filename>.

Dugang pa, adunay usa ka kalihokan inline_template - kini nakadawat sa template nga teksto isip input, dili ang ngalan sa file.

Sulod sa mga templates, mahimo nimong gamiton ang tanang Puppet variables sa kasamtangang sakup.

Gisuportahan sa puppet ang mga template sa ERB ug EPP format:

Sa mubo bahin sa ERB

Mga istruktura sa pagkontrol:

  • <%= ВЫРАЖЕНИЕ %> — isulod ang bili sa ekspresyon
  • <% ВЫРАЖЕНИЕ %> — kuwentaha ang bili sa usa ka ekspresyon (nga walay pagsal-ot niini). Ang mga kondisyon nga pahayag (kung) ug mga galong (matag usa) kasagarang moadto dinhi.
  • <%# КОММЕНТАРИЙ %>

Ang mga ekspresyon sa ERB gisulat sa Ruby (Ang ERB sa tinuud nga Embedded Ruby).

Aron ma-access ang mga variable gikan sa manifest, kinahanglan nimo nga idugang @ ngadto sa variable nga ngalan. Aron matangtang ang linya sa linya nga makita pagkahuman sa usa ka kontrol nga pagtukod, kinahanglan nimo nga mogamit usa ka panapos nga tag -%>.

Pananglitan sa paggamit sa template

Ingnon ta nga nagsulat ako usa ka module aron makontrol ang ZooKeeper. Ang klase nga responsable sa paghimo sa config ingon niini:

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

Ug ang katugbang nga template zoo.cfg.erb - Busa:

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

Mga Kamatuoran ug Gitukod nga mga Variable

Kasagaran ang piho nga bahin sa pagsumpo nagdepende sa kung unsa ang nahitabo karon sa node. Pananglitan, depende sa kung unsa ang pagpagawas sa Debian, kinahanglan nimo nga i-install ang usa o lain nga bersyon sa package. Mahimo nimong bantayan ang tanan niini nga mano-mano, pagsulat pag-usab sa mga pagpakita kung magbag-o ang mga node. Apan dili kini seryoso nga pamaagi; mas maayo ang automation.

Aron makakuha og impormasyon bahin sa mga node, ang Puppet adunay mekanismo nga gitawag og facts. Mga Kamatuoran - kini ang kasayuran bahin sa node, nga magamit sa mga pagpakita sa porma sa ordinaryong mga variable sa global nga namespace. Pananglitan, ngalan sa host, bersyon sa operating system, arkitektura sa processor, lista sa mga tiggamit, lista sa mga interface sa network ug ilang mga adres, ug daghan pa. Ang mga kamatuoran anaa sa mga manifests ug templates isip regular nga mga variable.

Usa ka pananglitan sa pagtrabaho sa mga kamatuoran:

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

Sa pormal nga pagkasulti, ang usa ka kamatuoran adunay usa ka ngalan (kuwerdas) ug usa ka bili (laing mga matang anaa: mga kuwerdas, mga han-ay, mga diksyonaryo). Kaon hugpong sa mga built-in nga kamatuoran. Mahimo usab nimo isulat ang imong kaugalingon. Ang mga tigkolekta sa kamatuoran gihulagway sama sa mga gimbuhaton sa Rubybisan ingon executable nga mga file. Ang mga kamatuoran mahimo usab nga ipresentar sa porma mga text file nga adunay data sa mga node.

Atol sa operasyon, una nga kopyahon sa ahente sa itoy ang tanan nga magamit nga mga kolektor sa kamatuoran gikan sa pappetserver hangtod sa node, pagkahuman gilunsad kini ug ipadala ang nakolekta nga mga kamatuoran sa server; Pagkahuman niini, ang server nagsugod sa pagtipon sa katalogo.

Mga kamatuoran sa porma sa mga executable nga mga file

Ang ingon nga mga kamatuoran gibutang sa mga module sa direktoryo facts.d. Siyempre, ang mga file kinahanglan nga ma-executable. Sa diha nga modagan, sila kinahanglan nga magpagawas sa impormasyon ngadto sa standard nga output sa YAML o key=value format.

Ayaw kalimti nga ang mga kamatuoran magamit sa tanan nga mga node nga kontrolado sa poppet server diin ang imong module gipakatap. Busa, sa script, pag-amping aron masusi nga ang sistema adunay tanan nga mga programa ug mga file nga gikinahanglan aron molihok ang imong kamatuoran.

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

Ruby kamatuoran

Ang ingon nga mga kamatuoran gibutang sa mga module sa direktoryo 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

Mga kamatuoran sa teksto

Ang ingon nga mga kamatuoran gibutang sa mga node sa direktoryo /etc/facter/facts.d sa karaang Puppet o /etc/puppetlabs/facts.d sa bag-ong Puppet.

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

Pag-abot sa Kamatuoran

Adunay duha ka paagi sa pagduol sa mga kamatuoran:

  • pinaagi sa diksyonaryo $facts: $facts['fqdn'];
  • gamit ang fact name isip variable name: $fqdn.

Labing maayo nga mogamit usa ka diksyonaryo $facts, o mas maayo pa, ipakita ang global namespace ($::facts).

Ania ang may kalabutan nga seksyon sa dokumentasyon.

Gitukod nga mga Variable

Gawas sa mga kamatuoran, aduna usab pipila ka mga variable, anaa sa global namespace.

  • kasaligan nga mga kamatuoran — mga variable nga gikuha gikan sa sertipiko sa kliyente (tungod kay ang sertipiko kasagarang gi-isyu sa usa ka poppet server, ang ahente dili lang makakuha ug magbag-o sa sertipiko niini, mao nga ang mga variable "gisaligan"): ngalan sa sertipiko, host ug ngalan sa domain, mga extension gikan sa sertipiko.
  • server kamatuoran —mga variable nga may kalabotan sa impormasyon bahin sa server—bersyon, ngalan, IP address sa server, palibot.
  • ahente nga kamatuoran — mga variable nga gidugang direkta sa puppet-agent, ug dili sa facter — ngalan sa sertipiko, bersyon sa ahente, bersyon sa papet.
  • master variables - Pappetmaster variables (sic!). Kini halos parehas sa sa server kamatuoran, dugang nga mga kantidad sa parameter sa pagsumpo anaa.
  • mga variable sa compiler — mga variable sa compiler nga lainlain sa matag sakup: ang ngalan sa karon nga module ug ang ngalan sa module diin ang karon nga butang gi-access. Mahimo kining gamiton, pananglitan, aron masusi nga ang imong pribadong mga klase wala gigamit direkta gikan sa ubang mga module.

Dugang 1: unsaon pagdagan ug pag-debug niining tanan?

Ang artikulo adunay daghang mga pananglitan sa papet nga kodigo, apan wala gyud kami gisultihan kung giunsa pagpadagan kini nga code. Aw, gitul-id ko ang akong kaugalingon.

Ang usa ka ahente igo na sa pagpadagan sa Puppet, apan sa kadaghanan nga mga kaso kinahanglan nimo usab ang usa ka server.

Ahente

Labing menos sukad sa bersyon XNUMX, puppet-agent packages gikan sa opisyal nga Puppetlabs repository naglangkob sa tanan nga mga dependency (ruby ug ang katugbang nga mga hiyas), mao nga walay mga kalisud sa pag-instalar (naghisgot ako mahitungod sa mga distribusyon nga nakabase sa Debian - wala kami naggamit sa mga distribusyon nga nakabase sa RPM).

Sa pinakasimple nga kaso, aron magamit ang pag-configure sa papet, igo na ang paglansad sa ahente sa mode nga wala’y server: basta ang papet nga code gikopya sa node, ilunsad 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

Mas maayo, siyempre, ang pag-set up sa server ug pagpadagan sa mga ahente sa mga node sa daemon mode - unya kausa sa matag tunga sa oras ilang ipadapat ang configuration nga na-download gikan sa server.

Mahimo nimong sundogon ang modelo sa pagduso sa trabaho - adto sa node nga interesado ka ug magsugod sudo puppet agent -t. yawe -t (--test) sa aktuwal naglakip sa pipila ka mga kapilian nga mahimo sa tagsa-tagsa. Kini nga mga opsyon naglakip sa mosunod:

  • ayaw pagdagan sa daemon mode (sa default ang ahente magsugod sa daemon mode);
  • pagsira human magamit ang katalogo (sa default, ang ahente magpadayon sa pagtrabaho ug ipadapat ang pagsumpo kausa matag tunga sa oras);
  • pagsulat sa usa ka detalyado nga log sa trabaho;
  • ipakita ang mga pagbag-o sa mga file.

Ang ahente adunay usa ka operating mode nga walay mga pagbag-o - mahimo nimo kini gamiton kung dili ka sigurado nga imong gisulat ang husto nga pag-configure ug gusto nga susihon kung unsa gyud ang pagbag-o sa ahente sa panahon sa operasyon. Kini nga mode gipalihok pinaagi sa parameter --noop sa command line: sudo puppet agent -t --noop.

Dugang pa, mahimo nimong palihokon ang pag-debug sa log sa trabaho - sa sulod niini, ang papet nagsulat bahin sa tanan nga mga aksyon nga gihimo niini: bahin sa kapanguhaan nga giproseso karon, bahin sa mga parameter sa kini nga kapanguhaan, kung unsang mga programa ang gilunsad niini. Siyempre kini usa ka parameter --debug.

Server

Dili nako ikonsiderar ang tibuuk nga pag-setup sa pappetserver ug pag-deploy sa code niini sa kini nga artikulo; Isulti ra nako nga sa gawas sa kahon adunay usa ka hingpit nga magamit nga bersyon sa server nga wala magkinahanglan dugang nga pag-configure aron magtrabaho sa gamay nga gidaghanon sa nodes (ingon, hangtod sa usa ka gatos). Ang usa ka mas dako nga gidaghanon sa mga node magkinahanglan og tuning - sa default, ang puppetserver maglunsad og dili molapas sa upat ka mga trabahante, alang sa mas dako nga pasundayag kinahanglan nimo nga dugangan ang ilang gidaghanon ug ayaw kalimti ang pagdugang sa mga limitasyon sa panumduman, kung dili ang server magkolekta og basura sa kadaghanan sa panahon.

Pag-deploy sa code - kung kinahanglan nimo kini nga dali ug dali, tan-awa (sa r10k)[https://github.com/puppetlabs/r10k], alang sa gagmay nga mga instalasyon kini kinahanglan nga igo na.

Addendum 2: Mga Giya sa Pag-coding

  1. Ibutang ang tanan nga lohika sa mga klase ug mga kahulugan.
  2. Ipadayon ang mga klase ug mga kahulugan sa mga module, dili sa mga pagpakita nga naghulagway sa mga node.
  3. Gamita ang mga kamatuoran.
  4. Ayaw paghimo og mga if base sa mga hostname.
  5. Mobati nga gawasnon sa pagdugang sa mga parametro alang sa mga klase ug mga kahulugan - kini mas maayo kaysa implicit nga lohika nga gitago sa lawas sa klase/gihubit.

Isaysay ko kon nganong girekomendar nako ang pagbuhat niini sa sunod nga artikulo.

konklusyon

Tapuson nato sa introduksiyon. Sa sunod nga artikulo isulti ko kanimo ang bahin sa Hiera, ENC ug PuppetDB.

Ang mga rehistradong tiggamit lamang ang makaapil sa survey. Sign in, walay sapayan.

Sa tinuud, adunay daghan pa nga materyal - makasulat ako mga artikulo sa mga mosunud nga hilisgutan, pagboto kung unsa ang gusto nimo nga basahon bahin sa:

  • 59,1%Mga advanced nga puppet constructs - pipila ka sunod-sunod nga level shit: loops, mapping ug uban pang lambda expressions, resource collectors, exported resources ug inter-host communication pinaagi sa Puppet, tags, providers, abstract data type.13
  • 31,8%"Ako ang admin sa akong inahan" o kung giunsa namo sa Avito ang pagpakighigala sa pipila ka mga poppet server sa lain-laing mga bersyon, ug, sa prinsipyo, ang bahin mahitungod sa pagdumala sa poppet server.7
  • 81,8%Giunsa nato pagsulat ang puppet code: instrumentasyon, dokumentasyon, pagsulay, CI/CD.18

22 ka tiggamit ang miboto. 9 ka tiggamit ang nag-abstain.

Source: www.habr.com