Introductio ad PUPUS

PUPUS est ratio configurationis procuratio. Exercitationes ad statum desideratum adducere, et hanc rempublicam conservare consueverunt.

Iam plus quinque annis cum Puppet laboravi. Hic textus essentialiter est translatus et reordinatus compilatio cardinis ex documentis officialibus, quae incipientibus permittit ut celeriter essentiam Puppis intellegamus.

Introductio ad PUPUS

basic notitia

Pupula operandi ratio clientis-servatoris est, quamquam etiam operationem servoless cum functione limitata sustinet.

Exemplar trahere operandi adhibetur: ex defalta, semel in media hora, clientes servo pro configuratione tangunt et applicant. Si cum Ansible laboraverunt, exemplo dis alio utuntur: administrator processum applicandi configurationem inchoat, ipsi clientes nihil applicant.

In communicationis retis, duo-modo TLS encryption adhibetur: minister et client proprias habent claves privatas et testimoniales correspondentes. De more servo provenit testimoniales pro clientibus, sed in principio potest externa CA uti.

Introductio ad manifestos

In PUPUS terminology ad pupa server connect lymphaticorum (nodis). Configuratio pro nodis scriptum est in manifestos in lingua programmandi speciali - Puppet DSL.

Pupa DSL lingua declarativa est. Desideratum nodi statum describit forma declarationum singularum facultatum, v.gr.

  • Tabella exstat et certas res habet.
  • In sarcina installatur.
  • Ministerium incepit.

Facultates coniungi possunt:

  • Sunt clientelae, afficiunt ordinem quo facultates adhibentur.
    Exempli gratia, "primum sarcinam inaugurare, deinde limam configurationem recensere, deinde servitium committitur."
  • Adsunt notificationes - si auxilium mutatum est, notificationes emittit opibus sibi subscriptis.
    Exempli gratia, si configuration file mutatur, statim servitium sileo potes.

Praeterea PUPUS DSL functiones et variabiles habet, tum constitutiones conditionales et selectores. Variae machinationes templantes etiam sustentantur - EPP et ERB.

Pupa in Ruby scripta est, tot constructa et vocabula inde desumpta. Ruby te permittit ut Puppam expandas - logicam complexam adde, novas facultates rationes, munera.

Dum Pupa currit, manifestat unicuique nodi specifici in calculonis in indicem compilatis. Directory elenchus facultatum earumque relationum post computationem pretii functionum, variabilium et dilatationis constitutionum conditionalium.

Syntaxis et codestyle

Hic sunt sectiones documentorum officialium quae syntaxin intelligas adiuvabunt, si exempla non sufficiunt;

Hic est exemplum quod manifesto simile est;

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

Incisum et rumpit linea non requiritur pars manifesta, sed commendatur dux style. Summarium:

  • Duo-spatii indents, tabs non adhibita sunt.
  • Bracteae crispae spatio separantur, colons spatio non separantur.
  • Commata post singulas modulos, inter ultimam. Quisque parameter in linea separata est. Exceptio fit sine parametris et uno parametro: scribere potes in una linea et sine commate (i.e. resource { 'title': } и resource { 'title': param => value }).
  • Sagittis in laoreet condimentum ut at id massa.
  • Resource relationis sagittae ante eas scriptae sunt.

Locum files in pappetserver

Ad ulteriorem explicationem notionem "presul radicis" inducam. Radix directorium est directorium quod configurationem PUPUS pro certo nodi continet.

Radix directorium variat secundum versionem PUPUS et ambitus usus. Ambitus sunt independens copiae configurationis quae in directoriis separatis reponuntur. Solet in compositione cum git, in quo casu fiunt e ramis git ambitus. Ideoque quaelibet nodi in uno vel altero ambitu sita est. Id configurari potest in ipsa nodo, seu in ENC, de quo in sequenti articulo dicemus.

  • In tertia versione ("Puppet vetus") directorium basis erat /etc/puppet. Usus ambitus ad libitum est - exempli gratia, cum veteri Puppete illis non utimur. Si ambitus adhibentur, eae plerumque conditae sunt /etc/puppet/environmentsdirectorium radix erit directorium ambitus. Si ambitus usus non sunt, directorium radix basi directorium erit.
  • Incipiens a quarta versione ("new Puppet"), usus ambitus nuncius factus est, ac basis directorium permotum est. /etc/puppetlabs/code. Proinde ambitus in fl /etc/puppetlabs/code/environments, directorium radix est directorium environment.

