Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Puppet

Puppet β€” это систСма управлСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ. Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ хостов ΠΊ Π½ΡƒΠΆΠ½ΠΎΠΌΡƒ ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ ΠΈ поддСрТания этого состояния.

Π― Ρ€Π°Π±ΠΎΡ‚Π°ΡŽ с Puppet ΡƒΠΆΠ΅ большС пяти Π»Π΅Ρ‚. Π­Ρ‚ΠΎΡ‚ тСкст β€” ΠΏΠΎ ΡΡƒΡ‚ΠΈ пСрСвСдённая ΠΈ пСрСупорядочСнная компиляция ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈΠ· ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, которая ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°ΠΌ быстро Π²Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π² ΡΡƒΡ‚ΡŒ Puppet.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Puppet

Базовая информация

Π‘Ρ…Π΅ΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ Puppet β€” ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрная, хотя поддСрТиваСтся ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π±Π΅Π· ΡΠ΅Ρ€Π²Π΅Ρ€Π° с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ pull-модСль Ρ€Π°Π±ΠΎΡ‚Ρ‹: ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π· Π² ΠΏΠΎΠ»Ρ‡Π°ΡΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΊ ΡΠ΅Ρ€Π²Π΅Ρ€Ρƒ Π·Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ Π΅Ρ‘. Если Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ с Ansible, Ρ‚ΠΎ Ρ‚Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ другая, push-модСль: администратор ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΠ΅Ρ‚ процСсс примСнСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, сами ΠΏΠΎ ΡΠ΅Π±Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚.

ΠŸΡ€ΠΈ сСтСвом взаимодСйствии ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ двустороннСС TLS-ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅: Ρƒ ΡΠ΅Ρ€Π²Π΅Ρ€Π° ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π΅ΡΡ‚ΡŒ свои Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΠΌ сСртификаты. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ сСрвСр выпускаСт сСртификаты для ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², Π½ΠΎ Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ использованиС ΠΈ внСшнСго CA.

Знакомство с ΠΌΠ°Π½ΠΈΡ„Сстами

Π’ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Puppet ΠΊ ΠΏΠ°ΠΏΠΏΠ΅Ρ‚-сСрвСру ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π½ΠΎΠ΄Ρ‹ (nodes). ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ для Π½ΠΎΠ΄ ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ Π² ΠΌΠ°Π½ΠΈΡ„Сстах Π½Π° ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ языкС программирования β€” Puppet DSL.

Puppet DSL β€” Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ язык. На Π½Ρ‘ΠΌ описываСтся ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ΅ состояниС Π½ΠΎΠ΄Ρ‹ Π² Π²ΠΈΠ΄Π΅ объявлСния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… рСсурсов, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

  • Π€Π°ΠΉΠ» сущСствуСт, ΠΈ Ρƒ Π½Π΅Π³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ΅ содСрТимоС.
  • ΠŸΠ°ΠΊΠ΅Ρ‚ установлСн.
  • БСрвис Π·Π°ΠΏΡƒΡ‰Π΅Π½.

РСсурсы ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ взаимосвязаны:

  • Π•ΡΡ‚ΡŒ зависимости, ΠΎΠ½ΠΈ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° ΠΏΠΎΡ€ΡΠ΄ΠΎΠΊ примСнСния рСсурсов.
    НапримСр, «сначала установи ΠΏΠ°ΠΊΠ΅Ρ‚, Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠΏΡ€Π°Π²ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», послС этого запусти сСрвис».
  • Π•ΡΡ‚ΡŒ увСдомлСния β€” Ссли рСсурс измСнился, ΠΎΠ½ отправляСт увСдомлСния подписанным Π½Π° Π½Π΅Π³ΠΎ рСсурсам.
    НапримСр, Ссли измСняСтся ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΌΠΎΠΆΠ½ΠΎ автоматичСски ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ сСрвис.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² Puppet DSL Π΅ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ условныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ сСлСкторы. Π’Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΠΈ β€” EPP ΠΈ ERB.

Puppet написан Π½Π° Ruby, поэтому ΠΌΠ½ΠΎΠ³ΠΈΠ΅ конструкции ΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Ρ‹ взяты ΠΎΡ‚Ρ‚ΡƒΠ΄Π°. Ruby позволяСт Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ Puppet β€” Π΄ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ, Π½ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ рСсурсов, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’ΠΎ Π²Ρ€Π΅ΠΌΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Puppet манифСсты для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π½ΠΎΠ΄Ρ‹ Π½Π° ΡΠ΅Ρ€Π²Π΅Ρ€Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³. ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ β€” это список рСсурсов ΠΈ ΠΈΡ… взаимосвязСй послС вычислСния значСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ раскрытия условных ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ².

Бинтаксис ΠΈ кодстайл

Π’ΠΎΡ‚ Ρ€Π°Π·Π΄Π΅Π»Ρ‹ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с ΡΠΈΠ½Ρ‚аксисом, Ссли ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ нСдостаточно:

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ выглядит манифСст:

# ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΏΠΈΡˆΡƒΡ‚ΡΡ, ΠΊΠ°ΠΊ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π³Π΄Π΅, послС Ρ€Π΅ΡˆΡ‘Ρ‚ΠΊΠΈ.
#
# ОписаниС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½ΠΎΠ΄Ρ‹ начинаСтся с ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова node,
# Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт сСлСктор Π½ΠΎΠ΄Ρ‹ β€” хостнСйм (с Π΄ΠΎΠΌΠ΅Π½ΠΎΠΌ ΠΈΠ»ΠΈ Π±Π΅Π·)
# ΠΈΠ»ΠΈ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для хостнСймов, ΠΈΠ»ΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово default.
#
# ПослС этого Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобках описываСтся собствСнно конфигурация Π½ΠΎΠ΄Ρ‹.
#
# Одна ΠΈ Ρ‚Π° ΠΆΠ΅ Π½ΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ ΠΏΠΎΠ΄ нСсколько сСлСкторов. ΠŸΡ€ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚
# сСлСкторов написано Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΡ€ΠΎ синтаксис описания Π½ΠΎΠ΄.
node 'hostname', 'f.q.d.n', /regexp/ {
  # ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ ΠΏΠΎ сути являСтся пСрСчислСниСм рСсурсов ΠΈ ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².
  #
  # Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ рСсурса Π΅ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅.
  #
  # Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Π²ΡƒΡ… рСсурсов ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ названиями!
  #
  # ОписаниС рСсурса начинаСтся с Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ°. Π’ΠΈΠΏ ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ Π² Π½ΠΈΠΆΠ½Π΅ΠΌ рСгистрС.
  # ΠŸΡ€ΠΎ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ рСсурсов написано Π½ΠΈΠΆΠ΅.
  #
  # ПослС Ρ‚ΠΈΠΏΠ° Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобках ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ рСсурса, ΠΏΠΎΡ‚ΠΎΠΌ Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅,
  # дальшС ΠΈΠ΄Ρ‘Ρ‚ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ пСрСчислСниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² рСсурса ΠΈ ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.
  # ЗначСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· Ρ‚.Π½. hash rocket (=>).
  resource { 'title':
    param1 => value1,
    param2 => value2,
    param3 => value3,
  }
}

ΠžΡ‚ΡΡ‚ΡƒΠΏΡ‹ ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ строк Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ манифСста, ΠΎΠ΄Π½Π°ΠΊΠΎ Π΅ΡΡ‚ΡŒ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ style guide. ΠšΡ€Π°Ρ‚ΠΊΠΎΠ΅ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅:

  • Π”Π²ΡƒΡ…ΠΏΡ€ΠΎΠ±Π΅Π»ΡŒΠ½Ρ‹Π΅ отступы, Ρ‚Π°Π±Ρ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ.
  • Π€ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки ΠΎΡ‚Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠΌ, Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠΌ Π½Π΅ отдСляСтся.
  • ЗапятыС послС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Π² Ρ‚ΠΎΠΌ числС послСднСго. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ β€” Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ строкС. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ дСлаСтся для ΡΠ»ΡƒΡ‡Π°Ρ Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°: ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ строкС ΠΈ Π±Π΅Π· Π·Π°ΠΏΡΡ‚ΠΎΠΉ (Ρ‚.Π΅. resource { 'title': } ΠΈ resource { 'title': param => value }).
  • Π‘Ρ‚Ρ€Π΅Π»ΠΊΠΈ Ρƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅.
  • Π‘Ρ‚Ρ€Π΅Π»ΠΊΠΈ взаимосвязи рСсурсов ΠΏΠΈΡˆΡƒΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅Π΄ Π½ΠΈΠΌΠΈ.

РасполоТСниС Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π° паппСтсСрвСрС

Для Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΡ… объяснСний я Π²Π²Π΅Π΄Ρƒ понятиС «корнСвая дирСктория». ΠšΠΎΡ€Π½Π΅Π²Π°Ρ дирСктория β€” это дирСктория, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ находится Puppet-конфигурация для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π½ΠΎΠ΄Ρ‹.