Subdirectorium debet esse in radice directorium manifestsquae unam vel plures nodos describit. Praeterea subdirectorium habeatur modulesquae continet modulos. Modulos quos paulo post dicam. Praeterea, vetus Pupulum etiam subdirectorium habere potest filesquae varias tabulas continet quas ad nodos imitamur. In novo Puppe, omnes fasciculi in modulis ponuntur.

Manifestum files habent extensionem .pp.

A duobus certaminis exempla

Description of the nodi and resource in it

In nodi server1.testdomain lima sit creatus est /etc/issue cum contentus Debian GNU/Linux n l. Tabella possideri debet ab usuario et coetu root, accessum ius debet esse 644.

Manifesto scribimus:

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

Relationes inter facultates in nodi

In nodi server2.testdomain nginx currere debet, cum configuratione praeparata antea laborat.

Sit scriptor problema dissolutum;

  • In sarcina debet installed nginx.
  • Necesse est ut limae configurationis exscribantur e servo.
  • Ministerium debet esse cursus nginx.
  • Si conformatio renovata est, servitium reprimendum est.

Manifesto scribimus:

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

Ad hoc opus, proxime sequens fasciculi locus in pupilla servo debes:

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

Resource Genera

Plenum album subsidii subsidiorum genera hic inveniri possunt in documentishic quinque figuras fundamentales describam, quae in usu meo satis sunt ad solvendas maximas difficultates.

file

Administrat lima, directoria, symlinka, earum contenta et iuribus accessum.