ΠšΠΎΡ€Π½Π΅Π²Π°Ρ дирСктория различаСтся Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΠΈ ΠΎΡ‚ Π²Π΅Ρ€ΡΠΈΠΈ Puppet ΠΈ использования ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ. ΠžΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΡ β€” это нСзависимыС Π½Π°Π±ΠΎΡ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ хранятся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… дирСкториях. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²  ΡΠΎΡ‡Π΅Ρ‚Π°Π½ΠΈΠΈ с Π³ΠΈΡ‚ΠΎΠΌ, Π² Ρ‚Π°ΠΊΠΎΠΌ случаС окруТСния ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΈΠ· Π²Π΅Ρ‚ΠΎΠΊ Π³ΠΈΡ‚Π°. БоотвСтствСнно, каТдая Π½ΠΎΠ΄Π° находится Π² Ρ‚ΠΎΠΌ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ. Π­Ρ‚ΠΎ настраиваСтся Π½Π° ΡΠ°ΠΌΠΎΠΉ Π½ΠΎΠ΄Π΅, Π»ΠΈΠ±ΠΎ Π² ENC, ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ я расскаТу Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅.

  • Π’ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ вСрсии («старый ΠŸΠ°ΠΏΠΏΠ΅Ρ‚Β») Π±Π°Π·ΠΎΠ²ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ΅ΠΉ Π±Ρ‹Π»Π° /etc/puppet. ИспользованиС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ β€” ΠΌΡ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΡ… Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ со ΡΡ‚Π°Ρ€Ρ‹ΠΌ ΠŸΠ°ΠΏΠΏΠ΅Ρ‚ΠΎΠΌ. Если окруТСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ хранятся Π² /etc/puppet/environments, ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ΅ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ дирСктория окруТСния. Если окруТСния Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ΅ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ базовая.
  • Начиная с Ρ‡Π΅Ρ‚Π²Ρ‘Ρ€Ρ‚ΠΎΠΉ вСрсии (Β«Π½ΠΎΠ²Ρ‹ΠΉ ΠŸΠ°ΠΏΠΏΠ΅Ρ‚Β») использованиС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ стало ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, Π° Π±Π°Π·ΠΎΠ²ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ пСрСнСсли Π² /etc/puppetlabs/code. БоотвСтствСнно, окруТСния хранятся Π² /etc/puppetlabs/code/environments, корнСвая дирСктория β€” дирСктория окруТСния.

Π’ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ поддирСктория manifests, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π»Π΅ΠΆΠΈΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько манифСстов с ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ Π½ΠΎΠ΄. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‚Π°ΠΌ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ поддирСктория modules, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π»Π΅ΠΆΠ°Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, я расскаТу Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² ΡΡ‚Π°Ρ€ΠΎΠΌ ΠŸΠ°ΠΏΠΏΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ поддирСктория files, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π»Π΅ΠΆΠ°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ Π½Π° Π½ΠΎΠ΄Ρ‹. Π’ Π½ΠΎΠ²ΠΎΠΌ ΠŸΠ°ΠΏΠΏΠ΅Ρ‚Π΅ ΠΆΠ΅ всС Ρ„Π°ΠΉΠ»Ρ‹ вынСсСны Π² ΠΌΠΎΠ΄ΡƒΠ»ΠΈ.

Π€Π°ΠΉΠ»Ρ‹ манифСстов ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ .pp.

ΠŸΠ°Ρ€Π° Π±ΠΎΠ΅Π²Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ²

ОписаниС Π½ΠΎΠ΄Ρ‹ ΠΈ рСсурса Π½Π° Π½Π΅ΠΉ

На Π½ΠΎΠ΄Π΅ server1.testdomain Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ создан Ρ„Π°ΠΉΠ» /etc/issue с ΡΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΡ‹ΠΌ Debian GNU/Linux n l. Π€Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΈ Π³Ρ€ΡƒΠΏΠΏΠ΅ root, ΠΏΡ€Π°Π²Π° доступа Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ 644.

ПишСм манифСст:

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 Π² Π½Π°Ρ‡Π°Π»Π΅ Π±ΡƒΠ΄Π΅Ρ‚ воспринято ΠΊΠ°ΠΊ записанноС Π² Π²ΠΎΡΡŒΠΌΠ΅Ρ€ΠΈΡ‡Π½ΠΎΠΉ систСмС, ΠΈ всё ΠΏΠΎΠΉΠ΄Ρ‘Ρ‚ Π½Π΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π·Π°Π΄ΡƒΠΌΠ°Π½ΠΎ
    }
}

Взаимосвязи рСсурсов Π½Π° Π½ΠΎΠ΄Π΅

На Π½ΠΎΠ΄Π΅ server2.testdomain Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½ nginx, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ с ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΉ Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ.

Π”Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Π·Π°Π΄Π°Ρ‡Ρƒ:

  • НуТно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π» установлСн ΠΏΠ°ΠΊΠ΅Ρ‚ nginx.
  • НуТно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»Π° скопированы ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ с ΡΠ΅Ρ€Π²Π΅Ρ€Π°.
  • НуТно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π» Π·Π°ΠΏΡƒΡ‰Π΅Π½ сСрвис nginx.
  • Π’ ΡΠ»ΡƒΡ‡Π°Π΅ обновлСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ сСрвис.

ПишСм манифСст:

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 ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅,
  # ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ сСрвис пСрСзапускаСтся.
}

Π§Ρ‚ΠΎΠ±Ρ‹ это Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ, Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ располоТСниС Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π° ΠΏΠ°ΠΏΠΏΠ΅Ρ‚-сСрвСрС:

/etc/puppetlabs/code/environments/production/ # (это для Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠŸΠ°ΠΏΠΏΠ΅Ρ‚Π°, для старого ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ΅ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ /etc/puppet)
β”œβ”€β”€ manifests/
β”‚   └── site.pp
└── modules/
    └── example/
        └── files/
            └── nginx-conf/
                β”œβ”€β”€ nginx.conf
                β”œβ”€β”€ mime.types
                └── conf.d/
                    └── some.conf

Π’ΠΈΠΏΡ‹ рСсурсов

ΠŸΠΎΠ»Π½Ρ‹ΠΉ список ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² рСсурсов находится Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, здСсь ΠΆΠ΅ я ΠΎΠΏΠΈΡˆΡƒ ΠΏΡΡ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π² ΠΌΠΎΠ΅ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π·Π°Π΄Π°Ρ‡.

file

УправляСт Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, дирСкториями, симлинками, ΠΈΡ… содСрТимым, ΠΏΡ€Π°Π²Π°ΠΌΠΈ доступа.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • Π½Π°Π·Π²Π°Π½ΠΈΠ΅ рСсурса β€” ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ)
  • path β€” ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ (Ссли ΠΎΠ½ Π½Π΅ Π·Π°Π΄Π°Π½ Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ)
  • ensure β€” Ρ‚ΠΈΠΏ Ρ„Π°ΠΉΠ»Π°:
    • absent β€” ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ»
    • present β€” Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» любого Ρ‚ΠΈΠΏΠ° (Ссли Ρ„Π°ΠΉΠ»Π° Π½Π΅Ρ‚ β€” Π±ΡƒΠ΄Π΅Ρ‚ создан ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»)
    • file β€” ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»
    • directory β€” дирСктория
    • link β€” симлинк
  • content β€” содСрТимоС Ρ„Π°ΠΉΠ»Π° (ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вмСстС с source ΠΈΠ»ΠΈ target)
  • source β€” ссылка Π½Π° ΠΏΡƒΡ‚ΡŒ, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ содСрТимоС Ρ„Π°ΠΉΠ»Π° (нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вмСстС с content ΠΈΠ»ΠΈ target). ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½Π° ΠΊΠ°ΠΊ Π² Π²ΠΈΠ΄Π΅ URI со ΡΡ…Π΅ΠΌΠΎΠΉ puppet: (Ρ‚ΠΎΠ³Π΄Π° Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ„Π°ΠΉΠ»Ρ‹ с ΠΏΠ°ΠΏΠΏΠ΅Ρ‚-сСрвСра), Ρ‚Π°ΠΊ ΠΈ со ΡΡ…Π΅ΠΌΠΎΠΉ http: (надСюсь, понятно, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π² ΡΡ‚ΠΎΠΌ случаС), ΠΈ Π΄Π°ΠΆΠ΅ со ΡΡ…Π΅ΠΌΠΎΠΉ file: ΠΈΠ»ΠΈ Π² Π²ΠΈΠ΄Π΅ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ Π±Π΅Π· ΡΡ…Π΅ΠΌΡ‹ (Ρ‚ΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ использован Ρ„Π°ΠΉΠ» с Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ Π€Π‘ Π½Π° Π½ΠΎΠ΄Π΅)
  • target β€” ΠΊΡƒΠ΄Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ симлинк (нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вмСстС с content ΠΈΠ»ΠΈ source)
  • owner β€” ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»
  • group β€” Π³Ρ€ΡƒΠΏΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»
  • mode β€” ΠΏΡ€Π°Π²Π° Π½Π° Ρ„Π°ΠΉΠ» (Π² Π²ΠΈΠ΄Π΅ строки)
  • recurse β€” Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ
  • purge β€” Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ описаны Π² Puppet
  • force β€” Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ описаны Π² Puppet

package

УстанавливаСт ΠΈ удаляСт ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹. Π£ΠΌΠ΅Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ увСдомлСния β€” пСрСустанавливаСт ΠΏΠ°ΠΊΠ΅Ρ‚, Ссли Π·Π°Π΄Π°Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ reinstall_on_refresh.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • Π½Π°Π·Π²Π°Π½ΠΈΠ΅ рСсурса β€” Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π° (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ)
  • name β€” Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π° (Ссли Π½Π΅ Π·Π°Π΄Π°Π½ΠΎ Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ)
  • provider β€” ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ
  • ensure β€” ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ΅ состояниС ΠΏΠ°ΠΊΠ΅Ρ‚Π°:
    • present, installed β€” установлСна любая вСрсия
    • latest β€” установлСна послСдняя вСрсия
    • absent β€” ΡƒΠ΄Π°Π»Ρ‘Π½ (apt-get remove)
    • purged β€” ΡƒΠ΄Π°Π»Ρ‘Π½ вмСстС с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ (apt-get purge)
    • held β€” вСрсия ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π° (apt-mark hold)
    • любая другая строка β€” установлСна указанная вСрсия
  • reinstall_on_refresh β€” Ссли true, Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ увСдомлСния ΠΏΠ°ΠΊΠ΅Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ пСрСустановлСн. ПолСзно для source-based дистрибутивов, Π³Π΄Π΅ пСрСсборка ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² сборки. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ false.