options:

  • resource nomen eius - iter ad tabella (libitum)
  • semita - tabella ad iter (si non sit certa in nomine)
  • ensure - fasciculi genus:
    • absent - lima delere
    • present - fasciculus cuiuslibet generis erit (si fasciculus desit, fasciculus ordinarius creabitur)
    • file - file regularis
    • directory - presul
    • link - symlink
  • content - file contentis (nisi ad regulares files idoneos, simul adhiberi non possunt principium aut scopum)
  • principium - nexum ad viam ex qua documenta contenta imitari vis (non possunt simul cum " content aut scopum). Determinari potest ut vel URI cum consilio puppet: (inde lima ex servo puppa adhibebitur), et cum consilio http: (spero quid in hac causa futurum sit), et etiam cum schemate file: vel ut via absoluta sine schemate (tunc tabella locali FS in nodo adhibebitur)
  • scopum - ubi symlink designet (non possunt simul cum content aut principium)
  • dominus - in user qui debet habere tabella
  • Group - in coetus cui tabella debet convenire
  • modum - file permissiones (sicut filum)
  • recurse - dat recursive Directory processus
  • deiectionem - lima dat deleting quae in PUPUS non sunt descripta
  • vi, - dat delendo directoriis qui in Puppet non descripti sunt

sarcina

Installsway fasciculos tollit. Potest tractamus notificationes - restituo in sarcina si modulus sit certa reinstall_on_refresh.

options:

  • resource nomen eius - sarcina nomen (libitum)
  • nomine - sarcina nomen (nisi certa in nomine)
  • provisor - sarcina procurator ad usum
  • ensure - desideravit sarcina status:
    • present, installed - si versionem installed
    • latest - tardus poema installed
    • absent - delevit (apt-get remove)
    • purged - una cum configuratione files delevit (apt-get purge)
    • held - versio sarcina clausa est (apt-mark hold)
    • любая другая строка - ex certa version est installed
  • reinstall_on_refresh - si truedein recepta notificationi sarcina restituetur. Utilis ad distributiones fontium substructas, ubi fasciculi reficiendi necessarii sunt, quando ambitum mutando fabricant. Default false.

obsequium

Officia procurat. Potest processus notificationes - sileo servitium.

options:

  • resource nomen eius - officium administrari (libitum)
  • nomine - ministerium quod tractari debet (nisi in nomine certa)
  • ensure - status officii desideravit:
    • running - launched
    • stopped - substitit
  • enable - controls ad officium satus facultatem:
    • true - autorun possit (systemctl enable)
    • mask - fucatus (systemctl mask)
    • false - autorun is disabled (systemctl disable)
  • sileo - mandatum ut sileo in ministerium
  • Status - mandatum ut reprehendo servitium status
  • hasrestart — indicamus num religio initscript subsidia restarting. Si false et modulus specificatur sileo — valor parametri huius adhibetur. Si false et parametri sileo not specified - the service is subsisto and started to sileo (sed systemd uses the command systemctl restart).
  • hasstatus - num officium initscript sustinet mandatum status. si falseergo modulus valoris adhibetur Status. Default true.

exec

Fugit externa mandata. Si non parametri specificare creat,, tantum, nisi aut refrigeriumpraeceptum erit omne tempus Pupa curritur. Potest processus notificationes - mandatum decurrit.

options:

  • resource nomen eius - mandatum ad supplicium (libitum)
  • mandatum - mandatum exsecutioni mandari (si non sit certa in nomine)
  • semita - semitae in quibus expecto exsecutabile
  • tantum - si mandatum in hoc parametro determinatum cum codice nulla reditus confecto, mandatum principale exsecutioni mandabitur
  • nisi - si mandatum in hoc parametro determinatum cum codice non-nulla reditus confecto, mandatum principale exsecutioni mandabitur
  • creat, - si tabella in hoc parametro determinata non est, mandatum principale exsecutioni mandabitur
  • refrigerium - si truetunc tantum praeceptum currere erit, cum hoc exec notitiam ab aliis facultatibus acceperit
  • cwd - Directory unde currere imperium
  • Disputatio - ad user a quo currere imperium
  • provisor — quomodo currere iubes;
    • posix - puer processus simpliciter creatus est, certus ut specificare semita
    • testa - mandatum est in concha immissa /bin/sh, Non potest certa semita, uti potes globulos, tibias et alia concharum lineamenta. Plerumque deprehenditur automatice si quae sunt specialia ingenia (|, ;, &&, || etc).

cron

Imperium cronjobs.

options:

  • resource nomen eius - sicut quaedam identifier
  • ensure - crownjob statum:
    • present - partum, si non est
    • absent - delete si existat
  • mandatum - Quid iubes currere?
  • environment - in quibus ambitus praeciperet currere (inscriptio variabilium variabilium et valores eorum =)
  • Disputatio - unde usor currere imperium
  • momentum, hora, Canticum Benedictus, mensis, mensis dies — cum currere cron. Si quid horum attributorum non specificatur, valor in crontab erit *.

In PUPUS 6.0 cron tamquam remota a buxum in autocineto, ideo nulla documenta in communi situ est. At ille in arca in agente puppa, ideo non opus est ut separatim instituatur. Potes videre documenta pro eo in documentis pro quinta versione PUPUSuel in GitHub.

De opibus in genere

Requisita ad resource singularitatem

Communis error invenimus est Effingo declarationem. Hic error incidit cum duae pluresve facultates eiusdem generis cum eodem nomine in indice apparent.

quare iterum scribam; manifestat, ne eadem nodi copia eiusdem generis eodem titulo contineantur!

Interdum opus est eodem nomine fasciculos instituere, sed cum diversis actoribus involucris. In hoc casu modulo uti debes nameerrorem vitare;

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

Aliae formae resource similes optiones habent ad duplicationem vitandam adiuvandam name у obsequium, command у exec, et sic porro.

Metaparameters

Unicuique facultatis genus aliquos ambitus speciales habet, cuiuscumque naturae est.

Plenus index meta parametri in PUPUS documenta.

Brevis index:

  • require — hic modulus indicat ex quibus opibus haec subsidia pendent.
  • ante - Hic modulus designat quae facultates ab hac subsidio pendent.
  • scribet — hic modulus designat ex quo subsidia haec subsidia notificationes accipit.
  • certiorem — Hic modulus designat quae facultates notificationes ab hac subsidio accipiunt.

Omnes metaparametri enumerantur vel unam recipiunt nexum resource vel nexum ordinatam in uncis quadratis.

Te ducet opibus

Subsidium nexus simpliciter est mentio subsidii. Maxime ad indicant clientelas. Replicacio resource non-existentis compilationem erroris causabit.

Syntaxis nexus haec est: genus resource cum littera capitali (si genus nomen continet duplices colonias, tum unaquaeque pars nominis inter colonos capitalised est), tum reso nomine in uncis quadratis (casus nominis non mutatur!). Spatia nulla sint, brackets quadratae statim a specie scriptae sunt nomine.

exempli gratia:

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

Clientelae et notificationes

Litterarum hic.

Simplicia dependentiae inter facultates, ut dictum est, sunt transitivae. Obiter observa cum dependentia additis - clientelas cyclicas creare potes, quae errorem compilationem causabunt.

Secus dependentiae, notificationes non sunt transitivae. Praecepta sequentia applicare ad notificationes:

  • Si notitiam accipit resource, renovatur. In update actiones pendent in resource genus exec decurrit mandatum; obsequium restarts in servitutem; sarcina sarcina restituat. Si subsidia renovationem actionem definitam non habent, nihil fit.
  • In uno Puppet curriculo, subsidium non plus quam semel renovatur. Hoc fieri potest quia notificationes includunt clientelas et graphi dependentiam cyclos non continent.
  • Si Puppet statum subsidii mutat, subsidium notificationes mittit omnibus facultatibus subscriptis.
  • Si subsidium renovatur, notificationes omnibus facultatibus subscriptis emittit.

Tractantem parametri non specificatae

Pro regula, si modulus alicuius subsidii valorem defaltam non habet et hic modulus in manifesto non specificatur, Pupa hanc possessionem pro subsidio nodi respondentis non commutabit. Exempli gratia, si copia generis file modularis non certa ownerPUPUS ergo dominum tabulae debitae non mutabit.

Introductio ad classes, variabiles et definitiones

Plures nodos habeamus qui eandem figurae partem habent, sed sunt etiam differentiae — aliter omnes in uno trunco ​​potuimus describere. node {}. Certe partes identicae figurationis simpliciter imitari potes, sed in generali solutione mala haec est - conformatio crescit, et si partem generalem configurationis mutaveris, eandem rem pluribus in locis recensere debebis. Eodem tempore, facile est errare, et in genere, ARIDUM (teipsum non repeto) principium rationis inventum est.

Ad hanc solvendam quaestionem talis est intentio class.

classes

Класс obstructionum de poppet codice nominatur. Classes ad reuse codice opus sunt.

Primum genus describendum est. Nullas usquam copiarum ipsa descriptio addit. Classis manifestat perscripta;

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

Post hoc genus adhiberi potest;

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

Exemplum e praecedente munere - institutionem et configurationem nginx moveamus in genus:

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
}

variables

Classis a exemplo praecedenti flexibilis omnino non est, quia semper eandem nginx conformationem affert. Iter faciamus ad lineam variam, tum hoc genus ad institutionem nginx cum quavis configuratione adhiberi potest.

Fieri potest per variables.

Operam: variabiles in puppe immutabiles sunt!

Praeterea, variabilis accessio tantum potest postquam declaratum est, alioquin valor variabilis erit undef.

Exemplum operandi cum variabilibus:

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

Puppet has spatiis nominalibusac variabiles, itaq area visibilis: Varium cum eodem nomine in diversis nominibus definiri potest. Cum solvendo valorem variabilis, variabilis in spatio nominali currenti exquiritur, deinde in spatio nomina claudendo, et sic porro.

Exempla spatiorum nominalia:

  • global - variabiles extra genus vel nodi descriptionem ibi ingrediuntur;
  • nodi spatiorum in nodi descriptione;
  • classis spatii in classe descriptio.

Ambiguitatem vitare cum variabilis accessus, spatium nominandi in nomine variabili notare potes:

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

Conveniant ad nginx configurationis iter in variabili jacere $nginx_conf_source. Tum genus hoc sic erit:

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
}

Sed hoc exemplum malum est, quia est aliqua "cognitio secreta", quae alicubi intra genus variabile cum tali et tali nomine ponitur. Multo rectius est hanc cognitionem generalem efficere - classes parametros habere possunt.