service

УправляСт сСрвисами. Π£ΠΌΠ΅Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ увСдомлСния β€” пСрСзапускаСт сСрвис.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • Π½Π°Π·Π²Π°Π½ΠΈΠ΅ рСсурса β€” сСрвис, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ)
  • name β€” сСрвис, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ (Ссли Π½Π΅ Π·Π°Π΄Π°Π½ΠΎ Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ)
  • ensure β€” ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ΅ состояниС сСрвиса:
    • running β€” Π·Π°ΠΏΡƒΡ‰Π΅Π½
    • stopped β€” остановлСн
  • enable β€” управляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ запуска сСрвиса:
    • true β€” Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ автозапуск (systemctl enable)
    • mask β€” замаскирован (systemctl mask)
    • false β€” Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ автозапуск (systemctl disable)
  • restart β€” ΠΊΠΎΠΌΠ°Π½Π΄Π° для ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊΠ° сСрвиса
  • status β€” ΠΊΠΎΠΌΠ°Π½Π΄Π° для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ статуса сСрвиса
  • hasrestart β€” ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π»ΠΈ инитскрипт сСрвиса пСрСзапуск. Если false ΠΈ ΡƒΠΊΠ°Π·Π°Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ restart β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Если false ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ restart Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ β€” сСрвис останавливаСтся ΠΈ запускаСтся для ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊΠ° (Π½ΠΎ Π² systemd ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° systemctl restart).
  • hasstatus β€” ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π»ΠΈ инитскрипт сСрвиса ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ status. Если false, Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° status. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ true.

exec

ЗапускаСт внСшниС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Если Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ creates, onlyif, unless ΠΈΠ»ΠΈ refreshonly, ΠΊΠΎΠΌΠ°Π½Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΡ€ΠΎΠ³ΠΎΠ½Π΅ ΠŸΠ°ΠΏΠΏΠ΅Ρ‚Π°. Π£ΠΌΠ΅Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ увСдомлСния β€” запускаСт ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • Π½Π°Π·Π²Π°Π½ΠΈΠ΅ рСсурса β€” ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ)
  • command β€” ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ (Ссли ΠΎΠ½Π° Π½Π΅ Π·Π°Π΄Π°Π½Π° Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ)
  • path β€” ΠΏΡƒΡ‚ΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡΠΊΠ°Ρ‚ΡŒ исполняСмый Ρ„Π°ΠΉΠ»
  • onlyif β€” Ссли указанная Π² ΡΡ‚ΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π°ΡΡŒ с Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°, основная ΠΊΠΎΠΌΠ°Π½Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°
  • unless β€” Ссли указанная Π² ΡΡ‚ΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π°ΡΡŒ с Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°, основная ΠΊΠΎΠΌΠ°Π½Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°
  • creates β€” Ссли ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π² ΡΡ‚ΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ Ρ„Π°ΠΉΠ» Π½Π΅ сущСствуСт, основная ΠΊΠΎΠΌΠ°Π½Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°
  • refreshonly β€” Ссли true, Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° этот exec ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… рСсурсов
  • cwd β€” дирСктория, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ
  • user β€” ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ
  • provider β€” с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‡Π΅Π³ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:
    • posix β€” просто создаётся Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс, ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ path
    • shell β€” ΠΊΠΎΠΌΠ°Π½Π΄Π° запускаСтся Π² ΡˆΠ΅Π»Π»Π΅ /bin/sh, ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ path, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³Π»ΠΎΠ±Π±ΠΈΠ½Π³, ΠΏΠ°ΠΉΠΏΡ‹ ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ Ρ„ΠΈΡ‡ΠΈ шСлла. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ опрСдСляСтся автоматичСски, Ссли Π΅ΡΡ‚ΡŒ всякиС спСцсимволы (|, ;, &&, || ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅).

cron

УправляСт ΠΊΡ€ΠΎΠ½Π΄ΠΆΠΎΠ±Π°ΠΌΠΈ.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • Π½Π°Π·Π²Π°Π½ΠΈΠ΅ рСсурса β€” просто ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€
  • ensure β€” состояниС ΠΊΡ€ΠΎΠ½Π΄ΠΆΠΎΠ±Π°:
    • present β€” ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ, Ссли Π½Π΅ сущСствуСт
    • absent β€” ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ, Ссли сущСствуСт
  • command β€” ΠΊΠ°ΠΊΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ
  • environment β€” Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ (список ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния ΠΈ ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‡Π΅Ρ€Π΅Π· =)
  • user β€” ΠΎΡ‚ ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ
  • minute, hour, weekday, month, monthday β€” ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΡ€ΠΎΠ½. Если ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΈΠ· ΡΡ‚ΠΈΡ… Π°Ρ‚Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π² ΠΊΡ€ΠΎΠ½Ρ‚Π°Π±Π΅ Π±ΡƒΠ΄Π΅Ρ‚ *.

Π’ Puppet 6.0 cron ΠΊΠ°ΠΊ Π±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΠ»ΠΈ ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ Π² puppetserver, поэтому Π½Π΅Ρ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π½Π° ΠΎΠ±Ρ‰Π΅ΠΌ сайтС. Но ΠΎΠ½ Π΅ΡΡ‚ΡŒ Π² ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ΅ Π² puppet-agent, поэтому ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ Π½Π°Π΄ΠΎ. Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠΎ Π½Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΊ ΠΏΡΡ‚ΠΎΠΉ вСрсии ΠŸΠ°ΠΏΠΏΠ΅Ρ‚Π°, Π»ΠΈΠ±ΠΎ Π½Π° Π“ΠΈΡ‚Ρ…Π°Π±Π΅.

ΠŸΡ€ΠΎ рСсурсы Π² ΠΎΠ±Ρ‰Π΅ΠΌ

ВрСбования ΠΊ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ рСсурсов

Бамая частая ошибка, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ встрСчаСмся β€” Duplicate declaration. Π­Ρ‚Π° ошибка Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π΄Π²Π° ΠΈ Π±ΠΎΠ»Π΅Π΅ рСсурса ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΅Ρ‰Ρ‘ Ρ€Π°Π· Π½Π°ΠΏΠΈΡˆΡƒ: Π² манифСстах для ΠΎΠ΄Π½ΠΎΠΉ Π½ΠΎΠ΄Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ рСсурсов ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ (title)!

Иногда Π΅ΡΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ, Π½ΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΌΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°ΠΌΠΈ. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ name, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ошибки:

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

Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠ°Ρ… рСсурсов Π΅ΡΡ‚ΡŒ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‰ΠΈΠ΅ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ, β€” name Ρƒ service, command Ρƒ exec, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

ΠœΠ΅Ρ‚Π°ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹

НСкоторыС ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π΅ΡΡ‚ΡŒ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° рСсурса, нСзависимо ΠΎΡ‚ Π΅Π³ΠΎ сущности.

ΠŸΠΎΠ»Π½Ρ‹ΠΉ список ΠΌΠ΅Ρ‚Π°ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Puppet.

ΠšΡ€Π°Ρ‚ΠΊΠΈΠΉ список:

  • require β€” Π² ΡΡ‚ΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ указываСтся, ΠΎΡ‚ ΠΊΠ°ΠΊΠΈΡ… рСсурсов зависит Π΄Π°Π½Π½Ρ‹ΠΉ рСсурс.
  • before β€” Π² ΡΡ‚ΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ указываСтся, ΠΊΠ°ΠΊΠΈΠ΅ рСсурсы зависят ΠΎΡ‚ Π΄Π°Π½Π½ΠΎΠ³ΠΎ рСсурса.
  • subscribe β€” Π² ΡΡ‚ΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ указываСтся, ΠΎΡ‚ ΠΊΠ°ΠΊΠΈΡ… рСсурсов ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ увСдомлСния Π΄Π°Π½Π½Ρ‹ΠΉ рСсурс.
  • notify β€” Π² ΡΡ‚ΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ указываСтся, ΠΊΠ°ΠΊΠΈΠ΅ рСсурсы ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ увСдомлСния ΠΎΡ‚ Π΄Π°Π½Π½ΠΎΠ³ΠΎ рСсурса.

ВсС пСрСчислСнныС ΠΌΠ΅Ρ‚Π°ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π»ΠΈΠ±ΠΎ ΠΎΠ΄Π½Ρƒ ссылку Π½Π° Ρ€Π΅ΡΡƒΡ€Ρ, Π»ΠΈΠ±ΠΎ массив ссылок Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобках.

Бсылки Π½Π° рСсурсы

Бсылка Π½Π° рСсурс β€” это просто ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠ΅ рСсурса. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΎΠ½ΠΈ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ для ΡƒΠΊΠ°Π·Π°Π½ΠΈΡ зависимостСй. Бсылка Π½Π° Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ рСсурс Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции.