Classis parametri In spatio nominali classium variabiles sunt, in capite classi specificatae sunt ac sicut variabiles regulares in corpore classis adhiberi possunt. Valores parametri specificantur, cum classis in manifesto utens.

Modulus apponi potest ad valorem defaltam. Si modulus valorem defaltam non habet nec valor usus est constitutus, errorem compilationem causabit.

Parameterizare genus ex exemplo supra et duos parametros adde: prima, requiritur via ad configurationem, et altera ad libitum est nomen sarcinae cum nginx (in Debian, v. gr. sunt fasciculi. 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',   # задаём параметры класса точно так же, как параметры для других ресурсов
  }
}

In Puppe, variabiles typus sunt. Eat multa genera notitia. Data genera typice usi sunt ad valores parametri convalidandos in classes ac definitiones transierunt. Si modulus praeteritus definiti generis non congruit, compilatio error erit.

Typum statim ante modulum nominis scriptum est;

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

Classes: includere nobis genus classname{'classname':}

Quisque genus est genus resource genus. Cum quovis alio genere subsidii, duae instantiae ejusdem generis in eadem nodo esse non possunt.

Si velis addere genere eodem nodi bis utendi class { 'classname':} compilatio erroris erit (nulla differentia cum parametris diversis vel identicis) compilatio. Sed si genere uteris in stylo opum, statim explicite omnia eius ambitum in manifesto expones.

Sed si uteris includetum genus toties quot desideratur addi potest. Factum est include idempotens est munus, quod inhibet num classis in indicem adiecta sit. Si genus non est in indice, nihil addit, et si iam est, nihil agit. Sed si usus include parametri genus in declaratione classium constituere non potes - parametri omnes requisiti in fonte data externa constituantur - Hiera vel ENC. De illis in proximo articulo loquemur.

definit

Ut in priore trunco, eadem classis nodo plus quam semel adesse non potest. In quibusdam tamen casibus debes eodem codice trunco ​​uti cum parametris diversis in eadem nodo uti. Id est, opus est opis propriae speciei.

Exempli gratia, ad moduli PHP instituendam, sequentia facimus in Avito:

  1. Instrue sarcinam huius moduli.
  2. Configurationem faciamus fasciculi huius moduli.
  3. Symlink to config pro php-fpm creamus.
  4. Symlink to the aboutconfig pro php creamus cli.

In eiusmodi casu consilium ut definire (definire, definitum genus, definitum resource genus). Definitio est similis generi, sed sunt differentiae: primum, quodlibet Define est genus resource, non opis; secundo, quaelibet definitio habet modulum implicitum $titleubi eopiae nomen it cum declaratur. Quemadmodum in generibus, primum definienda est definitio, post quae adhiberi potest.

Simplex exemplum cum moduli ad 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' }
}

Error in Definitione duplicatam declarationem capiendi facillimus modus est. Hoc fit, si definitio nomine constanti subsidium habet, et sunt duae vel plures instantiae huius definitionis in aliqua nodo.

Facile est ex hoc te tueri: omnes facultates intra definitionem nomen habere debent $title. Vel est idempotens additio facultatum: in simplicissimo, satis est communium omnium instantiarum definitionis movere in genus separatum, et includere hoc genus in definitione functionis. include idempotent.

Sunt alii modi ad idempotentiam consequendam cum facultates addendo, nempe functionibus utens defined и ensure_resourcessed in proximo eventu narrabo tibi.

Dependentiae et notificationes classes ac definitiones

Classes et definitiones quae sequuntur addunt regulas de dependentiis et notificationibus tractandis:

  • dependentency on a class/define adds dependentities on all resources of the class/define ;
  • genus/define dependency adiungit dependentias omnibus class/definiendis opibus;
  • class/definire notificationes notificat omnes facultates classium/definire;
  • subscriptio classis/definitiva omnibus subsidiis classium/definiendis subscribit.

Conditionalis constitutiones et selectores

Litterarum hic.

if

Hic simplex est:

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

nisi

nisi sit e contrario: truncus codicis exsecutioni mandabitur si dictio falsa est.

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

apud

Nulla sit amet interdum neque. Valoribus regularibus (chordis, numeris, etc.), expressionibus regularibus uti potes, ac notatis rationibus ut valores.

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

Selectors

A lego linguae constructio similis est casesed pro trunco ​​faciendo, valorem redit.

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

modules

Cum parva figura est, facile in uno manifesto servari potest. Sed quanto magis figurationes describimus, eo plura genera ac nodos in manifesto sunt, crescit, et labori inconveniens fit.

Praeterea quaestio codicis reuse — cum totus in uno codice manifestus sit, difficile est hunc codicem cum aliis communicare. Ad has duas difficultates solvendas, PUPUS res modulorum dictae habet.

modules - Hae sunt classes, definitiones et alia pupa entia in separato directorio posita. Id est, modulus logicae PUPUS sui iuris est. Exempli gratia, modulus sit operandi cum nginx, et continebit quid et solum opus est ad operandum cum nginx, vel modulus ad operandum cum PHP, et sic porro.

Moduli versiones sunt, et dependentiae modulorum inter se confirmantur. Est repositio aperta modulorum - PUPUS Forge.

In calculonis servi, moduli in modulorum subdirectoriae radicis directorii locantur. Singulis modulis in medio exstat norma directorii schema - manifestat, lima, templates, lib et cetera.

File structuram in moduli

Radix moduli potest continere directoria sequentia cum nominibus descriptivis:

  • manifests - continet manifestos
  • files - continet files
  • templates - continet template
  • lib - continet Ruby codice

Hoc indicem completum directorium et imaginum non est, sed pro hoc articulo nunc satis est.

Nomina opum et nomina imaginum in modulo

Litterarum hic.

Facultates (classes, definitiones) in modulo nominari non possunt quidquid libet. Praeterea recta correspondentia est inter nomen subsidii et nomen tabellae in qua Puppet descriptionem illius subsidii quaeret. Si regulas nominationis violas, PUPUS tunc simpliciter non reperies descriptionem subsidii et errorem compilationem habebis.

Praecepta simplicia sunt;

  • Omnes facultates in modulo debent esse in moduli spatio nominali. Si modulus dicitur footunc omnes facultates in ea nominandae sunt foo::<anything>, vel iustus foo.
  • Subsidium cum nomine moduli debet esse in tabella init.pp.
  • Ad alias facultates, tabella nominationis talis est:
    • praeposita cum modulus nomen absumitur
    • omnes columellae duplices, siqua sunt, reponuntur cum virgulis
    • extensio additur .pp

Demonstrabo exemplo. Ego dicam moduli scribo nginx. Continet sequentes facultates;

  • class nginx descriptus est in manifesto init.pp;
  • class nginx::service descriptus est in manifesto service.pp;
  • definire nginx::server descriptus est in manifesto server.pp;
  • definire nginx::server::location descriptus est in manifesto server/location.pp.

Templates

Certe tu ipse scis cuius exempla sint, ea hic non singillatim describere. Sed tantum in casu relinquam illam link to Wikipedia.

Formulae uti: Formulae significatio usus functionis dilatetur templateque iter ad template. Nam generis opibus file usus una cum parametri content. Exempli gratia;

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

Visum iter <modulename>/<filename> importat file <rootdir>/modules/<modulename>/templates/<filename>.

Praeterea, munus est inline_template — textum Formularium accipit ut input, non tabella nomen.

Intra template, omnes puppea variabilium in scopo currenti uti potes.

PUPUS subsidia templates in ERB et EPP format:

Breviter de ERB

Imperium structurae:

  • <%= ВЫРАЖЕНИЕ %> - inserere de valore locutionis
  • <% ВЫРАЖЕНИЕ %> - calculare expressionis valorem (sine inserendo). Conditionales constitutiones (si) et loramenta (quisque) huc ire solent.
  • <%# КОММЕНТАРИЙ %>