Бинтаксис Ρƒ ΡΡΡ‹Π»ΠΊΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ: Ρ‚ΠΈΠΏ рСсурса с Π±ΠΎΠ»ΡŒΡˆΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹ (Ссли Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ Ρ‚ΠΈΠΏΠ° содСрТатся Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ двоСточия, Ρ‚ΠΎ с Π±ΠΎΠ»ΡŒΡˆΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ каТдая Ρ‡Π°ΡΡ‚ΡŒ названия ΠΌΠ΅ΠΆΠ΄Ρƒ двоСточиями), дальшС Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобках Π½Π°Π·Π²Π°Π½ΠΈΠ΅ рСсурса (рСгистр названия Π½Π΅ мСняСтся!). ΠŸΡ€ΠΎΠ±Π΅Π»ΠΎΠ² Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ, ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Π΅ скобки ΠΏΠΈΡˆΡƒΡ‚ΡΡ сразу послС названия Ρ‚ΠΈΠΏΠ°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

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

Зависимости ΠΈ увСдомлСния

ДокумСнтация здСсь.

Как ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ сказано Ρ€Π°Π½Π΅Π΅, простыС зависимости ΠΌΠ΅ΠΆΠ΄Ρƒ рСсурсами Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚ΠΈΠ²Π½Ρ‹. ΠšΡΡ‚Π°Ρ‚ΠΈ, Π±ΡƒΠ΄ΡŒΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠΈ зависимостСй β€” ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ цикличСскиС зависимости, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции.

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚Π΅ΠΉ, увСдомлСния Π½Π΅ Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚ΠΈΠ²Π½Ρ‹. Для ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°:

  • Если рСсурс ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅, ΠΎΠ½ обновляСтся. ДСйствия ΠΏΡ€ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ зависят ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° рСсурса β€” exec запускаСт ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, service пСрСзапускаСт сСрвис, package пСрСустанавливаСт ΠΏΠ°ΠΊΠ΅Ρ‚. Если для Ρ€Π΅ΡΡƒΡ€ΡΠ° Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ дСйствиС ΠΏΡ€ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ, Ρ‚ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ происходит.
  • Π—Π° ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ³ΠΎΠ½ ΠŸΠ°ΠΏΠΏΠ΅Ρ‚Π° рСсурс обновляСтся Π½Π΅ большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π°. Π­Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ увСдомлСния Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² ΡΠ΅Π±Ρ зависимости, Π° Π³Ρ€Π°Ρ„ зависимостСй Π½Π΅ содСрТит Ρ†ΠΈΠΊΠ»ΠΎΠ².
  • Если ΠŸΠ°ΠΏΠΏΠ΅Ρ‚ мСняСт состояниС рСсурса, Ρ‚ΠΎ рСсурс отправляСт увСдомлСния всСм подписанным Π½Π° Π½Π΅Π³ΠΎ рСсурсам.
  • Если рСсурс обновляСтся, Ρ‚ΠΎ ΠΎΠ½ отправляСт увСдомлСния всСм подписанным Π½Π° Π½Π΅Π³ΠΎ рСсурсам.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π΅ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ссли Ρƒ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° рСсурса Π½Π΅Ρ‚ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ Π² ΠΌΠ°Π½ΠΈΡ„СстС, Ρ‚ΠΎ ΠŸΠ°ΠΏΠΏΠ΅Ρ‚ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒ это свойство Ρƒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ рСсурса Π½Π° Π½ΠΎΠ΄Π΅. НапримСр, Ссли Ρƒ рСсурса Ρ‚ΠΈΠΏΠ° file Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ owner, Ρ‚ΠΎ ΠŸΠ°ΠΏΠΏΠ΅Ρ‚ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° Ρƒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π°.

Знакомство с классами, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΈ Π΄Π΅Ρ„Π°ΠΉΠ½Π°ΠΌΠΈ

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρƒ Π½Π°Ρ нСсколько Π½ΠΎΠ΄, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ одинаковая Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΈ различия β€” ΠΈΠ½Π°Ρ‡Π΅ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ это всё Π² ΠΎΠ΄Π½ΠΎΠΌ Π±Π»ΠΎΠΊΠ΅ node {}. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ просто ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ части ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Π½ΠΎ Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС это ΠΏΠ»ΠΎΡ…ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ β€” конфигурация разрастаСтся, ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΎΠ±Ρ‰Π΅ΠΉ части ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ придётся ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ Π²ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π΅ мСст. ΠŸΡ€ΠΈ ΡΡ‚ΠΎΠΌ Π»Π΅Π³ΠΊΠΎ ΠΎΡˆΠΈΠ±ΠΈΡ‚ΡŒΡΡ, Π½Ρƒ ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ DRY (don’t repeat yourself) Π½Π΅ просто Ρ‚Π°ΠΊ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π»ΠΈ.

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π΅ΡΡ‚ΡŒ такая конструкция, ΠΊΠ°ΠΊ класс.

ΠšΠ»Π°ΡΡΡ‹

Класс β€” это ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ ΠΏΠ°ΠΏΠΏΠ΅Ρ‚-ΠΊΠΎΠ΄Π°. ΠšΠ»Π°ΡΡΡ‹ Π½ΡƒΠΆΠ½Ρ‹ для ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ΄Π°.

Π‘Π½Π°Ρ‡Π°Π»Π° класс Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ. Π‘Π°ΠΌΠΎ ΠΏΠΎ сСбС описаниС Π½Π΅ добавляСт Π½ΠΈΠΊΡƒΠ΄Π° Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ рСсурсы. Класс описываСтся Π² ΠΌΠ°Π½ΠΈΡ„Сстах:

# ОписаниС класса начинаСтся с ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова class ΠΈ Π΅Π³ΠΎ названия.
# Π”Π°Π»ΡŒΡˆΠ΅ ΠΈΠ΄Ρ‘Ρ‚ Ρ‚Π΅Π»ΠΎ класса Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобках.
class example_class {
    ...
}

ПослС этого класс ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ:

# ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования β€” Π² стилС рСсурса с Ρ‚ΠΈΠΏΠΎΠΌ class
class { 'example_class': }
# Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования β€” с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ include
include example_class
# ΠΏΡ€ΠΎ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ этих Π΄Π²ΡƒΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ рассказано дальшС

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ β€” вынСсСм установку ΠΈ настройку nginx Π² ΠΊΠ»Π°ΡΡ:

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
}

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

Класс ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° совсСм Π½Π΅ Π³ΠΈΠ±ΠΎΠΊ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ всСгда приносит ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ nginx. Π”Π°Π²Π°ΠΉΡ‚Π΅ сдСлаСм Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ стал ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, Ρ‚ΠΎΠ³Π΄Π° этот класс ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΊΠΈ nginx с Π»ΡŽΠ±ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ.

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² Puppet нСизмСняСмыС!

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π΅Ρ‘ объявили, ΠΈΠ½Π°Ρ‡Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окаТСтся undef.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ:

# созданиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…
$variable = 'value'
$var2 = 1
$var3 = true
$var4 = undef
# использованиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…
$var5 = $var6
file { '/tmp/text': content => $variable }
# интСрполяция ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… β€” раскрытиС значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² строках. Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Ρ… ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ…!
$var6 = "Variable with name variable has value ${variable}"

Π’ Puppet Π΅ΡΡ‚ΡŒ пространства ΠΈΠΌΡ‘Π½, Π° Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, соотвСтствСнно, Π΅ΡΡ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости: пСрСмСнная с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² Ρ€Π°Π·Π½Ρ‹Ρ… пространствах ΠΈΠΌΡ‘Π½. ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ пСрСмСнная ищСтся Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ нСймспСйсС, ΠΏΠΎΡ‚ΠΎΠΌ Π² ΠΎΠ±ΡŠΠ΅ΠΌΠ»ΡŽΡ‰Π΅ΠΌ, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ пространства ΠΈΠΌΡ‘Π½:

  • глобальноС β€” Ρ‚ΡƒΠ΄Π° ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π²Π½Π΅ описания класса ΠΈΠ»ΠΈ Π½ΠΎΠ΄Ρ‹;
  • пространство ΠΈΠΌΡ‘Π½ Π½ΠΎΠ΄Ρ‹ Π² ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΈ Π½ΠΎΠ΄Ρ‹;
  • пространство ΠΈΠΌΡ‘Π½ класса Π² ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΈ класса.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ нСоднозначности ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ пространство ΠΈΠΌΡ‘Π½ Π² ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ:

# пСрСмСнная Π±Π΅Π· пространства ΠΈΠΌΡ‘Π½
$var
# пСрСмСнная Π² глобальном пространствС ΠΈΠΌΡ‘Π½
$::var
# пСрСмСнная Π² пространствС ΠΈΠΌΡ‘Π½ класса
$classname::var
$::classname::var

Договоримся, Ρ‡Ρ‚ΠΎ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ nginx Π»Π΅ΠΆΠΈΡ‚ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $nginx_conf_source. Π’ΠΎΠ³Π΄Π° класс Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

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
}

Однако ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠ»ΠΎΡ… Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΠ΅ Β«Ρ‚Π°ΠΉΠ½ΠΎΠ΅ Π·Π½Π°Π½ΠΈΠ΅Β» ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π³Π΄Π΅-Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ класса ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ пСрСмСнная с Ρ‚Π°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π΅ΠΌ. Π“ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π·Π½Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ‰ΠΈΠΌ β€” Ρƒ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ класса β€” это ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² ΠΏΡ€ΠΎΡΡ‚ранствС ΠΈΠΌΡ‘Π½ класса, ΠΎΠ½ΠΈ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ класса ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² Ρ‚Π΅Π»Π΅ класса. ЗначСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² указываСтся ΠΏΡ€ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠΈ класса Π² ΠΌΠ°Π½ΠΈΡ„СстС.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Если Ρƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π½Π΅Ρ‚ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π·Π°Π΄Π°Π½ΠΎ ΠΏΡ€ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠΈ, это Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции.

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΡƒΠ΅ΠΌ класс ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²Ρ‹ΡˆΠ΅ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°: ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ, ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ β€” ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ, Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ β€” Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π° с nginx (Π² Debian, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΅ΡΡ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ nginx, nginx-light, nginx-full).

# ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ сразу послС ΠΈΠΌΠ΅Π½ΠΈ класса Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобках
class nginx_example (
  $conf_source,
  $package_name = 'nginx-light', # ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
) {
  package { $package_name:
    ensure => installed,
  }
  -> file { '/etc/nginx':
    ensure  => directory,
    source  => $conf_source,
    recurse => true,
    purge   => true,
    force   => true,
  }
  ~> service { 'nginx':
    ensure => running,
    enable => true,
  }
}

node 'server2.testdomain' {
  # Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ класса, функция include Π½Π΅ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Ρ‘Ρ‚* β€” Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ resource-style declaration
  # *Π½Π° самом Π΄Π΅Π»Π΅ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Ρ‘Ρ‚, Π½ΠΎ ΠΏΡ€ΠΎ это расскаТу Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ сСрии. ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово "Hiera".
  class { 'nginx_example':
    conf_source => 'puppet:///modules/example/nginx-conf',   # Π·Π°Π΄Π°Ρ‘ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ класса Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для Π΄Ρ€ΡƒΠ³ΠΈΡ… рСсурсов
  }
}

Π’ Puppet ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹. Π•ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…. Π’ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π² ΠΊΠ»Π°ΡΡΡ‹ ΠΈ Π΄Π΅Ρ„Π°ΠΉΠ½Ρ‹. Если ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π½Π΅ соотвСтствуСт ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ, ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚ ошибка компиляции.

Π’ΠΈΠΏ ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

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

ΠšΠ»Π°ΡΡΡ‹: include classname vs class{‘classname’:}

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ класс являСтся рСсурсом Ρ‚ΠΈΠΏΠ° class. Как ΠΈ Π² ΡΠ»ΡƒΡ‡Π°Π΅ с Π»ΡŽΠ±Ρ‹ΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ рСсурсов, Π½Π° ΠΎΠ΄Π½ΠΎΠΉ Π½ΠΎΠ΄Π΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²Π° экзСмпляра ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ класса.

Если ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ класс Π½Π° ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ Π½ΠΎΠ΄Ρƒ Π΄Π²Π° Ρ€Π°Π·Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ class { 'classname':} (Π±Π΅Π· Ρ€Π°Π·Π½ΠΈΡ†Ρ‹, с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΈΠ»ΠΈ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ), Π±ΡƒΠ΄Π΅Ρ‚ ошибка компиляции. Π—Π°Ρ‚ΠΎ Π² ΡΠ»ΡƒΡ‡Π°Π΅ использования класса Π² ΡΡ‚ΠΈΠ»Π΅ рСсурса ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΡƒΡ‚ ΠΆΠ΅ Π² ΠΌΠ°Π½ΠΈΡ„СстС явно Π·Π°Π΄Π°Ρ‚ΡŒ всС Π΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹.

Однако Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ include, Ρ‚ΠΎ класс ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ сколько ΡƒΠ³ΠΎΠ΄Π½ΠΎ Ρ€Π°Π·. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ include β€” идСмпотСнтная функция, которая провСряСт, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π»ΠΈ класс Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³. Если класса Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Π½Π΅Ρ‚ β€” добавляСт Π΅Π³ΠΎ, Π° Ссли ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ, Ρ‚ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚. Но Π² ΡΠ»ΡƒΡ‡Π°Π΅ использования include нСльзя Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ класса Π²ΠΎ Π²Ρ€Π΅ΠΌΡ объявлСния класса β€” всС ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½Ρ‹ Π²ΠΎ Π²Π½Π΅ΡˆΠ½Π΅ΠΌ источникС Π΄Π°Π½Π½Ρ‹Ρ… β€” Hiera ΠΈΠ»ΠΈ ENC. О Π½ΠΈΡ… ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅.

Π”Π΅Ρ„Π°ΠΉΠ½Ρ‹

Как Π±Ρ‹Π»ΠΎ сказано Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Π±Π»ΠΎΠΊΠ΅, ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ класс Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π½ΠΎΠ΄Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π°. Однако Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π° с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ Π½ΠΎΠ΄Π΅. Π˜Π½Ρ‹ΠΌΠΈ словами, Π΅ΡΡ‚ΡŒ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ Π² собствСнном Ρ‚ΠΈΠΏΠ΅ рСсурса.

НапримСр, для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ PHP, ΠΌΡ‹ Π² Авито Π΄Π΅Π»Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

  1. УстанавливаСм ΠΏΠ°ΠΊΠ΅Ρ‚ с ΡΡ‚ΠΈΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ.
  2. Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» для ΡΡ‚ΠΎΠ³ΠΎ модуля.
  3. Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ симлинк Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ для php-fpm.
  4. Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ симлинк Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ для php cli.

Π’ Ρ‚Π°ΠΊΠΈΡ… случаях ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ такая конструкция, ΠΊΠ°ΠΊ Π΄Π΅Ρ„Π°ΠΉΠ½ (define, defined type, defined resource type). Π”Π΅Ρ„Π°ΠΉΠ½ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° ΠΊΠ»Π°ΡΡ, Π½ΠΎ Π΅ΡΡ‚ΡŒ отличия: Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π΄Π΅Ρ„Π°ΠΉΠ½ являСтся Ρ‚ΠΈΠΏΠΎΠΌ рСсурса, Π° Π½Π΅ рСсурсом; Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΄Π΅Ρ„Π°ΠΉΠ½Π° Π΅ΡΡ‚ΡŒ нСявный ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ $title, ΠΊΡƒΠ΄Π° ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ имя рСсурса ΠΏΡ€ΠΈ Π΅Π³ΠΎ объявлСнии. Π’Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Π² ΡΠ»ΡƒΡ‡Π°Π΅ с ΠΊΠ»Π°ΡΡΠ°ΠΌΠΈ, Π΄Π΅Ρ„Π°ΠΉΠ½ сначала Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ, послС этого Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

Π£ΠΏΡ€ΠΎΡ‰Ρ‘Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ для 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' }
}

Π’ Π΄Π΅Ρ„Π°ΠΉΠ½Π΅ ΠΏΡ€ΠΎΡ‰Π΅ всСго ΠΏΠΎΠΉΠΌΠ°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ Duplicate declaration. Π­Ρ‚ΠΎ происходит, Ссли Π² Π΄Π΅Ρ„Π°ΠΉΠ½Π΅ Π΅ΡΡ‚ΡŒ рСсурс с ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΈ Π½Π° ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π½ΠΎΠ΄Π΅ Π΄Π²Π° ΠΈ Π±ΠΎΠ»Π΅Π΅ экзСмпляра этого Π΄Π΅Ρ„Π°ΠΉΠ½Π°.

Π—Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ этого просто: всС рСсурсы Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Π΅Ρ„Π°ΠΉΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½Π°Π·Π²Π°Π½ΠΈΠ΅, зависящСС ΠΎΡ‚ $title. Π’ ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ β€” ΠΈΠ΄Π΅ΠΌΠΏΠΎΡ‚Π΅Π½Ρ‚Π½ΠΎΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ рСсурсов, Π² ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΌ случаС достаточно вынСсти ΠΎΠ±Ρ‰ΠΈΠ΅ для Π²ΡΠ΅Ρ… экзСмпляров Π΄Π΅Ρ„Π°ΠΉΠ½Π° рСсурсы Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ класс ΠΈ ΠΈΠ½ΠΊΠ»ΡŽΠ΄ΠΈΡ‚ΡŒ этот класс Π² Π΄Π΅Ρ„Π°ΠΉΠ½Π΅ β€” функция include ΠΈΠ΄Π΅ΠΌΠΏΠΎΡ‚Π΅Π½Ρ‚Π½Π°.

Π•ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ способы Π΄ΠΎΡΡ‚ΠΈΠ³Π½ΡƒΡ‚ΡŒ идСмпотСнтности ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ рСсурсов, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ defined ΠΈ ensure_resources, Π½ΠΎ ΠΏΡ€ΠΎ это расскаТу Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ сСрии.

Зависимости ΠΈ увСдомлСния для классов ΠΈ Π΄Π΅Ρ„Π°ΠΉΠ½ΠΎΠ²

ΠšΠ»Π°ΡΡΡ‹ ΠΈ Π΄Π΅Ρ„Π°ΠΉΠ½Ρ‹ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ зависимостСй ΠΈ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ:

  • Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ ΠΊΠ»Π°ΡΡΠ°/Π΄Π΅Ρ„Π°ΠΉΠ½Π° добавляСт зависимости ΠΎΡ‚ Π²ΡΠ΅Ρ… рСсурсов класса/Π΄Π΅Ρ„Π°ΠΉΠ½Π°;
  • Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ класса/Π΄Π΅Ρ„Π°ΠΉΠ½Π° добавляСт зависимости всСм рСсурсам класса/Π΄Π΅Ρ„Π°ΠΉΠ½Π°;
  • ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ класса/Π΄Π΅Ρ„Π°ΠΉΠ½Π° увСдомляСт всС рСсурсы класса/Π΄Π΅Ρ„Π°ΠΉΠ½Π°;
  • подписка Π½Π° класс/Π΄Π΅Ρ„Π°ΠΉΠ½ подписываСт Π½Π° всС рСсурсы класса/Π΄Π΅Ρ„Π°ΠΉΠ½Π°.

УсловныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ сСлСкторы

ДокумСнтация здСсь.

if

Π’ΡƒΡ‚ всё просто:

if Π’Π«Π ΠΠ–Π•ΠΠ˜Π•1 {
  ...
} elsif Π’Π«Π ΠΠ–Π•ΠΠ˜Π•2 {
  ...
} else {
  ...
}

unless

unless β€” это if Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚: Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½, Ссли Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π»ΠΎΠΆΠ½ΠΎ.

unless Π’Π«Π ΠΠ–Π•ΠΠ˜Π• {
  ...
}

case

Π’ΡƒΡ‚ Ρ‚ΠΎΠΆΠ΅ Π½ΠΈΡ‡Π΅Π³ΠΎ слоТного. Π’ ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ значСния (строки, числа ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅), рСгулярныС выраТСния, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ….

case Π’Π«Π ΠΠ–Π•ΠΠ˜Π• {
  Π—ΠΠΠ§Π•ΠΠ˜Π•1: { ... }
  Π—ΠΠΠ§Π•ΠΠ˜Π•2, Π—ΠΠΠ§Π•ΠΠ˜Π•3: { ... }
  default: { ... }
}

Π‘Π΅Π»Π΅ΠΊΡ‚ΠΎΡ€Ρ‹

Π‘Π΅Π»Π΅ΠΊΡ‚ΠΎΡ€ β€” это языковая конструкция, похоТая Π½Π° case, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ вмСсто выполнСния Π±Π»ΠΎΠΊΠ° ΠΊΠΎΠ΄Π° ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

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

ΠœΠΎΠ΄ΡƒΠ»ΠΈ

Когда конфигурация малСнькая, Π΅Ρ‘ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π² ΠΎΠ΄Π½ΠΎΠΌ манифСстС. Но Ρ‡Π΅ΠΌ большС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΌΡ‹ описываСм, Ρ‚Π΅ΠΌ большС классов ΠΈ Π½ΠΎΠ΄ становится Π² ΠΌΠ°Π½ΠΈΡ„СстС, ΠΎΠ½ разрастаСтся, с Π½ΠΈΠΌ становится Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ΄Π° β€” ΠΊΠΎΠ³Π΄Π° вСсь ΠΊΠΎΠ΄ Π² ΠΎΠ΄Π½ΠΎΠΌ манифСстС, слоТно этим ΠΊΠΎΠ΄ΠΎΠΌ Π΄Π΅Π»ΠΈΡ‚ΡŒΡΡ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ. Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этих Π΄Π²ΡƒΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π² Puppet Π΅ΡΡ‚ΡŒ такая ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ.

ΠœΠΎΠ΄ΡƒΠ»ΠΈ β€” это Π½Π°Π±ΠΎΡ€Ρ‹ классов, Π΄Π΅Ρ„Π°ΠΉΠ½ΠΎΠ² ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ… Puppet-сущностСй, вынСсСнных Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ. Π˜Π½Ρ‹ΠΌΠΈ словами, ΠΌΠΎΠ΄ΡƒΠ»ΡŒ β€” это нСзависимый кусок Puppet-Π»ΠΎΠ³ΠΈΠΊΠΈ. НапримСр, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с nginx, ΠΈ Π² Π½Ρ‘ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с nginx, Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с PHP, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

ΠœΠΎΠ΄ΡƒΠ»ΠΈ Π²Π΅Ρ€ΡΠΈΠΎΠ½ΠΈΡ€ΡƒΡŽΡ‚ΡΡ, Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ зависимости ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°. Π•ΡΡ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ β€” Puppet Forge.

На ΠΏΠ°ΠΏΠΏΠ΅Ρ‚-сСрвСрС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π»Π΅ΠΆΠ°Ρ‚ Π² ΠΏΠΎΠ΄Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ modules ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ. Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ модуля стандартная схСма Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ β€” manifests, files, templates, lib ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅

Π’ ΠΊΠΎΡ€Π½Π΅ модуля ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ с Π³ΠΎΠ²ΠΎΡ€ΡΡ‰ΠΈΠΌΠΈ названиями:

  • manifests β€” Π² Π½Π΅ΠΉ Π»Π΅ΠΆΠ°Ρ‚ манифСсты
  • files β€” Π² Π½Π΅ΠΉ Π»Π΅ΠΆΠ°Ρ‚ Ρ„Π°ΠΉΠ»Ρ‹
  • templates β€” Π² Π½Π΅ΠΉ Π»Π΅ΠΆΠ°Ρ‚ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹
  • lib β€” Π² Π½Π΅ΠΉ Π»Π΅ΠΆΠΈΡ‚ Ruby-ΠΊΠΎΠ΄

Π­Ρ‚ΠΎ Π½Π΅ ΠΏΠΎΠ»Π½Ρ‹ΠΉ список Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ², Π½ΠΎ для ΡΡ‚ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΏΠΎΠΊΠ° достаточно.

Названия рСсурсов ΠΈ ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅

ДокумСнтация здСсь.

РСсурсы (классы, Π΄Π΅Ρ„Π°ΠΉΠ½Ρ‹) Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ нСльзя Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΡƒΠ³ΠΎΠ΄Π½ΠΎ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΅ΡΡ‚ΡŒ прямоС соотвСтствиС ΠΌΠ΅ΠΆΠ΄Ρƒ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ рСсурса ΠΈ ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„Π°ΠΉΠ»Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Puppet Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ описаниС этого рСсурса. Если Π½Π°Ρ€ΡƒΡˆΠ°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° имСнования, Ρ‚ΠΎ Puppet просто Π½Π΅ Π½Π°ΠΉΠ΄Ρ‘Ρ‚ описаниС рСсурсов, ΠΈ получится ошибка компиляции.

ΠŸΡ€Π°Π²ΠΈΠ»Π° простыС:

  • ВсС рСсурсы Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π² нСймспСйсС модуля. Если ΠΌΠΎΠ΄ΡƒΠ»ΡŒ называСтся foo, Ρ‚ΠΎ всС рСсурсы Π² Π½Ρ‘ΠΌ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ foo::<anything>, Π»ΠΈΠ±ΠΎ просто foo.
  • РСсурс с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ модуля Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π² Ρ„Π°ΠΉΠ»Π΅ init.pp.
  • Для ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… рСсурсов схСма имСнования Ρ„Π°ΠΉΠ»ΠΎΠ² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ:
    • прСфикс с ΠΈΠΌΠ΅Π½Π΅ΠΌ модуля отбрасываСтся
    • всС Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ двоСточия, Ссли ΠΎΠ½ΠΈ Π΅ΡΡ‚ΡŒ, Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π½Π° слСши
    • дописываСтся Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ .pp

ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, я ΠΏΠΈΡˆΡƒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ nginx. Π’ Π½Ρ‘ΠΌ Π΅ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ рСсурсы:

  • класс nginx описан Π² манифСстС init.pp;
  • класс nginx::service описан Π² манифСстС service.pp;
  • Π΄Π΅Ρ„Π°ΠΉΠ½ nginx::server описан Π² манифСстС server.pp;
  • Π΄Π΅Ρ„Π°ΠΉΠ½ nginx::server::location описан Π² манифСстС server/location.pp.

Π¨Π°Π±Π»ΠΎΠ½Ρ‹

НавСрняка Π²Ρ‹ ΠΈ сами Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹, Π½Π΅ Π±ΡƒΠ΄Ρƒ Ρ€Π°ΡΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ здСсь ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ. Но Π½Π° Π²ΡΡΠΊΠΈΠΉ случай ΠΎΡΡ‚Π°Π²Π»ΡŽ ссылку Π½Π° Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΡŽ.

Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹: Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ шаблона ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΠΊΡ€Ρ‹Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ template, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ пСрСдаётся ΠΏΡƒΡ‚ΡŒ ΠΊ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ. Для Ρ€Π΅ΡΡƒΡ€ΡΠΎΠ² Ρ‚ΠΈΠΏΠ° file ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ вмСстС с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ content. НапримСр, Ρ‚Π°ΠΊ:

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

ΠŸΡƒΡ‚ΡŒ Π²ΠΈΠ΄Π° <modulename>/<filename> ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» <rootdir>/modules/<modulename>/templates/<filename>.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΅ΡΡ‚ΡŒ функция inline_template β€” Π΅ΠΉ Π½Π° Π²Ρ…ΠΎΠ΄ пСрСдаётся тСкст шаблона, Π° Π½Π΅ имя Ρ„Π°ΠΉΠ»Π°.

Π’Π½ΡƒΡ‚Ρ€ΠΈ шаблонов ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Puppet Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ области видимости.

Puppet ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ERB ΠΈ EPP:

Π’ΠΊΡ€Π°Ρ‚Ρ†Π΅ ΠΏΡ€ΠΎ ERB

Π£ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ конструкции:

  • <%= Π’Π«Π ΠΠ–Π•ΠΠ˜Π• %> β€” Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выраТСния
  • <% Π’Π«Π ΠΠ–Π•ΠΠ˜Π• %> β€” Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (Π½Π΅ вставляя Π΅Π³ΠΎ). Бюда ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΈΠ΄ΡƒΡ‚ условныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ (if), Ρ†ΠΈΠΊΠ»Ρ‹ (each).
  • <%# ΠšΠžΠœΠœΠ•ΠΠ’ΠΠ Π˜Π™ %>

ВыраТСния Π² ERB ΠΏΠΈΡˆΡƒΡ‚ΡΡ Π½Π° Ruby (собствСнно, ERB β€” это Embedded Ruby).