Expressiones in ERB scriptae sunt in Ruby (ERB actu Embedded Ruby).

Variabiles ex manifestis accedere, addere debes @ ad nomen variabile. Ad lineam confractionem removendam quae post constructum imperium apparet, opus est uti clausula -%>.

Exemplum usus Formula

Dicamus me modulum scribere ad ZooKeeper moderandum. Classis responsabilis ad config creandi aliquid simile hoc spectat:

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

Et de correspondente template zoo.cfg.erb — Sic;

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

Res et inaedificata Variabiles

Saepe certa pars configurationis dependet ab iis quae in nodo nunc fiunt. Exempli gratia, secundum quod Debian emissio est, debes versionem sarcinae unam vel aliam instituere. Monere omnia haec manually potes, rescribo manifestat si nodi mutatione. Sed hoc non est gravis adventus, multo melius automation.

Ad informationem de nodis habenda, PUPUS mechanismum habet facta dicta. facta - Haec notitia est de nodo, prompta in manifestat forma variabilium ordinariarum in spatio nominali globali. Exempli gratia, nomen exercitus, ratio versionis operandi, architectura processus, index utentium, index retis interfaces et inscriptiones eorum, et plus, multo plus. Res praesto sunt in manifestis et templates sicut variabiles regulares.

Exemplum operandi cum factis;

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

Formentaliter factum nomen habet et valorem (varia genera in promptu sunt: ​​chorda, vestitus, dictionaria). Eat set constructum in re. Potes etiam tua scribere. Hoc collectores describuntur sicut munera in Rubyaut quod exsecutabile files. Res etiam in forma sisti possunt text lima cum notitia in nodis.

Durante operatione, agens puppea prima exemplaria omnia prompta facta collectores a pappetre ad nodo mittunt, deinde eos immittit et facta collecta ministranti mittit; Post hoc catalogum congero incipit cultor.

Facta in forma exsecutabile

Haec in modulis in indicem posita sunt facts.d. Scilicet, lima exsecutabile esse debet. Cum currunt, informationes ponere debent ad output vexillum vel YAML vel key=valorem format.

Noli oblivisci facta esse applicabilia ad omnes nodos, qui a servo poppeto reguntur, ad quos modulus tuus explicatur. Itaque, in scripto, cura ut inspicias omnia curricula et fasciculos necessaria pro facto tuo ad operandum systema habere.

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

Ruby facts

Haec in modulis in indicem posita sunt 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

Textus facts

Haec facta in nodis in indicem posita sunt /etc/facter/facts.d in antiquis PUPUS vel /etc/puppetlabs/facts.d in the new Puppet.

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

Questus est Rerum

Dupliciter ad conjecturam accedo;

  • per dictionary $facts: $facts['fqdn'];
  • per hoc nomen ut variabilis nomen; $fqdn.

Est optimum uti in dictionary $factsvel melius, indica spatium spatii globalis ($::facts).

Huc pertinet documentorum pars.

Inaedificata Variabiles

Praeter haec est etiam quidam variables, praesto in spatio nominali globali.

  • confidebat facts - variabiles, quae e libello huius sumuntur (cum testimonium plerumque editur in servo poppeto, procurator non potest tantum suum libellum accipere ac mutare, ideo variabiles sunt "confidunt"): nomen testimonium, nomen. hospes et dominium, extensiones a certificatorio.
  • server facts - variabiles ad informationes pertinentes de calculonis servi-versionis, nominis, servientis IP inscriptionis, ambitus.
  • agente facts - variabiles directe additae a agente autocineto, non per factorem - nomen certificatorium, versio agentis, versio pupa.
  • dominus variables — Pappetmaster variabilium (sic!). Est fere idem quod in server facts, plus configuratione valorum parametri in promptu sunt.
  • compilator variables - variabilis compilator, qui in utroque ambitu differunt: nomen moduli hodierni et nomen moduli in quo obiectum praesens accessum est. Adhiberi possunt, exempli gratia, ad reprimendam classes privatas tuas non ab aliis modulis directe usurpari.

Additio 1: quomodo haec omnia currunt et debug?

Articulus multa exempla puppetalis codicis habuit, sed omnino quomodo hunc codicem currere non indicavit. Bene, ego me corrigo.

Satis agentis ad Puppam currere, sed pluribus in casibus opus est etiam servo.

agente

Saltem post versionem V, puppa agentis packages e officialis Puppetlabs repositio omnes clientelas (ruby et gemmis respondentes continent), ideo nullae sunt difficultates installationis (de Debian-based distributionibus loquor - distributionibus RPM-fundatis non utimur).

In casu simplicissimo, ut configuratione mollia, satis est procuratorem in modum servo mittere: dummodo puppa codicem nodi transscribat, deducendum. 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

Praestat sane ut ministros et ministros currendo in nodis in daemonio modo constituas - tunc semel in media hora adhibebunt configurationem a servo receptam.

Potes imitari impulsum operis exemplar - ad nodi quem interest et incipit sudo puppet agent -t. Clavis -t (--test) plures optiones actualiter includit quae singulariter fieri possunt. Hae optiones quae sequuntur includunt:

  • in daemonem modum non currunt (per default agentis incipit in daemone modus);
  • inclusum post applicationem cathalogum (per defectum agentis operari pergat et lineam semihoram semel apponat);
  • scribere singula opus iniuriarum;
  • ostendam mutationes in files.

Agens habet modum operantem sine mutationibus - eo uti potes, cum certum non es quod rectam configurationem scripseris et vis inspicias quidnam agentis in operatione mutet. Hoc modus est enabled per modulum --noop in order versus; sudo puppet agent -t --noop.

Praeterea potes efficere debugging index operis - in eo, puppea scribit de omnibus actionibus quae exercet: de subsidio quod nunc est processus, de parametris subsidii huius, de quibus programmata movet. Scilicet hoc est modulus --debug.

servo

Non expendam plenam chartaceorum copiam et codicem ei in hoc articulo explicandi, dicam tantum ex archa versionem esse plene functionis servientis quae non requirit additam conformationem ad operandum cum paucitate numerorum. nodis (dic, usque ad centum). Maior numerus nodis incedit - per defaltam, puppetarius non plus quam quattuor operarios immittit, ad maiorem observantiam numerum augere debes et limites memoriae augere non oblivisceris, alioquin plus temporis ex servo purgamentum colliget.

Codicis instruere - si cito ac facile opus sit, vide (ad r10k)[https://github.com/puppetlabs/r10k], pro parvas officinas satis esse debet.

Addendum 2: Coding Guidelines

  1. Pone omnem logicam in generibus et definitionibus.
  2. Classes et definitiones in modulis habeto, non in notis manifestis describendis.
  3. factis utere.
  4. Noli facere ifs hostnames fundatur.
  5. Libenter placet parametros addere pro generibus et definitionibus - hoc melius est quam logica implicita in corpore classis/definire abscondita.

Cur hoc in sequenti articulo facere commendem, exponam.

conclusio,

Cum introductione finiamus. In sequenti articulo dicam tibi de Hiera, ENC et PuppetDB.

Tantum usores descripserunt in aliquet participare possunt. InscribeTe gratissimum esse.

Re vera, multo magis materia est - scribere possum articulos in sequentibus locis, suffragium de quo velis legere de eo:

  • 59,1%Provecta puppa construit - stercore quodam proximo-gradu: ansas, mapping et aliae expressiones lambdae, collectorum copiarum, facultates exportatae et communicationis interexercitus per Puppet, tags, provisores, data abstracta typis.13
  • 31,8%"Admin matris meae sum" aut quomodo nos in Avito amicos fecimus cum pluribus poppetibus diversarum versionum, et, in principio, partem de ministrando poppeto servo.7
  • 81,8%Quomodo scribimus codicem pupam: instrumentationem, documenta, probationem, CI/CD.18

22 utentes censuerunt. 9 Utentes abstinuerunt.

Source: www.habr.com