Для доступа ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈΠ· ΠΌΠ°Π½ΠΈΡ„Сста Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ @ ΠΊ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ строки, ΠΏΠΎΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ послС ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ конструкции, Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ‚Π΅Π³ -%>.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования шаблона

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, я ΠΏΠΈΡˆΡƒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡ ZooKeeper. Класс, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°, выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

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

А ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π΅ΠΌΡƒ шаблон zoo.cfg.erb β€” Ρ‚Π°ΠΊ:

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

Π€Π°ΠΊΡ‚Ρ‹ ΠΈ встроСнныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

Π—Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ конкрСтная Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ происходит Π½Π° Π½ΠΎΠ΄Π΅. НапримСр, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΠΈ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ Ρ€Π΅Π»ΠΈΠ· Debian стоит, Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Ρƒ ΠΈΠ»ΠΈ ΠΈΠ½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΠΏΠ°ΠΊΠ΅Ρ‚Π°. МоТно ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° ΡΡ‚ΠΈΠΌ всСм Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, пСрСписывая манифСсты Π² ΡΠ»ΡƒΡ‡Π°Π΅ измСнСния Π½ΠΎΠ΄. Но это Π½Π΅ΡΠ΅Ρ€ΡŒΡ‘Π·Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, автоматизация Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»ΡƒΡ‡ΡˆΠ΅.

Для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Π½ΠΎΠ΄Π°Ρ… Π² Puppet Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΊΠ°ΠΊ Ρ„Π°ΠΊΡ‚Ρ‹. Π€Π°ΠΊΡ‚Ρ‹ β€” это информация ΠΎ Π½ΠΎΠ΄Π΅, доступная Π² ΠΌΠ°Π½ΠΈΡ„Сстах Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠΌ пространствС ΠΈΠΌΡ‘Π½. НапримСр, имя хоста, вСрсия ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° процСссора, список ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, список сСтСвых интСрфСйсов ΠΈ ΠΈΡ… адрСсов, ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅, ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. Π€Π°ΠΊΡ‚Ρ‹ доступны Π² ΠΌΠ°Π½ΠΈΡ„Сстах ΠΈ ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ… ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΊΡ‚Π°ΠΌΠΈ:

notify { "Running OS ${facts['os']['name']} version ${facts['os']['release']['full']}": }
# рСсурс Ρ‚ΠΈΠΏΠ° notify просто Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ сообщСниС Π² Π»ΠΎΠ³

Если Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, Ρ‚ΠΎ Ρƒ Ρ„Π°ΠΊΡ‚Π° Π΅ΡΡ‚ΡŒ имя (строка) ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (доступны Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹: строки, массивы, словари). Π•ΡΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ встроСнных Ρ„Π°ΠΊΡ‚ΠΎΠ². Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ собствСнныС. Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊΠΈ Ρ„Π°ΠΊΡ‚ΠΎΠ² ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° Ruby, Π»ΠΈΠ±ΠΎ ΠΊΠ°ΠΊ исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹. Π’Π°ΠΊΠΆΠ΅ Ρ„Π°ΠΊΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ прСдставлСны Π² Π²ΠΈΠ΄Π΅ тСкстовых Ρ„Π°ΠΉΠ»ΠΎΠ² с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π½Π° Π½ΠΎΠ΄Π°Ρ….

Π’ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠ°ΠΏΠΏΠ΅Ρ‚-Π°Π³Π΅Π½Ρ‚ сначала ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ с ΠΏΠ°ΠΏΠΏΠ΅Ρ‚сСрвСра Π½Π° Π½ΠΎΠ΄Ρƒ всС доступныС сборщики Ρ„Π°ΠΊΡ‚ΠΎΠ², послС Ρ‡Π΅Π³ΠΎ запускаСт ΠΈΡ… ΠΈ отправляСт Π½Π° ΡΠ΅Ρ€Π²Π΅Ρ€ собранныС Ρ„Π°ΠΊΡ‚Ρ‹; ΡƒΠΆΠ΅ послС этого сСрвСр Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°.

Π€Π°ΠΊΡ‚Ρ‹ Π² Π²ΠΈΠ΄Π΅ исполняСмых Ρ„Π°ΠΉΠ»ΠΎΠ²

Π’Π°ΠΊΠΈΠ΅ Ρ„Π°ΠΊΡ‚Ρ‹ кладутся Π² ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ facts.d. РазумССтся, Ρ„Π°ΠΉΠ»Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ исполняСмыми. ΠŸΡ€ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ΅ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π»ΠΈΠ±ΠΎ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ YAML, Π»ΠΈΠ±ΠΎ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ «ΠΊΠ»ΡŽΡ‡=Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅».

НС Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΊΡ‚Ρ‹ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π½Π° Π²ΡΠ΅ Π½ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ находятся ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΠΏΠΏΠ΅Ρ‚-сСрвСра, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выкатываСтся ваш ΠΌΠΎΠ΄ΡƒΠ»ΡŒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² ΡΠΊΡ€ΠΈΠΏΡ‚Π΅ ΠΎΠ·Π°Π±ΠΎΡ‚ΡŒΡ‚Π΅ΡΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΡΠΈΡΡ‚Π΅ΠΌΠ΅ Π΅ΡΡ‚ΡŒ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ вашСго Ρ„Π°ΠΊΡ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Ρ„Π°ΠΉΠ»Ρ‹.

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

Π€Π°ΠΊΡ‚Ρ‹ Π½Π° Ruby

Π’Π°ΠΊΠΈΠ΅ Ρ„Π°ΠΊΡ‚Ρ‹ кладутся Π² ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ 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

ВСкстовыС Ρ„Π°ΠΊΡ‚Ρ‹

Π’Π°ΠΊΠΈΠ΅ Ρ„Π°ΠΊΡ‚Ρ‹ кладутся Π½Π° Π½ΠΎΠ΄Ρ‹ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ /etc/facter/facts.d Π² ΡΡ‚Π°Ρ€ΠΎΠΌ ΠŸΠ°ΠΏΠΏΠ΅Ρ‚Π΅ ΠΈΠ»ΠΈ /etc/puppetlabs/facts.d Π² Π½ΠΎΠ²ΠΎΠΌ ΠŸΠ°ΠΏΠΏΠ΅Ρ‚Π΅.

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

ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Ρ„Π°ΠΊΡ‚Π°ΠΌ

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Ρ„Π°ΠΊΡ‚Π°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ двумя способами:

  • Ρ‡Π΅Ρ€Π΅Π· ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ $facts: $facts['fqdn'];
  • ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ имя Ρ„Π°ΠΊΡ‚Π° ΠΊΠ°ΠΊ имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ: $fqdn.

Π›ΡƒΡ‡ΡˆΠ΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ $facts, Π° Π΅Ρ‰Ρ‘ Π»ΡƒΡ‡ΡˆΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ нСймспСйс ($::facts).

Π’ΠΎΡ‚ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ€Π°Π·Π΄Π΅Π» Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

ВстроСнныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

ΠšΡ€ΠΎΠΌΠ΅ Ρ„Π°ΠΊΡ‚ΠΎΠ², Π΅ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, доступныС Π² Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠΌ пространствС ΠΈΠΌΡ‘Π½.

  • trusted facts β€” ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ бСрутся ΠΈΠ· ΡΠ΅Ρ€Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° (Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ сСртификат ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ выпускаСтся Π½Π° ΠΏΠ°ΠΏΠΏΠ΅Ρ‚-сСрвСрС, Π°Π³Π΅Π½Ρ‚ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ просто Ρ‚Π°ΠΊ Π²Π·ΡΡ‚ΡŒ ΠΈ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ свой сСртификат, поэтому ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Β«Π΄ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Π΅Β»): Π½Π°Π·Π²Π°Π½ΠΈΠ΅ сСртификата, имя хоста ΠΈ Π΄ΠΎΠΌΠ΅Π½Π°, Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΈΠ· ΡΠ΅Ρ€Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚Π°.
  • server facts β€”ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, относящиСся ΠΊ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΡΠ΅Ρ€Π²Π΅Ρ€Π΅ β€” вСрсия, имя, IP-адрСс сСрвСра, ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅.
  • agent facts β€” ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, добавляСмыС нСпосрСдствСнно puppet-agent’ΠΎΠΌ, Π° Π½Π΅ facter’ΠΎΠΌ β€” Π½Π°Π·Π²Π°Π½ΠΈΠ΅ сСртификата, вСрсия Π°Π³Π΅Π½Ρ‚Π°, вСрсия ΠΏΠ°ΠΏΠΏΠ΅Ρ‚Π°.
  • master variables β€” ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ паппСтмастСра (sic!). Π’Π°ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ Π² server facts, плюс доступны значСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².
  • compiler variables β€” ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ компилятора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ области видимости: имя Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ модуля ΠΈ имя модуля, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±Ρ‹Π»ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ. Π˜Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ваши ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ классы Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ.

Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ 1: ΠΊΠ°ΠΊ это всё Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΈ Π΄Π΅Π±Π°ΠΆΠΈΡ‚ΡŒ?

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π±Ρ‹Π»ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² puppet-ΠΊΠΎΠ΄Π°, Π½ΠΎ совсСм Π½Π΅ Π±Ρ‹Π»ΠΎ рассказано, ΠΊΠ°ΠΊ ΠΆΠ΅ этот ΠΊΠΎΠ΄ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ. Π§Ρ‚ΠΎ ΠΆ, ΠΈΡΠΏΡ€Π°Π²Π»ΡΡŽΡΡŒ.

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Puppet достаточно Π°Π³Π΅Π½Ρ‚Π°, Π½ΠΎ для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° случаСв Π½ΡƒΠΆΠ΅Π½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈ сСрвСр.

АгСнт

Как ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ с ΠΏΡΡ‚ΠΎΠΉ вСрсии ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ puppet-agent ΠΈΠ· ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ рСпозитория Puppetlabs содСрТат Π² ΡΠ΅Π±Π΅ всС зависимости (ruby ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ gem’Ρ‹), поэтому слоТностСй с ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΊΠΎΠΉ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π½Π΅Ρ‚ (Π³ΠΎΠ²ΠΎΡ€ΡŽ ΠΏΡ€ΠΎ Debian-based дистрибутивы β€” RPM-based дистрибутивами ΠΌΡ‹ Π½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ).

Π’ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΌ случаС для примСнСния puppet-ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ достаточно Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π°Π³Π΅Π½Ρ‚ Π² Π±Π΅cсСрвСрном Ρ€Π΅ΠΆΠΈΠΌΠ΅: ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ puppet-ΠΊΠΎΠ΄ скопирован Π½Π° Π½ΠΎΠ΄Ρƒ, запускаСтС 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

Π›ΡƒΡ‡ΡˆΠ΅, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ сСрвСр ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π°Π³Π΅Π½Ρ‚Ρ‹ Π½Π° Π½ΠΎΠ΄Π°Ρ… Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π΄Π΅ΠΌΠΎΠ½Π° β€” Ρ‚ΠΎΠ³Π΄Π° Ρ€Π°Π· Π² ΠΏΠΎΠ»Ρ‡Π°ΡΠ° ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, ΡΠΊΠ°Ρ‡Π°Π½Π½ΡƒΡŽ с сСрвСра.

МоТно ΠΈΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ push-модСль Ρ€Π°Π±ΠΎΡ‚Ρ‹ β€” Π·Π°ΠΉΡ‚ΠΈ Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΡƒΡŽ вас Π½ΠΎΠ΄Ρƒ ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ sudo puppet agent -t. ΠšΠ»ΡŽΡ‡ -t (--test) Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ нСсколько ΠΎΠΏΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π‘Ρ€Π΅Π΄ΠΈ этих ΠΎΠΏΡ†ΠΈΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

  • Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π΄Π΅ΠΌΠΎΠ½Π° (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π°Π³Π΅Π½Ρ‚ запускаСтся Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π΄Π΅ΠΌΠΎΠ½Π°);
  • Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ послС примСнСния ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π°Π³Π΅Π½Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Ρ€Π°Π· Π² полчаса);
  • ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ Π»ΠΎΠ³ Ρ€Π°Π±ΠΎΡ‚Ρ‹;
  • ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ измСнСния Π² Ρ„Π°ΠΉΠ»Π°Ρ….

Π£ Π°Π³Π΅Π½Ρ‚Π° Π΅ΡΡ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ β€” ΠΈΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΡΠ»ΡƒΡ‡Π°Π΅, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ написали ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ помСняСт Π°Π³Π΅Π½Ρ‚ Π²ΠΎ Π²Ρ€Π΅ΠΌΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π’ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ этот Ρ€Π΅ΠΆΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ --noop Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС: sudo puppet agent -t --noop.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΉ Π»ΠΎΠ³ Ρ€Π°Π±ΠΎΡ‚Ρ‹ β€” Π² Π½Ρ‘ΠΌ puppet ΠΏΠΈΡˆΠ΅Ρ‚ ΠΎΠ±ΠΎ Π²ΡΠ΅Ρ… дСйствиях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚: ΠΎ Ρ€Π΅ΡΡƒΡ€ΡΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚, ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… этого рСсурса, ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ запускаСт. РазумССтся, это ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ --debug.

Π‘Π΅Ρ€Π²Π΅Ρ€

ΠŸΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΡƒΡŽ настройку паппСтсСрвСра ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉ Π½Π° Π½Π΅Π³ΠΎ ΠΊΠΎΠ΄Π° Π² ΡΡ‚ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Π½Π΅ Π±ΡƒΠ΄Ρƒ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ, скаТу лишь, Ρ‡Ρ‚ΠΎ ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ ставится Π²ΠΏΠΎΠ»Π½Π΅ работоспособная вСрсия сСрвСра, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π°Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ настройки для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² ΡƒΡΠ»ΠΎΠ²ΠΈΡΡ… нСбольшого количСства Π½ΠΎΠ΄ (скаТСм, Π΄ΠΎ ΡΡ‚Π°). Π‘ΠΎΠ»ΡŒΡˆΠ΅Π΅ количСство Π½ΠΎΠ΄ ΡƒΠΆΠ΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ‚ΡŽΠ½ΠΈΠ½Π³Π° β€” ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ puppetserver запускаСт Π½Π΅ большС Ρ‡Π΅Ρ‚Ρ‹Ρ€Ρ‘Ρ… Π²ΠΎΡ€ΠΊΠ΅Ρ€ΠΎΠ², для большСй ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… число ΠΈ Π½Π΅ Π·Π°Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π»ΠΈΠΌΠΈΡ‚Ρ‹ памяти, ΠΈΠ½Π°Ρ‡Π΅ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ сСрвСр Π±ΡƒΠ΄Π΅Ρ‚ garbage collect’ΠΈΡ‚ΡŒ.

Π”Π΅ΠΏΠ»ΠΎΠΉ ΠΊΠΎΠ΄Π° β€” Ссли Π½ΡƒΠΆΠ½ΠΎ быстро ΠΈ просто, Ρ‚ΠΎ смотритС (Π½Π° r10k)[https://github.com/puppetlabs/r10k], для Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… инсталляций Π΅Π³ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ.

Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ 2: Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ ΠΏΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡŽ ΠΊΠΎΠ΄Π°

  1. ВыноситС всю Π»ΠΎΠ³ΠΈΠΊΡƒ Π² ΠΊΠ»Π°ΡΡΡ‹ ΠΈ Π΄Π΅Ρ„Π°ΠΉΠ½Ρ‹.
  2. Π”Π΅Ρ€ΠΆΠΈΡ‚Π΅ классы ΠΈ Π΄Π΅Ρ„Π°ΠΉΠ½Ρ‹ Π² ΠΌΠΎΠ΄ΡƒΠ»ΡΡ…, Π° Π½Π΅ Π² ΠΌΠ°Π½ΠΈΡ„Сстах с ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ Π½ΠΎΠ΄.
  3. ΠŸΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ Ρ„Π°ΠΊΡ‚Π°ΠΌΠΈ.
  4. НС Π΄Π΅Π»Π°ΠΉΡ‚Π΅ if’ΠΎΠ² ΠΏΠΎ Ρ…остнСймам.
  5. НС ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для ΠΊΠ»Π°ΡΡΠΎΠ² ΠΈ Π΄Π΅Ρ„Π°ΠΉΠ½ΠΎΠ² β€” это Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ нСявная Π»ΠΎΠ³ΠΈΠΊΠ°, спрятанная Π² Ρ‚Π΅Π»Π΅ класса/Π΄Π΅Ρ„Π°ΠΉΠ½Π°.

А ΠΏΠΎΡ‡Π΅ΠΌΡƒ я Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ Ρ‚Π°ΠΊ Π΄Π΅Π»Π°Ρ‚ΡŒ β€” объясню Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

На этом Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠΌ со Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ расскаТу ΠΏΡ€ΠΎ Hiera, ENC ΠΈ PuppetDB.

Волько зарСгистрированныС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΡ‡Π°ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² опросС. Π’ΠΎΠΉΠ΄ΠΈΡ‚Π΅, поТалуйста.

На самом Π΄Π΅Π»Π΅, ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС β€” я ΠΌΠΎΠ³Ρƒ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΠΈ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Π΅ΠΌΡ‹, проголосуйтС, ΠΎ Ρ‡Ρ‘ΠΌ Π²Π°ΠΌ интСрСсно Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ:

  • 59,1%Advanced puppet constructs β€” some next-level shit: Ρ†ΠΈΠΊΠ»Ρ‹, мэппинг ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ лямбда-выраТСния, ΠΊΠΎΠ»Π»Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ рСсурсов, экспортируСмыС рСсурсы ΠΈ мСТхостовоС взаимодСйствиС Ρ‡Π΅Ρ€Π΅Π· Puppet, Ρ‚Π΅Π³ΠΈ, ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Ρ‹, абстрактныС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ….13
  • 31,8%Β«Π― Ρƒ ΠΌΠ°ΠΌΠΊΠΈ Π°Π΄ΠΌΠΈΠ½Β» ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΠΌΡ‹ Π² Авито ΠΏΠΎΠ΄Ρ€ΡƒΠΆΠΈΠ»ΠΈ нСсколько ΠΏΠ°ΠΏΠΏΠ΅Ρ‚-сСрвСров Ρ€Π°Π·Π½Ρ‹Ρ… вСрсий, Π½Ρƒ ΠΈ Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎ администрированиС ΠΏΠ°ΠΏΠΏΠ΅Ρ‚-сСрвСра.7
  • 81,8%Как ΠΌΡ‹ пишСм ΠΏΠ°ΠΏΠΏΠ΅Ρ‚-ΠΊΠΎΠ΄: ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ обвязка, докумСнтация, тСстированиС, CI/CD.18

ΠŸΡ€ΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π»ΠΈ 22 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π’ΠΎΠ·Π΄Π΅Ρ€ΠΆΠ°Π»ΠΈΡΡŒ 9 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com