ืžื‘ื•ื ืœื‘ื•ื‘ื”

Puppet ื”ื™ื ืžืขืจื›ืช ืœื ื™ื”ื•ืœ ืชืฆื•ืจื”. ื”ื•ื ืžืฉืžืฉ ื›ื“ื™ ืœื”ื‘ื™ื ืžืืจื—ื™ื ืœืžืฆื‘ ื”ืจืฆื•ื™ ื•ืœืฉืžื•ืจ ืขืœ ืžืฆื‘ ื–ื”.

ืื ื™ ืขื•ื‘ื“ ืขื Puppet ื›ื‘ืจ ื™ื•ืชืจ ืžื—ืžืฉ ืฉื ื™ื. ื˜ืงืกื˜ ื–ื” ื”ื•ื ื‘ืขืฆื ืื•ืกืฃ ืžืชื•ืจื’ื ื•ืžืกื•ื“ืจ ืžื—ื“ืฉ ืฉืœ ื ืงื•ื“ื•ืช ืžืคืชื— ืžื”ืชื™ืขื•ื“ ื”ืจืฉืžื™, ืฉื™ืืคืฉืจ ืœืžืชื—ื™ืœื™ื ืœื”ื‘ื™ืŸ ื‘ืžื”ื™ืจื•ืช ืืช ื”ืžื”ื•ืช ืฉืœ Puppet.

ืžื‘ื•ื ืœื‘ื•ื‘ื”

ืžื™ื“ืข ื‘ืกื™ืกื™

ืžืขืจื›ืช ื”ื”ืคืขืœื” ืฉืœ Puppet ื”ื™ื ืฉืจืช-ืœืงื•ื—, ืื ื›ื™ ื”ื™ื ืชื•ืžื›ืช ื’ื ื‘ืคืขื•ืœื” ืœืœื ืฉืจืช ืขื ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ืžื•ื’ื‘ืœืช.

ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ืžื•ื“ืœ ืžืฉื™ื›ื” ืฉืœ ืคืขื•ืœื”: ื›ื‘ืจื™ืจืช ืžื—ื“ืœ, ืื—ืช ืœื—ืฆื™ ืฉืขื”, ืœืงื•ื—ื•ืช ื™ื•ืฆืจื™ื ืงืฉืจ ืขื ื”ืฉืจืช ืœืงื‘ืœืช ืชืฆื•ืจื” ื•ืžื™ื™ืฉืžื™ื ืื•ืชื”. ืื ืขื‘ื“ืช ืขื Ansible, ืื– ื”ื ืžืฉืชืžืฉื™ื ื‘ืžื•ื“ืœ ื“ื—ื™ืคื” ืื—ืจ: ื”ืžื ื”ืœ ืžืชื—ื™ืœ ืืช ืชื”ืœื™ืš ื”ื—ืœืช ื”ืชืฆื•ืจื”, ื”ืœืงื•ื—ื•ืช ืขืฆืžื ืœื ื™ื—ื™ืœื• ื›ืœื•ื.

ื‘ืžื”ืœืš ืชืงืฉื•ืจืช ืจืฉืช, ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ื”ืฆืคื ืช TLS ื“ื•-ื›ื™ื•ื•ื ื™ืช: ืœืฉืจืช ื•ืœืœืงื•ื— ื™ืฉ ืžืคืชื—ื•ืช ืคืจื˜ื™ื™ื ื•ืชืขื•ื“ื•ืช ืžืชืื™ืžื•ืช ืžืฉืœื”ื. ื‘ื“ืจืš ื›ืœืœ ื”ืฉืจืช ืžื ืคื™ืง ืื™ืฉื•ืจื™ื ืขื‘ื•ืจ ืœืงื•ื—ื•ืช, ืืš ื‘ืื•ืคืŸ ืขืงืจื•ื ื™ ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘-CA ื—ื™ืฆื•ื ื™.

ืžื‘ื•ื ืœืžื ื™ืคืกื˜ื™ื

ื‘ื˜ืจืžื™ื ื•ืœื•ื’ื™ื” ืฉืœ ื‘ื•ื‘ื•ืช ืœืฉืจืช ื”ื‘ื•ื‘ื•ืช ืžื—ื•ื‘ืจื™ื ืฆืžืชื™ื (ืฆืžืชื™ื). ื”ืชืฆื•ืจื” ืฉืœ ื”ืฆืžืชื™ื ื›ืชื•ื‘ื” ื‘ืžื ื™ืคืกื˜ื™ื ื‘ืฉืคืช ืชื›ื ื•ืช ืžื™ื•ื—ื“ืช - Puppet DSL.

Puppet DSL ื”ื™ื ืฉืคื” ื”ืฆื”ืจืชื™ืช. ื”ื•ื ืžืชืืจ ืืช ื”ืžืฆื‘ ื”ืจืฆื•ื™ ืฉืœ ื”ืฆื•ืžืช ื‘ืฆื•ืจื” ืฉืœ ื”ืฆื”ืจื•ืช ืขืœ ืžืฉืื‘ื™ื ื‘ื•ื“ื“ื™ื, ืœืžืฉืœ:

  • ื”ืงื•ื‘ืฅ ืงื™ื™ื ื•ื™ืฉ ืœื• ืชื•ื›ืŸ ืกืคืฆื™ืคื™.
  • ื”ื—ื‘ื™ืœื” ืžื•ืชืงื ืช.
  • ื”ืฉื™ืจื•ืช ื”ืชื—ื™ืœ.

ื ื™ืชืŸ ืœืงืฉืจ ื‘ื™ืŸ ืžืฉืื‘ื™ื:

  • ื™ืฉ ืชืœื•ืช, ื”ืŸ ืžืฉืคื™ืขื•ืช ืขืœ ืกื“ืจ ื”ืฉื™ืžื•ืฉ ื‘ืžืฉืื‘ื™ื.
    ืœื“ื•ื’ืžื”, "ืชื—ื™ืœื” ื”ืชืงืŸ ืืช ื”ื—ื‘ื™ืœื”, ืœืื—ืจ ืžื›ืŸ ืขืจื•ืš ืืช ืงื•ื‘ืฅ ื”ืชืฆื•ืจื”, ื•ืœืื—ืจ ืžื›ืŸ ื”ืคืขืœ ืืช ื”ืฉื™ืจื•ืช."
  • ื™ืฉ ื”ื•ื“ืขื•ืช - ืื ืžืฉืื‘ ื”ืฉืชื ื”, ื”ื•ื ืฉื•ืœื— ื”ื•ื“ืขื•ืช ืœืžืฉืื‘ื™ื ื”ืจืฉื•ืžื™ื ืขืœื™ื•.
    ืœื“ื•ื’ืžื”, ืื ืงื•ื‘ืฅ ื”ืชืฆื•ืจื” ืžืฉืชื ื”, ืชื•ื›ืœ ืœื”ืคืขื™ืœ ืžื—ื“ืฉ ืืช ื”ืฉื™ืจื•ืช ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™.

ื‘ื ื•ืกืฃ, ืœ-Puppet DSL ื™ืฉ ืคื•ื ืงืฆื™ื•ืช ื•ืžืฉืชื ื™ื, ื›ืžื• ื’ื ื”ืฆื”ืจื•ืช ื•ื‘ื•ืจืจื™ื ืžื•ืชื ื™ื. ื’ื ืžื ื’ื ื•ื ื™ ืชื‘ื ื™ื•ืช ืฉื•ื ื™ื ื ืชืžื›ื™ื - EPP ื•-ERB.

Puppet ื›ืชื•ื‘ ื‘ืจื•ื‘ื™, ื›ืš ืฉืจื‘ื™ื ืžื”ืžื‘ื ื™ื ื•ื”ืžื•ื ื—ื™ื ืœืงื•ื—ื™ื ืžืฉื. Ruby ืžืืคืฉืจ ืœืš ืœื”ืจื—ื™ื‘ ืืช Puppet - ืœื”ื•ืกื™ืฃ ืœื•ื’ื™ืงื” ืžื•ืจื›ื‘ืช, ืกื•ื’ื™ื ื—ื“ืฉื™ื ืฉืœ ืžืฉืื‘ื™ื, ืคื•ื ืงืฆื™ื•ืช.

ื‘ื–ืžืŸ ืฉ-Puppet ืคื•ืขืœ, ืžื ื™ืคืกื˜ื™ื ืขื‘ื•ืจ ื›ืœ ืฆื•ืžืช ืกืคืฆื™ืคื™ ื‘ืฉืจืช ืžื•ืจื›ื‘ื™ื ืœืชื•ืš ืกืคืจื™ื™ื”. ืžื“ืจื™ืš ื”ื™ื ืจืฉื™ืžื” ืฉืœ ืžืฉืื‘ื™ื ื•ื”ืงืฉืจื™ื ื‘ื™ื ื™ื”ื ืœืื—ืจ ื—ื™ืฉื•ื‘ ื”ืขืจืš ืฉืœ ืคื•ื ืงืฆื™ื•ืช, ืžืฉืชื ื™ื ื•ื”ืจื—ื‘ื” ืฉืœ ื”ืฆื”ืจื•ืช ืžื•ืชื ื•ืช.

ืชื—ื‘ื™ืจ ื•ืกื’ื ื•ืŸ ืงื•ื“

ืœื”ืœืŸ ืงื˜ืขื™ื ื‘ืชื™ืขื•ื“ ื”ืจืฉืžื™ ืฉื™ืขื–ืจื• ืœืš ืœื”ื‘ื™ืŸ ืืช ื”ืชื—ื‘ื™ืจ ืื ื”ื“ื•ื’ืžืื•ืช ืฉืกื•ืคืงื• ืื™ื ืŸ ืžืกืคื™ืงื•ืช:

ื”ื ื” ื“ื•ื’ืžื” ืื™ืš ื ืจืื” ื”ืžื ื™ืคืกื˜:

# ะšะพะผะผะตะฝั‚ะฐั€ะธะธ ะฟะธัˆัƒั‚ัั, ะบะฐะบ ะธ ะผะฝะพะณะพ ะณะดะต, ะฟะพัะปะต ั€ะตัˆั‘ั‚ะบะธ.
#
# ะžะฟะธัะฐะฝะธะต ะบะพะฝั„ะธะณัƒั€ะฐั†ะธะธ ะฝะพะดั‹ ะฝะฐั‡ะธะฝะฐะตั‚ัั ั ะบะปัŽั‡ะตะฒะพะณะพ ัะปะพะฒะฐ node,
# ะทะฐ ะบะพั‚ะพั€ั‹ะผ ัะปะตะดัƒะตั‚ ัะตะปะตะบั‚ะพั€ ะฝะพะดั‹ โ€” ั…ะพัั‚ะฝะตะนะผ (ั ะดะพะผะตะฝะพะผ ะธะปะธ ะฑะตะท)
# ะธะปะธ ั€ะตะณัƒะปัั€ะฝะพะต ะฒั‹ั€ะฐะถะตะฝะธะต ะดะปั ั…ะพัั‚ะฝะตะนะผะพะฒ, ะธะปะธ ะบะปัŽั‡ะตะฒะพะต ัะปะพะฒะพ default.
#
# ะŸะพัะปะต ัั‚ะพะณะพ ะฒ ั„ะธะณัƒั€ะฝั‹ั… ัะบะพะฑะบะฐั… ะพะฟะธัั‹ะฒะฐะตั‚ัั ัะพะฑัั‚ะฒะตะฝะฝะพ ะบะพะฝั„ะธะณัƒั€ะฐั†ะธั ะฝะพะดั‹.
#
# ะžะดะฝะฐ ะธ ั‚ะฐ ะถะต ะฝะพะดะฐ ะผะพะถะตั‚ ะฟะพะฟะฐัั‚ัŒ ะฟะพะด ะฝะตัะบะพะปัŒะบะพ ัะตะปะตะบั‚ะพั€ะพะฒ. ะŸั€ะพ ะฟั€ะธะพั€ะธั‚ะตั‚
# ัะตะปะตะบั‚ะพั€ะพะฒ ะฝะฐะฟะธัะฐะฝะพ ะฒ ัั‚ะฐั‚ัŒะต ะฟั€ะพ ัะธะฝั‚ะฐะบัะธั ะพะฟะธัะฐะฝะธั ะฝะพะด.
node 'hostname', 'f.q.d.n', /regexp/ {
  # ะšะพะฝั„ะธะณัƒั€ะฐั†ะธั ะฟะพ ััƒั‚ะธ ัะฒะปัะตั‚ัั ะฟะตั€ะตั‡ะธัะปะตะฝะธะตะผ ั€ะตััƒั€ัะพะฒ ะธ ะธั… ะฟะฐั€ะฐะผะตั‚ั€ะพะฒ.
  #
  # ะฃ ะบะฐะถะดะพะณะพ ั€ะตััƒั€ัะฐ ะตัั‚ัŒ ั‚ะธะฟ ะธ ะฝะฐะทะฒะฐะฝะธะต.
  #
  # ะ’ะฝะธะผะฐะฝะธะต: ะฝะต ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ะดะฒัƒั… ั€ะตััƒั€ัะพะฒ ะพะดะฝะพะณะพ ั‚ะธะฟะฐ ั ะพะดะธะฝะฐะบะพะฒั‹ะผะธ ะฝะฐะทะฒะฐะฝะธัะผะธ!
  #
  # ะžะฟะธัะฐะฝะธะต ั€ะตััƒั€ัะฐ ะฝะฐั‡ะธะฝะฐะตั‚ัั ั ะตะณะพ ั‚ะธะฟะฐ. ะขะธะฟ ะฟะธัˆะตั‚ัั ะฒ ะฝะธะถะฝะตะผ ั€ะตะณะธัั‚ั€ะต.
  # ะŸั€ะพ ั€ะฐะทะฝั‹ะต ั‚ะธะฟั‹ ั€ะตััƒั€ัะพะฒ ะฝะฐะฟะธัะฐะฝะพ ะฝะธะถะต.
  #
  # ะŸะพัะปะต ั‚ะธะฟะฐ ะฒ ั„ะธะณัƒั€ะฝั‹ั… ัะบะพะฑะบะฐั… ะฟะธัˆะตั‚ัั ะฝะฐะทะฒะฐะฝะธะต ั€ะตััƒั€ัะฐ, ะฟะพั‚ะพะผ ะดะฒะพะตั‚ะพั‡ะธะต,
  # ะดะฐะปัŒัˆะต ะธะดั‘ั‚ ะพะฟั†ะธะพะฝะฐะปัŒะฝะพะต ะฟะตั€ะตั‡ะธัะปะตะฝะธะต ะฟะฐั€ะฐะผะตั‚ั€ะพะฒ ั€ะตััƒั€ัะฐ ะธ ะธั… ะทะฝะฐั‡ะตะฝะธะน.
  # ะ—ะฝะฐั‡ะตะฝะธั ะฟะฐั€ะฐะผะตั‚ั€ะพะฒ ัƒะบะฐะทั‹ะฒะฐัŽั‚ัั ั‡ะตั€ะตะท ั‚.ะฝ. hash rocket (=>).
  resource { 'title':
    param1 => value1,
    param2 => value2,
    param3 => value3,
  }
}

ื”ื–ื—ื” ื•ืžืขื‘ืจื™ ืฉื•ืจื•ืช ืื™ื ื ื—ืœืง ื—ื•ื‘ื” ืžื”ืžื ื™ืคืกื˜, ืื‘ืœ ื™ืฉ ื”ืžืœืฆื” ืžื“ืจื™ืš ื‘ืกื’ื ื•ืŸ. ืกื™ื›ื•ื:

  • ื›ื ื™ืกื•ืช ืฉื ื™ ืจื•ื•ื—ื™ื, ืœื ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ื˜ืื‘ื™ื.
  • ืคืœื˜ื” ืžืชื•ืœืชืœืช ืžื•ืคืจื“ืช ืขืœ ื™ื“ื™ ืจื•ื•ื—; ื ืงื•ื“ืชื™ื™ื ืื™ื ื ืžื•ืคืจื“ื™ื ืขืœ ื™ื“ื™ ืจื•ื•ื—.
  • ืคืกื™ืงื™ื ืื—ืจื™ ื›ืœ ืคืจืžื˜ืจ, ื›ื•ืœืœ ื”ืื—ืจื•ืŸ. ื›ืœ ืคืจืžื˜ืจ ื ืžืฆื ื‘ืฉื•ืจื” ื ืคืจื“ืช. ื ืขืฉื” ื—ืจื™ื’ ืœืžืงืจื” ืœืœื ืคืจืžื˜ืจื™ื ื•ืคืจืžื˜ืจ ืื—ื“: ื ื™ืชืŸ ืœื›ืชื•ื‘ ื‘ืฉื•ืจื” ืื—ืช ื•ืœืœื ืคืกื™ืง (ื›ืœื•ืžืจ. resource { 'title': } ะธ resource { 'title': param => value }).
  • ื”ื—ืฆื™ื ืขืœ ื”ืคืจืžื˜ืจื™ื ืฆืจื™ื›ื™ื ืœื”ื™ื•ืช ื‘ืื•ืชื” ืจืžื”.
  • ืœืคื ื™ื”ื ื ื›ืชื‘ื™ื ื—ื™ืฆื™ื ืœื™ื—ืกื™ ืžืฉืื‘ื™ื.

ืžื™ืงื•ื ื”ืงื‘ืฆื™ื ื‘-pappetserver

ืœื”ืกื‘ืจ ื ื•ืกืฃ, ืืฆื™ื’ ืืช ื”ืžื•ืฉื’ "ืกืคืจื™ื™ืช ืฉื•ืจืฉ". ืกืคืจื™ื™ืช ื”ืฉื•ืจืฉ ื”ื™ื ื”ืกืคืจื™ื™ื” ื”ืžื›ื™ืœื” ืืช ืชืฆื•ืจืช Puppet ืขื‘ื•ืจ ืฆื•ืžืช ืกืคืฆื™ืคื™.

ืกืคืจื™ื™ืช ื”ืฉื•ืจืฉ ืžืฉืชื ื” ื‘ื”ืชืื ืœื’ืจืกืช Puppet ื•ืœืกื‘ื™ื‘ื•ืช ืฉื‘ื”ืŸ ื ืขืฉื” ืฉื™ืžื•ืฉ. ืกื‘ื™ื‘ื•ืช ื”ืŸ ืงื‘ื•ืฆื•ืช ืขืฆืžืื™ื•ืช ืฉืœ ืชืฆื•ืจื” ื”ืžืื•ื—ืกื ื•ืช ื‘ืกืคืจื™ื•ืช ื ืคืจื“ื•ืช. ืžืฉืžืฉ ื‘ื“ืจืš ื›ืœืœ ื‘ืฉื™ืœื•ื‘ ืขื git, ื•ื‘ืžืงืจื” ื–ื” ื ื•ืฆืจื•ืช ืกื‘ื™ื‘ื•ืช ืžืขื ืคื™ git. ื‘ื”ืชืื ืœื›ืš, ื›ืœ ืฆื•ืžืช ืžืžื•ืงื ื‘ืกื‘ื™ื‘ื” ื›ื–ื• ืื• ืื—ืจืช. ื ื™ืชืŸ ืœื”ื’ื“ื™ืจ ื–ืืช ื‘ืฆื•ืžืช ืขืฆืžื•, ืื• ื‘-ENC, ืฉืขืœื™ื• ืื“ื‘ืจ ื‘ืžืืžืจ ื”ื‘ื.

  • ื‘ื’ืจืกื” ื”ืฉืœื™ืฉื™ืช ("ื‘ื•ื‘ื” ื”ื™ืฉื ื”") ืกืคืจื™ื™ืช ื”ื‘ืกื™ืก ื”ื™ื™ืชื” /etc/puppet. ื”ืฉื™ืžื•ืฉ ื‘ืกื‘ื™ื‘ื•ืช ื”ื•ื ืื•ืคืฆื™ื•ื ืœื™ - ืœืžืฉืœ, ืื ื—ื ื• ืœื ืžืฉืชืžืฉื™ื ื‘ื”ืŸ ืขื Puppet ื”ื™ืฉืŸ. ืื ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ืกื‘ื™ื‘ื•ืช, ื”ืŸ ืžืื•ื—ืกื ื•ืช ื‘ื“ืจืš ื›ืœืœ ื‘ /etc/puppet/environments, ืกืคืจื™ื™ืช ื”ืฉื•ืจืฉ ืชื”ื™ื” ืกืคืจื™ื™ืช ื”ืกื‘ื™ื‘ื”. ืื ืœื ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ืกื‘ื™ื‘ื•ืช, ืกืคืจื™ื™ืช ื”ื‘ืกื™ืก ืชื”ื™ื” ืกืคืจื™ื™ืช ื”ื‘ืกื™ืก.
  • ื”ื—ืœ ืžื”ื’ืจืกื” ื”ืจื‘ื™ืขื™ืช ("ื‘ื•ื‘ื” ื—ื“ืฉื”"), ื”ืฉื™ืžื•ืฉ ื‘ืกื‘ื™ื‘ื•ืช ื”ืคืš ืœื—ื•ื‘ื”, ื•ืกืคืจื™ื™ืช ื”ื‘ืกื™ืก ื”ื•ืขื‘ืจื” ืœ- /etc/puppetlabs/code. ื‘ื”ืชืื ืœื›ืš, ืกื‘ื™ื‘ื•ืช ืžืื•ื—ืกื ื•ืช ื‘ /etc/puppetlabs/code/environments, ืกืคืจื™ื™ืช ืฉื•ืจืฉ ื”ื™ื ืกืคืจื™ื™ืช ื”ืกื‘ื™ื‘ื”.

ื—ื™ื™ื‘ืช ืœื”ื™ื•ืช ืกืคืจื™ื™ืช ืžืฉื ื” ื‘ืกืคืจื™ื™ืช ื”ื‘ืกื™ืก manifests, ื”ืžื›ื™ืœ ืžื ื™ืคืกื˜ ืื—ื“ ืื• ื™ื•ืชืจ ื”ืžืชืืจ ืืช ื”ืฆืžืชื™ื. ื‘ื ื•ืกืฃ, ืฆืจื™ื›ื” ืœื”ื™ื•ืช ืกืคืจื™ื™ืช ืžืฉื ื” modules, ื”ืžื›ื™ืœ ืืช ื”ืžื•ื“ื•ืœื™ื. ืื ื™ ืื’ื™ื“ ืœืš ืžื” ื”ื ื”ืžื•ื“ื•ืœื™ื ืงืฆืช ืžืื•ื—ืจ ื™ื•ืชืจ. ื‘ื ื•ืกืฃ, ืœ-Puppet ื”ื™ืฉืŸ ืขืฉื•ื™ื” ืœื”ื™ื•ืช ื’ื ืกืคืจื™ื™ืช ืžืฉื ื” files, ืฉืžื›ื™ืœ ืงื‘ืฆื™ื ืฉื•ื ื™ื ืฉืื ื• ืžืขืชื™ืงื™ื ืœืฆืžืชื™ื. ื‘-Puppet ื”ื—ื“ืฉ, ื›ืœ ื”ืงื‘ืฆื™ื ืžืžื•ืงืžื™ื ื‘ืžื•ื“ื•ืœื™ื.

ืœืงื‘ืฆื™ ืžื ื™ืคืกื˜ ื™ืฉ ืืช ื”ืกื™ื•ืžืช .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

ืกื•ื’ื™ ืžืฉืื‘ื™ื

ืจืฉื™ืžื” ืžืœืื” ืฉืœ ืกื•ื’ื™ ืžืฉืื‘ื™ื ื ืชืžื›ื™ื ื ื™ืชืŸ ืœืžืฆื•ื ื›ืืŸ ื‘ืชื™ืขื•ื“, ื›ืืŸ ืืชืืจ ื—ืžื™ืฉื” ืกื•ื’ื™ื ื‘ืกื™ืกื™ื™ื, ืฉื‘ืคืจืงื˜ื™ืงื” ืฉืœื™ ืžืกืคื™ืงื™ื ื›ื“ื™ ืœืคืชื•ืจ ืืช ืจื•ื‘ ื”ื‘ืขื™ื•ืช.

ืคื™ืœื”

ืžื ื”ืœ ืงื‘ืฆื™ื, ืกืคืจื™ื•ืช, ืกื™ืžืœื™ื ืงื™ื, ืชื•ื›ื ื ื•ื–ื›ื•ื™ื•ืช ื’ื™ืฉื”.

ืคืจืžื˜ืจื™ื:

  • ืฉื ื”ืžืฉืื‘ - ื ืชื™ื‘ ืœืงื•ื‘ืฅ (ืื•ืคืฆื™ื•ื ืœื™)
  • ื ืชื™ื‘ - ื ืชื™ื‘ ืœืงื•ื‘ืฅ (ืื ื”ื•ื ืœื ืžืฆื•ื™ืŸ ื‘ืฉื)
  • ืœึฐื”ึทื‘ื˜ึดื™ื—ึท - ืกื•ื’ ืงื•ื‘ืฅ:
    • absent - ืœืžื—ื•ืง ืงื•ื‘ืฅ
    • present - ื—ื™ื™ื‘ ืœื”ื™ื•ืช ืงื•ื‘ืฅ ืžื›ืœ ืกื•ื’ (ืื ืื™ืŸ ืงื•ื‘ืฅ, ื™ื™ื•ื•ืฆืจ ืงื•ื‘ืฅ ืจื’ื™ืœ)
    • file - ืงื•ื‘ืฅ ืจื’ื™ืœ
    • directory - ืกืคืจื™ื™ื”
    • link - ืงื™ืฉื•ืจ ืกื™ืžืœื™
  • ืชื•ื›ืŸ - ืชื•ื›ืŸ ื”ืงื•ื‘ืฅ (ืžืชืื™ื ืจืง ืœืงื‘ืฆื™ื ืจื’ื™ืœื™ื, ืœื ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื™ื—ื“ ืขื ืžึธืงื•ึนืจ ืื• ื™ืขื“)
  • ืžึธืงื•ึนืจ - ืงื™ืฉื•ืจ ืœื ืชื™ื‘ ืฉืžืžื ื• ื‘ืจืฆื•ื ืš ืœื”ืขืชื™ืง ืืช ืชื•ื›ืŸ ื”ืงื•ื‘ืฅ (ืœื ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ื• ื™ื—ื“ ืขื ืชื•ื›ืŸ ืื• ื™ืขื“). ื ื™ืชืŸ ืœืฆื™ื™ืŸ ื›-URI ืขื ืกื›ืžื” puppet: (ื•ืื– ื™ืขืฉื” ืฉื™ืžื•ืฉ ื‘ืงื‘ืฆื™ื ืžืฉืจืช ื”ื‘ื•ื‘ื•ืช), ื•ืขื ื”ืกื›ืžื” http: (ืื ื™ ืžืงื•ื•ื” ืฉื‘ืจื•ืจ ืžื” ื™ืงืจื” ื‘ืžืงืจื” ื”ื–ื”), ื•ืืคื™ืœื• ืขื ื”ืชืจืฉื™ื file: ืื• ื›ื ืชื™ื‘ ืžื•ื—ืœื˜ ืœืœื ืกื›ืžื” (ื•ืื– ื™ืฉืžืฉ ื”ืงื•ื‘ืฅ ืžื”-FS ื”ืžืงื•ืžื™ ื‘ืฆื•ืžืช)
  • ื™ืขื“ - ื”ื™ื›ืŸ ืฆืจื™ืš ืœื”ืฆื‘ื™ืข ื”-Symlink (ืœื ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื™ื—ื“ ืขื ืชื•ื›ืŸ ืื• ืžึธืงื•ึนืจ)
  • ื‘ืขืœื™ื - ื”ืžืฉืชืžืฉ ืฉืืžื•ืจ ืœื”ื™ื•ืช ื”ื‘ืขืœื™ื ืฉืœ ื”ืงื•ื‘ืฅ
  • ืงื‘ื•ืฆื” - ื”ืงื‘ื•ืฆื” ืฉืืœื™ื” ื”ืงื•ื‘ืฅ ืืžื•ืจ ืœื”ืฉืชื™ื™ืš
  • ืžืฆื‘ - ื”ืจืฉืื•ืช ืงื•ื‘ืฅ (ื›ืžื—ืจื•ื–ืช)
  • ืœื”ื—ื–ื™ืจ - ืžืืคืฉืจ ืขื™ื‘ื•ื“ ืกืคืจื™ื•ืช ืจืงื•ืจืกื™ื‘ื™
  • ืœื˜ื”ืจ - ืžืืคืฉืจ ืžื—ื™ืงืช ืงื‘ืฆื™ื ืฉืื™ื ื ืžืชื•ืืจื™ื ื‘-Puppet
  • ื›ึผื•ึนื—ึท - ืžืืคืฉืจ ืžื—ื™ืงืช ืกืคืจื™ื•ืช ืฉืื™ื ืŸ ืžืชื•ืืจื•ืช ื‘-Puppet

ื—ื‘ื™ืœื”

ืžืชืงื™ืŸ ื•ืžืกื™ืจ ื—ื‘ื™ืœื•ืช. ืžืกื•ื’ืœ ืœื˜ืคืœ ื‘ื”ืชืจืื•ืช - ืžืชืงื™ืŸ ืžื—ื“ืฉ ืืช ื”ื—ื‘ื™ืœื” ืื ื”ืคืจืžื˜ืจ ืฆื•ื™ืŸ reinstall_on_refresh.

ืคืจืžื˜ืจื™ื:

  • ืฉื ื”ืžืฉืื‘ - ืฉื ื—ื‘ื™ืœื” (ืื•ืคืฆื™ื•ื ืœื™)
  • ืฉื - ืฉื ื”ื—ื‘ื™ืœื” (ืื ืœื ืžืฆื•ื™ืŸ ื‘ืฉื)
  • ืกืคืง - ืžื ื”ืœ ื—ื‘ื™ืœื•ืช ืœืฉื™ืžื•ืฉ
  • ืœึฐื”ึทื‘ื˜ึดื™ื—ึท - ื”ืžืฆื‘ ื”ืจืฆื•ื™ ืฉืœ ื”ื—ื‘ื™ืœื”:
    • present, installed - ื›ืœ ื’ืจืกื” ืžื•ืชืงื ืช
    • latest - ื”ื’ืจืกื” ื”ืื—ืจื•ื ื” ืžื•ืชืงื ืช
    • absent - ื ืžื—ืง (apt-get remove)
    • purged - ื ืžื—ืง ื™ื—ื“ ืขื ืงื‘ืฆื™ ืชืฆื•ืจื” (apt-get purge)
    • held - ื’ืจืกืช ื”ื—ื‘ื™ืœื” ื ืขื•ืœื” (apt-mark hold)
    • ะปัŽะฑะฐั ะดั€ัƒะณะฐั ัั‚ั€ะพะบะฐ - ื”ื’ืจืกื” ืฉืฆื•ื™ื ื” ืžื•ืชืงื ืช
  • reinstall_on_refresh - ืื true, ืœืื—ืจ ืžื›ืŸ ืขื ืงื‘ืœืช ื”ื”ื•ื“ืขื” ื”ื—ื‘ื™ืœื” ืชื•ืชืงืŸ ืžื—ื“ืฉ. ืฉื™ืžื•ืฉื™ ืขื‘ื•ืจ ื”ืคืฆื•ืช ืžื‘ื•ืกืกื•ืช ืžืงื•ืจ, ืฉื‘ื”ืŸ ื™ื™ืชื›ืŸ ืฉื™ื”ื™ื” ืฆื•ืจืš ื‘ื‘ื ื™ื™ื” ืžื—ื“ืฉ ืฉืœ ื—ื‘ื™ืœื•ืช ื‘ืขืช ืฉื™ื ื•ื™ ืคืจืžื˜ืจื™ ื‘ื ื™ื™ื”. ื‘ึผึฐืจึดื™ืจึทืช ืžึถื—ื“ึธืœ false.

ืฉืจื•ืช

ืžื ื”ืœ ืฉื™ืจื•ืชื™ื. ืžืกื•ื’ืœ ืœืขื‘ื“ ื”ื•ื“ืขื•ืช - ืžืคืขื™ืœ ืžื—ื“ืฉ ืืช ื”ืฉื™ืจื•ืช.

ืคืจืžื˜ืจื™ื:

  • ืฉื ื”ืžืฉืื‘ - ืฉื™ืจื•ืช ืœื ื™ื”ื•ืœ (ืื•ืคืฆื™ื•ื ืœื™)
  • ืฉื - ื”ืฉื™ืจื•ืช ืฉืฆืจื™ืš ืœื ื”ืœ (ืื ืœื ืžืฆื•ื™ืŸ ื‘ืฉื)
  • ืœึฐื”ึทื‘ื˜ึดื™ื—ึท - ื”ืžืฆื‘ ื”ืจืฆื•ื™ ืฉืœ ื”ืฉื™ืจื•ืช:
    • running - ื”ื•ืฉืง
    • stopped - ืขืฆืจ
  • ืœืืคืฉืจ - ืฉื•ืœื˜ ื‘ื™ื›ื•ืœืช ืœื”ืคืขื™ืœ ืืช ื”ืฉื™ืจื•ืช:
    • true - ื”ืคืขืœื” ืื•ื˜ื•ืžื˜ื™ืช ืžื•ืคืขืœืช (systemctl enable)
    • mask - ืžื—ื•ืคืฉ (systemctl mask)
    • false - ื”ืคืขืœื” ืื•ื˜ื•ืžื˜ื™ืช ืžื•ืฉื‘ืชืช (systemctl disable)
  • ื”ืคืขืœื” ืžื—ื“ืฉ - ืคืงื•ื“ื” ื›ื“ื™ ืœื”ืคืขื™ืœ ืžื—ื“ืฉ ืืช ื”ืฉื™ืจื•ืช
  • ืžืฆื‘ โ€” ืคืงื•ื“ื” ืœื‘ื“ื™ืงืช ืžืฆื‘ ื”ืฉื™ืจื•ืช
  • ื™ืฉ ื”ืคืขืœื” ืžื—ื“ืฉ โ€” ืฆื™ื™ืŸ ืื ื”-initscript ืฉืœ ื”ืฉื™ืจื•ืช ืชื•ืžืš ื‘ื”ืคืขืœื” ืžื—ื“ืฉ. ืื false ื•ื”ืคืจืžื˜ืจ ืžืฆื•ื™ืŸ ื”ืคืขืœื” ืžื—ื“ืฉ - ื”ืขืจืš ืฉืœ ืคืจืžื˜ืจ ื–ื” ืžืฉืžืฉ. ืื false ื•ืคืจืžื˜ืจ ื”ืคืขืœื” ืžื—ื“ืฉ ืœื ืฆื•ื™ืŸ - ื”ืฉื™ืจื•ืช ื ืขืฆืจ ื•ืžืชื—ื™ืœ ืœื”ืคืขื™ืœ ืžื—ื“ืฉ (ืืš systemd ืžืฉืชืžืฉ ื‘ืคืงื•ื“ื” systemctl restart).
  • hasstatus โ€” ืฆื™ื™ืŸ ืื ื”-initscript ืฉืœ ื”ืฉื™ืจื•ืช ืชื•ืžืš ื‘ืคืงื•ื“ื” status. ืื false, ืื– ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ืขืจืš ื”ืคืจืžื˜ืจ ืžืฆื‘. ื‘ึผึฐืจึดื™ืจึทืช ืžึถื—ื“ึธืœ true.

Exec

ืžืคืขื™ืœ ืคืงื•ื“ื•ืช ื—ื™ืฆื•ื ื™ื•ืช. ืื ืœื ืชืฆื™ื™ืŸ ืคืจืžื˜ืจื™ื ื™ื•ืฆืจ, ืจืง ืื, ืืœื ืื ื›ืŸ ืื• ื‘ืื•ืคืŸ ืจืขื ื•ืŸ, ื”ืคืงื•ื“ื” ืชื•ืคืขืœ ื‘ื›ืœ ืคืขื ืฉ-Puppet ืžื•ืคืขืœ. ืžืกื•ื’ืœ ืœืขื‘ื“ ื”ืชืจืื•ืช - ืžืคืขื™ืœ ืคืงื•ื“ื”.

ืคืจืžื˜ืจื™ื:

  • ืฉื ื”ืžืฉืื‘ - ืคืงื•ื“ื” ืœื‘ื™ืฆื•ืข (ืื•ืคืฆื™ื•ื ืœื™)
  • ื”ืคืงื•ื“ื” - ื”ืคืงื•ื“ื” ืฉื™ืฉ ืœื‘ืฆืข (ืื ื”ื™ื ืœื ืฆื•ื™ื ื” ื‘ืฉื)
  • ื ืชื™ื‘ - ื ืชื™ื‘ื™ื ืฉื‘ื”ื ื ื™ืชืŸ ืœื—ืคืฉ ืืช ืงื•ื‘ืฅ ื”ื”ืคืขืœื”
  • ืจืง ืื - ืื ื”ืคืงื•ื“ื” ื”ืžืฆื•ื™ื ืช ื‘ืคืจืžื˜ืจ ื–ื” ื”ื•ืฉืœืžื” ืขื ืงื•ื“ ื”ื—ื–ืจื” ืืคืก, ื”ืคืงื•ื“ื” ื”ืจืืฉื™ืช ืชืชื‘ืฆืข
  • ืืœื ืื ื›ืŸ - ืื ื”ืคืงื•ื“ื” ื”ืžืฆื•ื™ื ืช ื‘ืคืจืžื˜ืจ ื–ื” ื”ื•ืฉืœืžื” ืขื ืงื•ื“ ื”ื—ื–ืจื” ืฉืื™ื ื• ืืคืก, ื”ืคืงื•ื“ื” ื”ืจืืฉื™ืช ืชืชื‘ืฆืข
  • ื™ื•ืฆืจ - ืื ื”ืงื•ื‘ืฅ ืฉืฆื•ื™ืŸ ื‘ืคืจืžื˜ืจ ื–ื” ืื™ื ื• ืงื™ื™ื, ื”ืคืงื•ื“ื” ื”ืจืืฉื™ืช ืชืชื‘ืฆืข
  • ื‘ืื•ืคืŸ ืจืขื ื•ืŸ - ืื true, ืื– ื”ืคืงื•ื“ื” ืชื•ืคืขืœ ืจืง ื›ืืฉืจ ื”ืžื ื”ืœ ื”ื–ื” ื™ืงื‘ืœ ื”ื•ื“ืขื” ืžืžืฉืื‘ื™ื ืื—ืจื™ื
  • cwd - ืกืคืจื™ื™ื” ืฉืžืžื ื” ืชืคืขื™ืœ ืืช ื”ืคืงื•ื“ื”
  • ื”ืžืฉืชืžืฉ - ื”ืžืฉืชืžืฉ ืฉืžืžื ื• ืœื”ืคืขื™ืœ ืืช ื”ืคืงื•ื“ื”
  • ืกืคืง - ื›ื™ืฆื“ ืœื”ืคืขื™ืœ ืืช ื”ืคืงื•ื“ื”:
    • ืคื•ืกื™ืงืก - ืชื”ืœื™ืš ื™ืœื“ ืคืฉื•ื˜ ื ื•ืฆืจ, ื”ืงืคื“ ืœืฆื™ื™ืŸ ื ืชื™ื‘
    • ืคึผึธื’ึธื– - ื”ืคืงื•ื“ื” ืžื•ืคืขืœืช ื‘ืžืขื˜ืคืช /bin/sh, ืœื ื ื™ืชืŸ ืœืฆื™ื™ืŸ ื ืชื™ื‘, ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ื’ืœื•ื‘ื™ื ื’, ืฆื™ื ื•ืจื•ืช ื•ืชื›ื•ื ื•ืช ืคื’ื– ืื—ืจื•ืช. ื‘ื“ืจืš ื›ืœืœ ืžื–ื•ื”ื” ืื•ื˜ื•ืžื˜ื™ืช ืื ื™ืฉ ืชื•ื•ื™ื ืžื™ื•ื—ื“ื™ื (|, ;, &&, || ื•ื›ื•).

cron

ืฉื•ืœื˜ ื‘-cronjobs.

ืคืจืžื˜ืจื™ื:

  • ืฉื ื”ืžืฉืื‘ - ืจืง ืกื•ื’ ืฉืœ ืžื–ื”ื”
  • ืœึฐื”ึทื‘ื˜ึดื™ื—ึท - ืžืฆื‘ ื›ืชืจ:
    • present - ืฆื•ืจ ืื ืื™ื ื• ืงื™ื™ื
    • absent - ืœืžื—ื•ืง ืื ืงื™ื™ื
  • ื”ืคืงื•ื“ื” - ืื™ื–ื• ืคืงื•ื“ื” ืœื”ืคืขื™ืœ
  • ืกื‘ื™ื‘ื” - ื‘ืื™ื–ื• ืกื‘ื™ื‘ื” ืœื”ืคืขื™ืœ ืืช ื”ืคืงื•ื“ื” (ืจืฉื™ืžืช ืžืฉืชื ื™ ืกื‘ื™ื‘ื” ื•ื”ืขืจื›ื™ื ืฉืœื”ื ื‘ืืžืฆืขื•ืช =)
  • ื”ืžืฉืชืžืฉ - ืžืื™ื–ื” ืžืฉืชืžืฉ ืœื”ืคืขื™ืœ ืืช ื”ืคืงื•ื“ื”
  • ื“ืงื”, ืฉืขื”, ื™ื•ื ื—ื•ืœ, ื—ื•ื“ืฉ, ื™ื•ื ื—ื•ื“ืฉ - ืžืชื™ ืœื”ืคืขื™ืœ cron. ืื ืื—ืช ืžื”ืชื›ื•ื ื•ืช ื”ืœืœื• ืœื ืฆื•ื™ื ื”, ื”ืขืจืš ืฉืœื” ื‘-crontab ื™ื”ื™ื” *.

ื‘-Puppet 6.0 cron ื›ืื™ืœื• ื”ื•ืกืจ ืžื”ืงื•ืคืกื” ื‘-puppetserver, ื›ืš ืฉืื™ืŸ ืชื™ืขื•ื“ ื‘ืืชืจ ื”ื›ืœืœื™. ืื‘ืœ ื”ื•ื ื ืžืฆื ื‘ืงื•ืคืกื” ื‘-puppet-agent, ื›ืš ืฉืื™ืŸ ืฆื•ืจืš ืœื”ืชืงื™ืŸ ืื•ืชื• ื‘ื ืคืจื“. ืืชื” ื™ื›ื•ืœ ืœืจืื•ืช ืืช ื”ืชื™ืขื•ื“ ืฉืœ ื–ื” ื‘ืชื™ืขื•ื“ ืœื’ืจืกื” ื”ื—ืžื™ืฉื™ืช ืฉืœ Puppetืื• ื‘-GitHub.

ืขืœ ืžืฉืื‘ื™ื ื‘ืื•ืคืŸ ื›ืœืœื™

ื“ืจื™ืฉื•ืช ืœื™ื™ื—ื•ื“ื™ื•ืช ื”ืžืฉืื‘

ื”ื˜ืขื•ืช ื”ื ืคื•ืฆื” ื‘ื™ื•ืชืจ ืฉืื ื• ื ืชืงืœื™ื ื‘ื” ื”ื™ื ื”ืฆื”ืจื” ื›ืคื•ืœื”. ืฉื’ื™ืื” ื–ื• ืžืชืจื—ืฉืช ื›ืืฉืจ ืฉื ื™ ืžืฉืื‘ื™ื ืื• ื™ื•ืชืจ ืžืื•ืชื• ืกื•ื’ ืขื ืื•ืชื• ืฉื ืžื•ืคื™ืขื™ื ื‘ืกืคืจื™ื™ื”.

ืœื›ืŸ ืื›ืชื•ื‘ ืฉื•ื‘: ืžื ื™ืคืกื˜ื™ื ืขื‘ื•ืจ ืื•ืชื• ืฆื•ืžืช ืื™ื ื ืฆืจื™ื›ื™ื ืœื”ื›ื™ืœ ืžืฉืื‘ื™ื ืžืื•ืชื• ืกื•ื’ ืขื ืื•ืชื” ื›ื•ืชืจืช!

ืœืคืขืžื™ื ื™ืฉ ืฆื•ืจืš ืœื”ืชืงื™ืŸ ื—ื‘ื™ืœื•ืช ืขื ืื•ืชื• ืฉื, ืื‘ืœ ืขื ืžื ื”ืœื™ ื—ื‘ื™ืœื•ืช ืฉื•ื ื™ื. ื‘ืžืงืจื” ื–ื”, ืขืœื™ืš ืœื”ืฉืชืžืฉ ื‘ืคืจืžื˜ืจ nameื›ื“ื™ ืœืžื ื•ืข ืืช ื”ืฉื’ื™ืื”:

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

ืœืกื•ื’ื™ ืžืฉืื‘ื™ื ืื—ืจื™ื ื™ืฉ ืืคืฉืจื•ื™ื•ืช ื“ื•ืžื•ืช ื›ื“ื™ ืœืžื ื•ืข ื›ืคื™ืœื•ืช - name ัƒ ืฉืจื•ืช, command ัƒ Exec, ื•ื›ื•ืœื™.

ืžื˜ื ืคืจืžื˜ืจื™ื

ืœื›ืœ ืกื•ื’ ืžืฉืื‘ ื™ืฉ ื›ืžื” ืคืจืžื˜ืจื™ื ืžื™ื•ื—ื“ื™ื, ืœืœื ืงืฉืจ ืœืื•ืคื™ื•.

ืจืฉื™ืžื” ืžืœืื” ืฉืœ ืžื˜ื ืคืจืžื˜ืจื™ื ื‘ืชื™ืขื•ื“ Puppet.

ืจืฉื™ืžื” ืงืฆืจื”:

  • ืœื“ืจื•ืฉ - ืคืจืžื˜ืจ ื–ื” ืžืฆื™ื™ืŸ ื‘ืื™ืœื• ืžืฉืื‘ื™ื ืชืœื•ื™ ืžืฉืื‘ ื–ื”.
  • ืœืคื ื™ - ืคืจืžื˜ืจ ื–ื” ืžืฆื™ื™ืŸ ืื™ืœื• ืžืฉืื‘ื™ื ืชืœื•ื™ื™ื ื‘ืžืฉืื‘ ื–ื”.
  • ื”ื™ืจืฉืžื• - ืคืจืžื˜ืจ ื–ื” ืžืฆื™ื™ืŸ ืžืื™ืœื• ืžืฉืื‘ื™ื ืžืฉืื‘ ื–ื” ืžืงื‘ืœ ื”ื•ื“ืขื•ืช.
  • ืชื•ื“ื™ืข โ€” ืคืจืžื˜ืจ ื–ื” ืžืฆื™ื™ืŸ ืื™ืœื• ืžืฉืื‘ื™ื ืžืงื‘ืœื™ื ื”ื•ื“ืขื•ืช ืžืžืฉืื‘ ื–ื”.

ื›ืœ ื”ืžื˜ื-ืคืจืžื˜ืจื™ื ื”ืžืคื•ืจื˜ื™ื ืžืงื‘ืœื™ื ืงื™ืฉื•ืจ ืžืฉืื‘ ื‘ื•ื“ื“ ืื• ืžืขืจืš ืฉืœ ืงื™ืฉื•ืจื™ื ื‘ืกื•ื’ืจื™ื™ื ืžืจื•ื‘ืขื™ื.

ืงื™ืฉื•ืจื™ื ืœืžืฉืื‘ื™ื

ืงื™ืฉื•ืจ ืœืžืฉืื‘ ื”ื•ื ืคืฉื•ื˜ ืื–ื›ื•ืจ ืฉืœ ื”ืžืฉืื‘. ื”ื ืžืฉืžืฉื™ื ื‘ืขื™ืงืจ ืœืฆื™ื•ืŸ ืชืœื•ืช. ื”ืคื ื™ื” ืœืžืฉืื‘ ืœื ืงื™ื™ื ื™ื’ืจื•ื ืœืฉื’ื™ืืช ืงื•ืžืคื™ืœืฆื™ื”.

ื”ืชื—ื‘ื™ืจ ืฉืœ ื”ืงื™ืฉื•ืจ ื”ื•ื ื›ื“ืœืงืžืŸ: ืกื•ื’ ืžืฉืื‘ ื‘ืื•ืช ื’ื“ื•ืœื” (ืื ืฉื ื”ืกื•ื’ ืžื›ื™ืœ ื ืงื•ื“ืชื™ื™ื ื›ืคื•ืœื•ืช, ืื– ื›ืœ ื—ืœืง ืžื”ืฉื ื‘ื™ืŸ ื”ื ืงื•ื“ื•ืชื™ื™ื ื‘ืื•ืชื™ื•ืช ื’ื“ื•ืœื•ืช), ื•ืื– ืฉื ื”ืžืฉืื‘ ื‘ืกื•ื’ืจื™ื™ื ืžืจื•ื‘ืขื™ื (ื”ืžืงืจื” ืฉืœ ื”ืฉื ืœื ืžืฉืชื ื”!). ืœื ืฆืจื™ื›ื™ื ืœื”ื™ื•ืช ืจื•ื•ื—ื™ื; ืกื•ื’ืจื™ื™ื ืžืจื•ื‘ืขื™ื ื ื›ืชื‘ื™ื ืžื™ื“ ืื—ืจื™ ืฉื ื”ืกื•ื’.

ืœื“ื•ื’ืžื”:

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

ืชืœื•ืช ื•ื”ืชืจืื•ืช

ืชื™ืขื•ื“ ื›ืืŸ.

ื›ืคื™ ืฉื ืืžืจ ืงื•ื“ื ืœื›ืŸ, ืชืœื•ืช ืคืฉื•ื˜ื” ื‘ื™ืŸ ืžืฉืื‘ื™ื ื”ื™ื ื˜ืจื ื–ื™ื˜ื™ื‘ื™ืช. ืื’ื‘, ื”ื™ื–ื”ืจ ื‘ืขืช ื”ื•ืกืคืช ืชืœื•ืช - ืืชื” ื™ื›ื•ืœ ืœื™ืฆื•ืจ ืชืœื•ืช ืžื—ื–ื•ืจื™ืช, ืžื” ืฉื™ื’ืจื•ื ืœืฉื’ื™ืืช ืงื•ืžืคื™ืœืฆื™ื”.

ื‘ื ื™ื’ื•ื“ ืœืชืœื•ืช, ื”ื•ื“ืขื•ืช ืื™ื ืŸ ื˜ืจื ื–ื™ื˜ื™ื‘ื™ื•ืช. ื”ื›ืœืœื™ื ื”ื‘ืื™ื ื—ืœื™ื ืขืœ ื”ื•ื“ืขื•ืช:

  • ืื ื”ืžืฉืื‘ ืžืงื‘ืœ ื”ื•ื“ืขื”, ื”ื•ื ืžืชืขื“ื›ืŸ. ืคืขื•ืœื•ืช ื”ืขื“ื›ื•ืŸ ืชืœื•ื™ื•ืช ื‘ืกื•ื’ ื”ืžืฉืื‘ - Exec ืžืจื™ืฅ ืืช ื”ืคืงื•ื“ื”, ืฉืจื•ืช ืžืคืขื™ืœ ืžื—ื“ืฉ ืืช ื”ืฉื™ืจื•ืช, ื—ื‘ื™ืœื” ืžืชืงื™ืŸ ืžื—ื“ืฉ ืืช ื”ื—ื‘ื™ืœื”. ืื ืœืžืฉืื‘ ืื™ืŸ ืคืขื•ืœืช ืขื“ื›ื•ืŸ ืžื•ื’ื“ืจืช, ืื– ืฉื•ื ื“ื‘ืจ ืœื ืงื•ืจื”.
  • ื‘ืžื”ืœืš ื”ืคืขืœื” ืื—ืช ืฉืœ Puppet, ื”ืžืฉืื‘ ืžืชืขื“ื›ืŸ ืœื ื™ื•ืชืจ ืžืคืขื ืื—ืช. ื–ื” ืืคืฉืจื™ ืžื›ื™ื•ื•ืŸ ืฉื”ื”ื•ื“ืขื•ืช ื›ื•ืœืœื•ืช ืชืœื•ืช ื•ื’ืจืฃ ื”ืชืœื•ืช ืื™ื ื• ืžื›ื™ืœ ืžื—ื–ื•ืจื™ื.
  • ืื Puppet ืžืฉื ื” ืืช ืžืฆื‘ื• ืฉืœ ืžืฉืื‘, ื”ืžืฉืื‘ ืฉื•ืœื— ื”ื•ื“ืขื•ืช ืœื›ืœ ื”ืžืฉืื‘ื™ื ื”ืจืฉื•ืžื™ื ืืœื™ื•.
  • ืื ืžืฉืื‘ ืžืชืขื“ื›ืŸ, ื”ื•ื ืฉื•ืœื— ื”ื•ื“ืขื•ืช ืœื›ืœ ื”ืžืฉืื‘ื™ื ื”ืจืฉื•ืžื™ื ืืœื™ื•.

ื˜ื™ืคื•ืœ ื‘ืคืจืžื˜ืจื™ื ืœื ืžื•ื’ื“ืจื™ื

ื›ื›ืœืœ, ืื ืœืคืจืžื˜ืจ ื›ืœืฉื”ื• ืฉืœ ืžืฉืื‘ ืื™ืŸ ืขืจืš ื‘ืจื™ืจืช ืžื—ื“ืœ ื•ืคืจืžื˜ืจ ื–ื” ืื™ื ื• ืžืฆื•ื™ืŸ ื‘ืžื ื™ืคืกื˜, ืื– Puppet ืœื ื™ืฉื ื” ืžืืคื™ื™ืŸ ื–ื” ืขื‘ื•ืจ ื”ืžืฉืื‘ ื”ืžืชืื™ื ื‘ืฆื•ืžืช. ืœื“ื•ื’ืžื”, ืื ืžืฉืื‘ ืžืกื•ื’ ืคื™ืœื” ืคืจืžื˜ืจ ืœื ืฆื•ื™ืŸ owner, ืื– Puppet ืœื ืชืฉื ื” ืืช ื”ื‘ืขืœื™ื ืฉืœ ื”ืงื•ื‘ืฅ ื”ืžืชืื™ื.

ืžื‘ื•ื ืœืžื—ืœืงื•ืช, ืžืฉืชื ื™ื ื•ื”ื’ื“ืจื•ืช

ื ื ื™ื— ืฉื™ืฉ ืœื ื• ื›ืžื” ืฆืžืชื™ื ืฉื™ืฉ ืœื”ื ืื•ืชื• ื—ืœืง ื‘ืชืฆื•ืจื”, ืื‘ืœ ื™ืฉ ื’ื ื”ื‘ื“ืœื™ื - ืื—ืจืช ื ื•ื›ืœ ืœืชืืจ ืืช ื”ื›ืœ ื‘ื‘ืœื•ืง ืื—ื“ node {}. ื›ืžื•ื‘ืŸ ืฉืืคืฉืจ ืคืฉื•ื˜ ืœื”ืขืชื™ืง ื—ืœืงื™ื ื–ื”ื™ื ืฉืœ ื”ืชืฆื•ืจื”, ืื‘ืœ ื‘ืื•ืคืŸ ื›ืœืœื™ ื–ื” ืคืชืจื•ืŸ ื’ืจื•ืข - ื”ืชืฆื•ืจื” ื’ื“ืœื”, ื•ืื ืชืฉื ื” ืืช ื”ื—ืœืง ื”ื›ืœืœื™ ืฉืœ ื”ืชืฆื•ืจื”, ืชืฆื˜ืจืš ืœืขืจื•ืš ืืช ืื•ืชื• ื”ื“ื‘ืจ ื‘ื”ืจื‘ื” ืžืงื•ืžื•ืช. ื™ื—ื“ ืขื ื–ืืช, ืงืœ ืœื˜ืขื•ืช, ื•ื‘ื›ืœืœ, ืขื™ืงืจื•ืŸ ื”- DRY (ืืœ ืชื—ื–ื•ืจ ืขืœ ืขืฆืžืš) ื”ื•ืžืฆื ืžืกื™ื‘ื” ื›ืœืฉื”ื™.

ื›ื“ื™ ืœืคืชื•ืจ ื‘ืขื™ื” ื–ื• ื™ืฉ ืขื™ืฆื•ื‘ ื›ื–ื” ื›ืžื• ื›ื™ืชื”.

ืฉื™ืขื•ืจื™ื

ื‘ื›ื™ืชื” ื”ื•ื ื‘ืœื•ืง ืขื ืฉื ืฉืœ ืงื•ื“ popt. ื™ืฉ ืฆื•ืจืš ื‘ืฉื™ืขื•ืจื™ื ื›ื“ื™ ืœืขืฉื•ืช ืฉื™ืžื•ืฉ ื—ื•ื–ืจ ื‘ืงื•ื“.

ืจืืฉื™ืช ื™ืฉ ืœืชืืจ ืืช ื”ื›ื™ืชื”. ื”ืชื™ืื•ืจ ืขืฆืžื• ืื™ื ื• ืžื•ืกื™ืฃ ืžืฉืื‘ื™ื ื‘ืฉื•ื ืžืงื•ื. ื”ืžืขืžื“ ืžืชื•ืืจ ื‘ืžื ื™ืคืกื˜ื™ื:

# ะžะฟะธัะฐะฝะธะต ะบะปะฐััะฐ ะฝะฐั‡ะธะฝะฐะตั‚ัั ั ะบะปัŽั‡ะตะฒะพะณะพ ัะปะพะฒะฐ 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}"

ื‘ื•ื‘ื” ื™ืฉ ืžืจื—ื‘ื™ ืฉืžื•ืช, ื•ืœืžืฉืชื ื™ื, ื‘ื”ืชืื, ื™ืฉ ืื–ื•ืจ ื”ืจืื•ืช: ื ื™ืชืŸ ืœื”ื’ื“ื™ืจ ืžืฉืชื ื” ื‘ืขืœ ืื•ืชื• ืฉื ื‘ืžืจื—ื‘ื™ ืฉืžื•ืช ืฉื•ื ื™ื. ื›ืฉืคื•ืชืจื™ื ืืช ื”ืขืจืš ืฉืœ ืžืฉืชื ื”, ืžื—ืคืฉื™ื ืืช ื”ืžืฉืชื ื” ื‘ืžืจื—ื‘ ื”ืฉืžื•ืช ื”ื ื•ื›ื—ื™, ืœืื—ืจ ืžื›ืŸ ื‘ืžืจื—ื‘ ื”ืฉืžื•ืช ื”ืžืงื™ืฃ, ื•ื›ืŸ ื”ืœืื”.

ื“ื•ื’ืžืื•ืช ืœืžืจื—ื‘ ืฉืžื•ืช:

  • ื’ืœื•ื‘ืœื™ - ืžืฉืชื ื™ื ืžื—ื•ืฅ ืœืชื™ืื•ืจ ื”ืžื—ืœืงื” ืื• ื”ืฆื•ืžืช ื”ื•ืœื›ื™ื ืœืฉื;
  • ืžืจื—ื‘ ื”ืฉืžื•ืช ืฉืœ ื”ืฆื•ืžืช ื‘ืชื™ืื•ืจ ื”ืฆื•ืžืช;
  • ืžืจื—ื‘ ื”ืฉืžื•ืช ืฉืœ ื”ืžื—ืœืงื” ื‘ืชื™ืื•ืจ ื”ืžื—ืœืงื”.

ื›ื“ื™ ืœืžื ื•ืข ืื™ ื‘ื”ื™ืจื•ืช ื‘ืขืช ื’ื™ืฉื” ืœืžืฉืชื ื”, ืืชื” ื™ื›ื•ืœ ืœืฆื™ื™ืŸ ืืช ืžืจื—ื‘ ื”ืฉืžื•ืช ื‘ืฉื ื”ืžืฉืชื ื”:

# ะฟะตั€ะตะผะตะฝะฝะฐั ะฑะตะท ะฟั€ะพัั‚ั€ะฐะฝัั‚ะฒะฐ ะธะผั‘ะฝ
$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 (ื‘ื“ื‘ื™ืืŸ, ืœืžืฉืœ, ื™ืฉ ื—ื‘ื™ืœื•ืช 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,
) {
  ...
}

ืžื—ืœืงื•ืช: ื›ืœื•ืœ ืฉื ืžื—ืœืงื” ืœืขื•ืžืช ืžื—ืœืงื”{'ืฉื ืžื—ืœืงื”':}

ื›ืœ ืžื—ืœืงื” ื”ื™ื ืžืฉืื‘ ืžืกื•ื’ ื‘ื›ื™ืชื”. ื›ืžื• ื‘ื›ืœ ืกื•ื’ ืื—ืจ ืฉืœ ืžืฉืื‘, ืœื ื™ื›ื•ืœื™ื ืœื”ื™ื•ืช ืฉื ื™ ืžื•ืคืขื™ื ืฉืœ ืื•ืชื” ืžื—ืœืงื” ื‘ืื•ืชื• ืฆื•ืžืช.

ืื ืชื ืกื” ืœื”ื•ืกื™ืฃ ืžื—ืœืงื” ืœืื•ืชื• ืฆื•ืžืช ืคืขืžื™ื™ื ื‘ืืžืฆืขื•ืช class { 'classname':} (ืœืœื ื”ื‘ื“ืœ, ืขื ืคืจืžื˜ืจื™ื ืฉื•ื ื™ื ืื• ื–ื”ื™ื), ืชื”ื™ื” ืฉื’ื™ืืช ืงื•ืžืคื™ืœืฆื™ื”. ืื‘ืœ ืื ืืชื” ืžืฉืชืžืฉ ื‘ืžื—ืœืงื” ื‘ืกื’ื ื•ืŸ ื”ืžืฉืื‘, ืืชื” ื™ื›ื•ืœ ืžื™ื“ ืœื”ื’ื“ื™ืจ ื‘ืžืคื•ืจืฉ ืืช ื›ืœ ื”ืคืจืžื˜ืจื™ื ืฉืœื” ื‘ืžื ื™ืคืกื˜.

ืขื ื–ืืช, ืื ืืชื” ืžืฉืชืžืฉ include, ืื– ื ื™ืชืŸ ืœื”ื•ืกื™ืฃ ืืช ื”ืžื—ืœืงื” ื›ืžื” ืคืขืžื™ื ืฉืชืจืฆื”. ื”ืขื•ื‘ื“ื” ื”ื™ื include ื”ื™ื ืคื•ื ืงืฆื™ื” ืื™ืžืคื•ื˜ื ื˜ื™ืช ื”ื‘ื•ื“ืงืช ืื ืžื—ืœืงื” ื ื•ืกืคื” ืœืกืคืจื™ื™ื”. ืื ื”ืžื—ืœืงื” ืœื ื ืžืฆืืช ื‘ืกืคืจื™ื™ื”, ื”ื™ื ืžื•ืกื™ืคื” ืื•ืชื”, ื•ืื ื”ื™ื ื›ื‘ืจ ืงื™ื™ืžืช, ื”ื™ื ืœื ืขื•ืฉื” ื›ืœื•ื. ืื‘ืœ ื‘ืžืงืจื” ืฉืœ ืฉื™ืžื•ืฉ include ืœื ื ื™ืชืŸ ืœื”ื’ื“ื™ืจ ืคืจืžื˜ืจื™ื ืฉืœ ืžื—ืœืงื” ื‘ืžื”ืœืš ื”ืฆื”ืจืช ืžื—ืœืงื” - ื™ืฉ ืœื”ื’ื“ื™ืจ ืืช ื›ืœ ื”ืคืจืžื˜ืจื™ื ื”ื ื“ืจืฉื™ื ื‘ืžืงื•ืจ ื ืชื•ื ื™ื ื—ื™ืฆื•ื ื™ - Hiera ืื• ENC. ื ื“ื‘ืจ ืขืœื™ื”ื ื‘ืžืืžืจ ื”ื‘ื.

ืžื’ื“ื™ืจ

ื›ืคื™ ืฉื ืืžืจ ื‘ื‘ืœื•ืง ื”ืงื•ื“ื, ืื•ืชื” ืžื—ืœืงื” ืœื ื™ื›ื•ืœื” ืœื”ื™ื•ืช ื ื•ื›ื—ืช ื‘ืฆื•ืžืช ื™ื•ืชืจ ืžืคืขื ืื—ืช. ืขื ื–ืืช, ื‘ืžืงืจื™ื ืžืกื•ื™ืžื™ื ืืชื” ืฆืจื™ืš ืœื”ื™ื•ืช ืžืกื•ื’ืœ ืœื”ืฉืชืžืฉ ื‘ืื•ืชื• ื’ื•ืฉ ืงื•ื“ ืขื ืคืจืžื˜ืจื™ื ืฉื•ื ื™ื ื‘ืื•ืชื• ืฆื•ืžืช. ื‘ืžื™ืœื™ื ืื—ืจื•ืช, ื™ืฉ ืฆื•ืจืš ื‘ืกื•ื’ ืžืฉืื‘ ืžืฉืœื•.

ืœื“ื•ื’ืžื”, ืขืœ ืžื ืช ืœื”ืชืงื™ืŸ ืืช ืžื•ื“ื•ืœ ื”-PHP, ืื ื• ืขื•ืฉื™ื ืืช ื”ืคืขื•ืœื•ืช ื”ื‘ืื•ืช ื‘-Avito:

  1. ื”ืชืงืŸ ืืช ื”ื—ื‘ื™ืœื” ืขื ืžื•ื“ื•ืœ ื–ื”.
  2. ื‘ื•ืื• ื ื™ืฆื•ืจ ืงื•ื‘ืฅ ืชืฆื•ืจื” ืขื‘ื•ืจ ืžื•ื“ื•ืœ ื–ื”.
  3. ืื ื• ื™ื•ืฆืจื™ื ืงื™ืฉื•ืจ ืกื™ืžื•ืœ ืœืชืฆื•ืจื” ืขื‘ื•ืจ php-fpm.
  4. ืื ื• ื™ื•ืฆืจื™ื ืงื™ืฉื•ืจ ืกื™ืžื•ืœ ืœ-config ืขื‘ื•ืจ php cli.

ื‘ืžืงืจื™ื ื›ืืœื”, ืขื™ืฆื•ื‘ ื›ื’ื•ืŸ ืœึฐื”ึทื’ื“ึดื™ืจ (ื”ื’ื“ืจ, ืกื•ื’ ืžื•ื’ื“ืจ, ืกื•ื’ ืžืฉืื‘ ืžื•ื’ื“ืจ). Define ื“ื•ืžื” ืœืžื—ืœืงื”, ืืš ื™ืฉื ื ื”ื‘ื“ืœื™ื: ืจืืฉื™ืช, ื›ืœ Define ื”ื•ื ืกื•ื’ ืžืฉืื‘, ืœื ืžืฉืื‘; ืฉื ื™ืช, ืœื›ืœ ื”ื’ื“ืจื” ื™ืฉ ืคืจืžื˜ืจ ืžืจื•ืžื– $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' }
}

ื”ื“ืจืš ื”ืงืœื” ื‘ื™ื•ืชืจ ืœืชืคื•ืก ืืช ืฉื’ื™ืืช ื”ื”ืฆื”ืจื” ื›ืคื•ืœื” ื”ื™ื ื‘-Define. ื–ื” ืงื•ืจื” ืื ืœื”ื’ื“ืจื” ื™ืฉ ืžืฉืื‘ ืขื ืฉื ืงื‘ื•ืข, ื•ื™ืฉ ืฉื ื™ ืžื•ืคืขื™ื ืื• ื™ื•ืชืจ ืฉืœ ื”ื’ื“ืจื” ื–ื• ื‘ืฆื•ืžืช ื›ืœืฉื”ื•.

ืงืœ ืœื”ื’ืŸ ืขืœ ืขืฆืžืš ืžืคื ื™ ื–ื”: ืœื›ืœ ื”ืžืฉืื‘ื™ื ื‘ืชื•ืš ื”ื”ื’ื“ืจื” ืฆืจื™ืš ืœื”ื™ื•ืช ืฉื ื‘ื”ืชืื $title. ื—ืœื•ืคื” ื”ื™ื ื”ื•ืกืคืช ืžืฉืื‘ื™ื ืื™ืžืคื•ื˜ื ื˜ื™ืช; ื‘ืžืงืจื” ื”ืคืฉื•ื˜ ื‘ื™ื•ืชืจ, ืžืกืคื™ืง ืœื”ืขื‘ื™ืจ ืืช ื”ืžืฉืื‘ื™ื ื”ืžืฉื•ืชืคื™ื ืœื›ืœ ืžื•ืคืขื™ ื”ื”ื’ื“ืจื” ืœืžื—ืœืงื” ื ืคืจื“ืช ื•ืœื›ืœื•ืœ ืืช ื”ืžื—ืœืงื” ื”ื–ื• ื‘ื”ื’ื“ืจื” - function include ืื™ืžืคื•ื˜ื ื˜ื™.

ื™ืฉื ืŸ ื“ืจื›ื™ื ืื—ืจื•ืช ืœื”ืฉื™ื’ ืื™-ืคื•ื˜ื ืฆื™ื” ื‘ืขืช ื”ื•ืกืคืช ืžืฉืื‘ื™ื, ื›ืœื•ืžืจ ืฉื™ืžื•ืฉ ื‘ืคื•ื ืงืฆื™ื•ืช defined ะธ ensure_resources, ืื‘ืœ ืื ื™ ืืกืคืจ ืœืš ืขืœ ื–ื” ื‘ืคืจืง ื”ื‘ื.

ืชืœื•ืช ื•ื”ื•ื“ืขื•ืช ืœืฉื™ืขื•ืจื™ื ื•ื”ื’ื“ืจื•ืช

ืžื—ืœืงื•ืช ื•ื”ื’ื“ืจื•ืช ืžื•ืกื™ืคื™ื ืืช ื”ื›ืœืœื™ื ื”ื‘ืื™ื ืœื˜ื™ืคื•ืœ ื‘ืชืœื•ืช ื•ื‘ื”ื•ื“ืขื•ืช:

  • ืชืœื•ืช ื‘-class/define ืžื•ืกื™ืคื” ืชืœื•ืช ื‘ื›ืœ ื”ืžืฉืื‘ื™ื ืฉืœ ื”-class/define;
  • ืชืœื•ืช class/define ืžื•ืกื™ืคื” ืชืœื•ืช ืœื›ืœ ืžืฉืื‘ื™ class/define;
  • ื”ื•ื“ืขื” class/define ืžื•ื“ื™ืขื” ืœื›ืœ ื”ืžืฉืื‘ื™ื ืฉืœ class/define;
  • ืžื ื•ื™ class/define ื ืจืฉื ืœื›ืœ ื”ืžืฉืื‘ื™ื ืฉืœ class/define.

ื”ืฆื”ืจื•ืช ื•ื‘ื•ืจืจื™ื ืžื•ืชื ื™ื

ืชื™ืขื•ื“ ื›ืืŸ.

if

ื”ื›ืœ ืคืฉื•ื˜ ื›ืืŸ:

if ะ’ะซะ ะะ–ะ•ะะ˜ะ•1 {
  ...
} elsif ะ’ะซะ ะะ–ะ•ะะ˜ะ•2 {
  ...
} else {
  ...
}

ืืœื ืื ื›ืŸ

ืืœื ืื ื”ื•ื ื”ืคื•ืš: ื’ื•ืฉ ื”ืงื•ื“ ื™ื‘ื•ืฆืข ืื ื”ื‘ื™ื˜ื•ื™ ื”ื•ื false.

unless ะ’ะซะ ะะ–ะ•ะะ˜ะ• {
  ...
}

ืžืงืจื”

ื’ื ื›ืืŸ ืื™ืŸ ืฉื•ื ื“ื‘ืจ ืžืกื•ื‘ืš. ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ืขืจื›ื™ื ืจื’ื™ืœื™ื (ืžื—ืจื•ื–ื•ืช, ืžืกืคืจื™ื ื•ื›ื•'), ื‘ื™ื˜ื•ื™ื™ื ืจื’ื•ืœืจื™ื™ื ื•ืกื•ื’ื™ ื ืชื•ื ื™ื ื›ืขืจื›ื™ื.

case ะ’ะซะ ะะ–ะ•ะะ˜ะ• {
  ะ—ะะะงะ•ะะ˜ะ•1: { ... }
  ะ—ะะะงะ•ะะ˜ะ•2, ะ—ะะะงะ•ะะ˜ะ•3: { ... }
  default: { ... }
}

ื‘ื•ืจืจื™ื

ื‘ื•ืจืจ ื”ื•ื ืžื‘ื ื” ืฉืคื” ื“ื•ืžื” ืœื–ื” case, ืื‘ืœ ื‘ืžืงื•ื ืœื‘ืฆืข ื‘ืœื•ืง ืงื•ื“, ื”ื•ื ืžื—ื–ื™ืจ ืขืจืš.

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

ืžื•ื“ื•ืœื™ื

ื›ืืฉืจ ื”ืชืฆื•ืจื” ืงื˜ื ื”, ื ื™ืชืŸ ืœืฉืžื•ืจ ืื•ืชื” ื‘ืงืœื•ืช ื‘ืžื ื™ืคืกื˜ ืื—ื“. ืื‘ืœ ื›ื›ืœ ืฉื ืชืืจ ื™ื•ืชืจ ืชืฆื•ืจื•ืช, ื›ืš ื™ืฉ ื™ื•ืชืจ ืžื—ืœืงื•ืช ื•ืฆืžืชื™ื ื‘ืžื ื™ืคืกื˜, ื”ื•ื ื’ื“ืœ, ื•ื”ื•ื ื”ื•ืคืš ืœื”ื™ื•ืช ืœื ื ื•ื— ืœืขื‘ื•ื“ื”.

ื‘ื ื•ืกืฃ, ื™ืฉื ื” ื‘ืขื™ื” ืฉืœ ืฉื™ืžื•ืฉ ื—ื•ื–ืจ ื‘ืงื•ื“ โ€“ ื›ืืฉืจ ื›ืœ ื”ืงื•ื“ ื ืžืฆื ื‘ืžื ื™ืคืกื˜ ืื—ื“, ืงืฉื” ืœื—ืœื•ืง ืืช ื”ืงื•ื“ ื”ื–ื” ืขื ืื—ืจื™ื. ื›ื“ื™ ืœืคืชื•ืจ ืืช ืฉืชื™ ื”ื‘ืขื™ื•ืช ื”ืœืœื•, ืœ-Puppet ื™ืฉ ื™ืฉื•ืช ืฉื ืงืจืืช ืžื•ื“ื•ืœื™ื.

ืžื•ื“ื•ืœื™ื - ืืœื• ื”ืŸ ืงื‘ื•ืฆื•ืช ืฉืœ ืžื—ืœืงื•ืช, ื”ื’ื“ืจื•ืช ื•ื™ืฉื•ื™ื•ืช Puppet ืื—ืจื•ืช ื”ืžืžื•ืงืžื•ืช ื‘ืกืคืจื™ื™ื” ื ืคืจื“ืช. ื‘ืžื™ืœื™ื ืื—ืจื•ืช, ืžื•ื“ื•ืœ ื”ื•ื ื—ืœืง ืขืฆืžืื™ ืฉืœ ื”ื™ื’ื™ื•ืŸ Puppet. ืœื“ื•ื’ืžื”, ื™ื›ื•ืœ ืœื”ื™ื•ืช ืžื•ื“ื•ืœ ืœืขื‘ื•ื“ื” ืขื nginx, ื•ื”ื•ื ื™ื›ื™ืœ ืืช ืžื” ื•ืจืง ืืช ืžื” ืฉืฆืจื™ืš ืœืขื‘ื•ื“ ืขื nginx, ืื• ืฉื™ื›ื•ืœ ืœื”ื™ื•ืช ืžื•ื“ื•ืœ ืœืขื‘ื•ื“ื” ืขื PHP, ื•ื›ืŸ ื”ืœืื”.

ืžื•ื“ื•ืœื™ื ื”ื ื‘ืขืœื™ ื’ืจืกืื•ืช, ื•ื’ื ืชืœื•ืช ืฉืœ ืžื•ื“ื•ืœื™ื ื–ื” ื‘ื–ื” ื ืชืžื›ืช. ื™ืฉ ืžืื’ืจ ืคืชื•ื— ืฉืœ ืžื•ื“ื•ืœื™ื - Puppet Forge.

ื‘ืฉืจืช ื”ื‘ื•ื‘ื•ืช, ื”ืžื•ื“ื•ืœื™ื ืžืžื•ืงืžื™ื ื‘ืกืคืจื™ื™ืช ื”ืžืฉื ื” ืฉืœ ื”ืžื•ื“ื•ืœื™ื ืฉืœ ืกืคืจื™ื™ืช ื”ื‘ืกื™ืก. ื‘ืชื•ืš ื›ืœ ืžื•ื“ื•ืœ ื™ืฉ ืกื›ื™ืžืช ืกืคืจื™ื•ืช ืกื˜ื ื“ืจื˜ื™ืช - ืžื ื™ืคืกื˜ื™ื, ืงื‘ืฆื™ื, ืชื‘ื ื™ื•ืช, lib ื•ื›ื•'.

ืžื‘ื ื” ืงื•ื‘ืฅ ื‘ืžื•ื“ื•ืœ

ื”ืฉื•ืจืฉ ืฉืœ ื”ืžื•ื“ื•ืœ ืขืฉื•ื™ ืœื”ื›ื™ืœ ืืช ื”ืกืคืจื™ื•ืช ื”ื‘ืื•ืช ืขื ืฉืžื•ืช ืชื™ืื•ืจื™ื™ื:

  • manifests - ื”ื•ื ืžื›ื™ืœ ืžื ื™ืคืกื˜ื™ื
  • files - ื”ื•ื ืžื›ื™ืœ ืงื‘ืฆื™ื
  • templates - ื”ื•ื ืžื›ื™ืœ ืชื‘ื ื™ื•ืช
  • lib - ื”ื•ื ืžื›ื™ืœ ืงื•ื“ ืจื•ื‘ื™

ื–ื• ืœื ืจืฉื™ืžื” ืžืœืื” ืฉืœ ืกืคืจื™ื•ืช ื•ืงื‘ืฆื™ื, ืื‘ืœ ื–ื” ืžืกืคื™ืง ืขื‘ื•ืจ ื”ืžืืžืจ ื”ื–ื” ืœืขืช ืขืชื”.

ืฉืžื•ืช ืžืฉืื‘ื™ื ื•ืฉืžื•ืช ืงื‘ืฆื™ื ื‘ืžื•ื“ื•ืœ

ืชื™ืขื•ื“ ื›ืืŸ.

ืœื ื ื™ืชืŸ ืœืงืจื•ื ืœืžืฉืื‘ื™ื (ืฉื™ืขื•ืจื™ื, ื”ื’ื“ืจื•ืช) ื‘ืžื•ื“ื•ืœ ืื™ืš ืฉืืชื” ืจื•ืฆื”. ื‘ื ื•ืกืฃ, ื™ืฉื ื” ื”ืชืืžื” ื™ืฉื™ืจื” ื‘ื™ืŸ ืฉื ื”ืžืฉืื‘ ืœืฉื ื”ืงื•ื‘ืฅ ื‘ื• 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, ืืฉืจ ืžื•ืขื‘ืจ ื”ื ืชื™ื‘ ืœืชื‘ื ื™ืช. ืœืžืฉืื‘ื™ื ืžืกื•ื’ ืคื™ืœื” ืžืฉืžืฉ ื™ื—ื“ ืขื ื”ืคืจืžื˜ืจ content. ืœื“ื•ื’ืžื”, ื›ืš:

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

ืฆืคื” ื‘ื ืชื™ื‘ <modulename>/<filename> ืžืจืžื– ืขืœ ืงื•ื‘ืฅ <rootdir>/modules/<modulename>/templates/<filename>.

ื‘ื ื•ืกืฃ, ื™ืฉ ืคื•ื ืงืฆื™ื” inline_template - ื”ื•ื ืžืงื‘ืœ ืืช ื˜ืงืกื˜ ื”ืชื‘ื ื™ืช ื›ืงืœื˜, ืœื ืืช ืฉื ื”ืงื•ื‘ืฅ.

ื‘ืชื•ืš ืชื‘ื ื™ื•ืช, ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ื›ืœ ืžืฉืชื ื™ Puppet ื‘ื”ื™ืงืฃ ื”ื ื•ื›ื—ื™.

Puppet ืชื•ืžืš ื‘ืชื‘ื ื™ื•ืช ื‘ืคื•ืจืžื˜ ERB ื•-EPP:

ื‘ืงืฆืจื” ืขืœ ERB

ืžื‘ื ื™ ื‘ืงืจื”:

  • <%= ะ’ะซะ ะะ–ะ•ะะ˜ะ• %> - ื”ื›ื ืก ืืช ื”ืขืจืš ืฉืœ ื”ื‘ื™ื˜ื•ื™
  • <% ะ’ะซะ ะะ–ะ•ะะ˜ะ• %> - ืœื—ืฉื‘ ืืช ื”ืขืจืš ืฉืœ ื‘ื™ื˜ื•ื™ (ืžื‘ืœื™ ืœื”ื›ื ื™ืก ืื•ืชื•). ื”ืฆื”ืจื•ืช ืžื•ืชื ื•ืช (ืื) ื•ืœื•ืœืื•ืช (ื›ืœ ืื—ืช) ื‘ื“ืจืš ื›ืœืœ ื ื›ื ืกื•ืช ืœื›ืืŸ.
  • <%# ะšะžะœะœะ•ะะขะะ ะ˜ะ™ %>

ื‘ื™ื˜ื•ื™ื™ื ื‘-ERB ื ื›ืชื‘ื™ื ื‘ืจื•ื‘ื™ (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 ะฟั€ะพัั‚ะพ ะฒั‹ะฒะพะดะธั‚ ัะพะพะฑั‰ะตะฝะธะต ะฒ ะปะพะณ

ืžื‘ื—ื™ื ื” ืคื•ืจืžืœื™ืช, ืœืขื•ื‘ื“ื” ื™ืฉ โ€‹โ€‹ืฉื (ืžื—ืจื•ื–ืช) ื•ืขืจืš (ื–ืžื™ื ื™ื ืกื•ื’ื™ื ืฉื•ื ื™ื: ืžื—ืจื•ื–ื•ืช, ืžืขืจื›ื™ื, ืžื™ืœื•ื ื™ื). ืœืื›ื•ืœ ืกื˜ ืฉืœ ืขื•ื‘ื“ื•ืช ืžื•ื‘ื ื•ืช. ืืชื” ื™ื›ื•ืœ ื’ื ืœื›ืชื•ื‘ ืžืฉืœืš. ืžืชื•ืืจื™ื ืืกืคื ื™ ืขื•ื‘ื“ื•ืช ื›ืžื• ืคื•ื ืงืฆื™ื•ืช ื‘ืจื•ื‘ื™ืื• ื‘ืชื•ืจ ืงื‘ืฆื™ ื”ืคืขืœื”. ื ื™ืชืŸ ืœื”ืฆื™ื’ ืขื•ื‘ื“ื•ืช ื’ื ื‘ื˜ื•ืคืก ืงื‘ืฆื™ ื˜ืงืกื˜ ืขื ื ืชื•ื ื™ื ืขืœ ื”ืฆืžืชื™ื.

ื‘ืžื”ืœืš ื”ืคืขื•ืœื”, ืกื•ื›ืŸ ื”ื‘ื•ื‘ื•ืช ืžืขืชื™ืง ืชื—ื™ืœื” ืืช ื›ืœ ืื•ืกืคื™ ื”ืขื•ื‘ื“ื•ืช ื”ื–ืžื™ื ื™ื ืžืฉืจืช ื”ืคืคื˜ื™ื ืœืฆื•ืžืช, ื•ืœืื—ืจ ืžื›ืŸ ื”ื•ื ืžืฉื™ืง ืื•ืชื ื•ืฉื•ืœื— ืืช ื”ืขื•ื‘ื“ื•ืช ืฉื ืืกืคื• ืœืฉืจืช; ืœืื—ืจ ืžื›ืŸ, ื”ืฉืจืช ืžืชื—ื™ืœ ืœื”ืจื›ื™ื‘ ืืช ื”ืงื˜ืœื•ื’.

ืขื•ื‘ื“ื•ืช ื‘ืฆื•ืจื” ืฉืœ ืงื‘ืฆื™ ื”ืคืขืœื”

ืขื•ื‘ื“ื•ืช ื›ืืœื” ืžืžื•ืงืžื•ืช ื‘ืžื•ื“ื•ืœื™ื ื‘ืกืคืจื™ื™ื” facts.d. ื›ืžื•ื‘ืŸ ืฉื”ืงื‘ืฆื™ื ื—ื™ื™ื‘ื™ื ืœื”ื™ื•ืช ื ื™ืชื ื™ื ืœื”ืคืขืœื”. ื‘ืขืช ื”ืคืขืœื”, ืขืœื™ื”ื ืœื”ืคื™ืง ืžื™ื“ืข ืœืคืœื˜ ืกื˜ื ื“ืจื˜ื™ ื‘ืคื•ืจืžื˜ YAML ืื• key=value.

ืืœ ืชืฉื›ื— ืฉื”ืขื•ื‘ื“ื•ืช ื—ืœื•ืช ืขืœ ื›ืœ ื”ืฆืžืชื™ื ืฉื ืฉืœื˜ื™ื ืขืœ ื™ื“ื™ ืฉืจืช ื”-popet ืฉืืœื™ื• ืคืจื•ืก ื”ืžื•ื“ื•ืœ ืฉืœืš. ืœื›ืŸ, ื‘ืกืงืจื™ืคื˜, ื“ืื’ื• ืœื‘ื“ื•ืง ืฉื‘ืžืขืจื›ืช ื™ืฉ ืืช ื›ืœ ื”ืชื•ื›ื ื•ืช ื•ื”ืงื‘ืฆื™ื ื”ื“ืจื•ืฉื™ื ืœืขื•ื‘ื“ื” ืฉืœื›ื.

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

ืขื•ื‘ื“ื•ืช ืจื•ื‘ื™

ืขื•ื‘ื“ื•ืช ื›ืืœื” ืžืžื•ืงืžื•ืช ื‘ืžื•ื“ื•ืœื™ื ื‘ืกืคืจื™ื™ื” 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 ื‘-Puppet ื”ื™ืฉืŸ ืื• /etc/puppetlabs/facts.d ื‘-Puppet ื”ื—ื“ืฉ.

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

ื”ื’ืขื” ืœืขื•ื‘ื“ื•ืช

ื™ืฉ ืฉืชื™ ื“ืจื›ื™ื ืœื’ืฉืช ืœืขื•ื‘ื“ื•ืช:

  • ื“ืจืš ื”ืžื™ืœื•ืŸ $facts: $facts['fqdn'];
  • ืฉื™ืžื•ืฉ ื‘ืฉื ื”ืขื•ื‘ื“ื” ื›ืฉื ื”ืžืฉืชื ื”: $fqdn.

ืขื“ื™ืฃ ืœื”ืฉืชืžืฉ ื‘ืžื™ืœื•ืŸ $facts, ืื• ืืคื™ืœื• ื˜ื•ื‘ ื™ื•ืชืจ, ืœืฆื™ื™ืŸ ืืช ืžืจื—ื‘ ื”ืฉืžื•ืช ื”ื’ืœื•ื‘ืœื™ ($::facts).

ืœื”ืœืŸ ื”ื—ืœืง ื”ืจืœื•ื•ื ื˜ื™ ื‘ืชื™ืขื•ื“.

ืžืฉืชื ื™ื ืžื•ื‘ื ื™ื

ืžืœื‘ื“ ื”ืขื•ื‘ื“ื•ืช, ื™ืฉ ื’ื ื›ืžื” ืžืฉืชื ื™ื, ื–ืžื™ืŸ ื‘ืžืจื—ื‘ ื”ืฉืžื•ืช ื”ื’ืœื•ื‘ืœื™.

  • ืขื•ื‘ื“ื•ืช ืžื”ื™ืžื ื•ืช - ืžืฉืชื ื™ื ืฉื ืœืงื—ื™ื ืžื”ืื™ืฉื•ืจ ืฉืœ ื”ืœืงื•ื— (ืžืื—ืจ ืฉื”ืชืขื•ื“ื” ืžื•ื ืคืงืช ื‘ื“ืจืš ื›ืœืœ ื‘ืฉืจืช poppet, ื”ืกื•ื›ืŸ ืœื ื™ื›ื•ืœ ืคืฉื•ื˜ ืœืงื—ืช ื•ืœืฉื ื•ืช ืืช ื”ืื™ืฉื•ืจ ืฉืœื•, ื•ืœื›ืŸ ื”ืžืฉืชื ื™ื "ืžื”ื™ืžื ื™ื"): ืฉื ื”ืชืขื•ื“ื”, ืฉื ื”- ืžืืจื— ื•ื“ื•ืžื™ื™ืŸ, ื”ืจื—ื‘ื•ืช ืžื”ืื™ืฉื•ืจ.
  • ืขื•ื‘ื“ื•ืช ืฉืจืช - ืžืฉืชื ื™ื ื”ืงืฉื•ืจื™ื ืœืžื™ื“ืข ืขืœ ื”ืฉืจืช - ื’ืจืกื”, ืฉื, ื›ืชื•ื‘ืช IP ืฉืœ ื”ืฉืจืช, ืกื‘ื™ื‘ื”.
  • ืขื•ื‘ื“ื•ืช ืกื•ื›ืŸ - ืžืฉืชื ื™ื ืฉื ื•ืกืคื• ื™ืฉื™ืจื•ืช ืขืœ ื™ื“ื™ ืกื•ื›ืŸ ื‘ื•ื‘ื”, ื•ืœื ืขืœ ื™ื“ื™ ืขื•ื‘ื“ื” - ืฉื ืชืขื•ื“ื”, ื’ื™ืจืกืช ืกื•ื›ืŸ, ื’ื™ืจืกืช ื‘ื•ื‘ื”.
  • ืžืฉืชื ื™ ืžืืกื˜ืจ - ืžืฉืชื ื™ Pappetmaster (sic!). ื–ื” ื‘ืขืจืš ื›ืžื• ื‘ ืขื•ื‘ื“ื•ืช ืฉืจืช, ื‘ื ื•ืกืฃ ืขืจื›ื™ ืคืจืžื˜ืจื™ ืชืฆื•ืจื” ื–ืžื™ื ื™ื.
  • ืžืฉืชื ื™ ืžื”ื“ืจ - ืžืฉืชื ื™ ืžื”ื“ืจ ื”ื ื‘ื“ืœื™ื ื‘ื›ืœ ื”ื™ืงืฃ: ืฉื ื”ืžื•ื“ื•ืœ ื”ื ื•ื›ื—ื™ ื•ืฉื ื”ืžื•ื“ื•ืœ ืฉื‘ื• ื”ื’ื™ืฉื” ืœืื•ื‘ื™ื™ืงื˜ ื”ื ื•ื›ื—ื™. ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ื”ื, ืœืžืฉืœ, ื›ื“ื™ ืœื‘ื“ื•ืง ืฉื”ืฉื™ืขื•ืจื™ื ื”ืคืจื˜ื™ื™ื ืฉืœืš ืื™ื ื ื‘ืฉื™ืžื•ืฉ ื™ืฉื™ืจื•ืช ืžืžื•ื“ื•ืœื™ื ืื—ืจื™ื.

ืชื•ืกืคืช 1: ืื™ืš ืœื”ืจื™ืฅ ื•ืœื ืงื•ืช ื‘ืื’ื™ื ื‘ื›ืœ ื–ื”?

ื”ืžืืžืจ ื”ื›ื™ืœ ื“ื•ื’ืžืื•ืช ืจื‘ื•ืช ืฉืœ ืงื•ื“ ื‘ื•ื‘ื•ืช, ืืš ืœื ืืžืจ ืœื ื• ื›ืœืœ ื›ื™ืฆื“ ืœื”ืคืขื™ืœ ืืช ื”ืงื•ื“ ื”ื–ื”. ื•ื‘ื›ืŸ, ืื ื™ ืžืชืงืŸ ืืช ืขืฆืžื™.

ืžืกืคื™ืง ืกื•ื›ืŸ ื›ื“ื™ ืœื”ืคืขื™ืœ ืืช Puppet, ืื‘ืœ ื‘ืจื•ื‘ ื”ืžืงืจื™ื ืชืฆื˜ืจืš ื’ื ืฉืจืช.

ื”ืกื•ื›ืŸ

ืœืคื—ื•ืช ืžืื– ื’ืจืกื” XNUMX, ื—ื‘ื™ืœื•ืช ื‘ื•ื‘ื”-ืกื•ื›ื ื™ื ืž ืžืื’ืจ Puppetlabs ื”ืจืฉืžื™ ืžื›ื™ืœื™ื ืืช ื›ืœ ื”ืชืœื•ืช (ืจื•ื‘ื™ ื•ืื‘ื ื™ ื”ื—ืŸ ื”ืžืชืื™ืžื•ืช), ื›ืš ืฉืื™ืŸ ืงืฉื™ื™ ื”ืชืงื ื” (ืื ื™ ืžื“ื‘ืจ ืขืœ ื”ืคืฆื•ืช ืžื‘ื•ืกืกื•ืช ื“ื‘ื™ืืŸ - ืื ื—ื ื• ืœื ืžืฉืชืžืฉื™ื ื‘ื”ืคืฆื•ืช ืžื‘ื•ืกืกื•ืช RPM).

ื‘ืžืงืจื” ื”ืคืฉื•ื˜ ื‘ื™ื•ืชืจ, ื›ื“ื™ ืœื”ืฉืชืžืฉ ื‘ืชืฆื•ืจืช ื”ื‘ื•ื‘ื•ืช, ืžืกืคื™ืง ืœื”ืคืขื™ืœ ืืช ื”ืกื•ื›ืŸ ื‘ืžืฆื‘ ืœืœื ืฉืจืช: ื‘ืชื ืื™ ืฉืงื•ื“ ื”ื‘ื•ื‘ื” ืžื•ืขืชืง ืœืฆื•ืžืช, ื”ืคืขืœ 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

ืขื“ื™ืฃ, ื›ืžื•ื‘ืŸ, ืœื”ื’ื“ื™ืจ ืืช ื”ืฉืจืช ื•ืœื”ืคืขื™ืœ ืกื•ื›ื ื™ื ืขืœ ื”ืฆืžืชื™ื ื‘ืžืฆื‘ ื“ืžื•ืŸ - ื•ืื– ืื—ืช ืœื—ืฆื™ ืฉืขื” ื”ื ื™ื—ื™ืœื• ืืช ื”ืชืฆื•ืจื” ืฉื”ื•ืจื“ื” ืžื”ืฉืจืช.

ืืชื” ื™ื›ื•ืœ ืœื—ืงื•ืช ืืช ืžื•ื“ืœ ื”ื“ื—ื™ืคื” ืฉืœ ื”ืขื‘ื•ื“ื” - ืขื‘ื•ืจ ืœืฆื•ืžืช ืฉืืชื” ืžืขื•ื ื™ื™ืŸ ื‘ื• ื•ื”ืชื—ืœ sudo puppet agent -t. ืžึทืคึฐืชึตื—ึท -t (--test) ืœืžืขืฉื” ื›ื•ืœืœ ืžืกืคืจ ืืคืฉืจื•ื™ื•ืช ืฉื ื™ืชืŸ ืœื”ืคืขื™ืœ ื‘ื ืคืจื“. ืืคืฉืจื•ื™ื•ืช ืืœื” ื›ื•ืœืœื•ืช ืืช ื”ื“ื‘ืจื™ื ื”ื‘ืื™ื:

  • ืืœ ืชืคืขื™ืœ ื‘ืžืฆื‘ ื“ืžื•ืŸ (ื›ื‘ืจื™ืจืช ืžื—ื“ืœ ื”ืกื•ื›ืŸ ืžืชื—ื™ืœ ื‘ืžืฆื‘ ื“ืžื•ืŸ);
  • ื›ื™ื‘ื•ื™ ืœืื—ืจ ื”ื—ืœืช ื”ืงื˜ืœื•ื’ (ื›ื‘ืจื™ืจืช ืžื—ื“ืœ, ื”ืกื•ื›ืŸ ื™ืžืฉื™ืš ืœืขื‘ื•ื“ ื•ื™ื—ื™ืœ ืืช ื”ืชืฆื•ืจื” ืื—ืช ืœื—ืฆื™ ืฉืขื”);
  • ืœื›ืชื•ื‘ ื™ื•ืžืŸ ืขื‘ื•ื“ื” ืžืคื•ืจื˜;
  • ืœื”ืฆื™ื’ ืฉื™ื ื•ื™ื™ื ื‘ืงื‘ืฆื™ื.

ืœืกื•ื›ืŸ ื™ืฉ ืžืฆื‘ ืคืขื•ืœื” ืœืœื ืฉื™ื ื•ื™ื™ื - ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ื• ื›ืืฉืจ ืื™ื ื›ื ื‘ื˜ื•ื—ื™ื ืฉื›ืชื‘ืชื ืืช ื”ืชืฆื•ืจื” ื”ื ื›ื•ื ื” ื•ืจื•ืฆื™ื ืœื‘ื“ื•ืง ืžื” ื‘ื“ื™ื•ืง ื”ืกื•ื›ืŸ ื™ืฉื ื” ื‘ืžื”ืœืš ื”ืคืขื•ืœื”. ืžืฆื‘ ื–ื” ืžื•ืคืขืœ ืขืœ ื™ื“ื™ ื”ืคืจืžื˜ืจ --noop ื‘ืฉื•ืจืช ื”ืคืงื•ื“ื”: sudo puppet agent -t --noop.

ื‘ื ื•ืกืฃ, ืืชื” ื™ื›ื•ืœ ืœื”ืคืขื™ืœ ืืช ื™ื•ืžืŸ ื ื™ืคื•ื™ ื”ื‘ืื’ื™ื ืฉืœ ื”ืขื‘ื•ื“ื” - ื‘ื•, โ€‹โ€‹ื‘ื•ื‘ื” ื›ื•ืชื‘ืช ืขืœ ื›ืœ ื”ืคืขื•ืœื•ืช ืฉื”ื™ื ืžื‘ืฆืขืช: ืขืœ ื”ืžืฉืื‘ ืฉื”ื™ื ืžืขื‘ื“ืช ื›ืขืช, ืขืœ ื”ืคืจืžื˜ืจื™ื ืฉืœ ืžืฉืื‘ ื–ื”, ืขืœ ืื™ืœื• ืชื•ื›ื ื™ื•ืช ื”ื™ื ืžืคืขื™ืœื”. ื›ืžื•ื‘ืŸ ืฉื–ื” ืคืจืžื˜ืจ --debug.

ืฉืจืช

ืœื ืืฉืงื•ืœ ืืช ื”ื”ื’ื“ืจื” ื”ืžืœืื” ืฉืœ ื”-pappetserver ื•ืืช ืคืจื™ืกืช ื”ืงื•ื“ ืืœื™ื• ื‘ืžืืžืจ ื–ื”; ืื ื™ ืจืง ืื’ื™ื“ ืฉืžื—ื•ืฅ ืœืงื•ืคืกื” ื™ืฉ ื’ืจืกื” ืคื•ื ืงืฆื™ื•ื ืœื™ืช ืžืœืื” ืฉืœ ื”ืฉืจืช ืฉืื™ื ื” ื“ื•ืจืฉืช ืชืฆื•ืจื” ื ื•ืกืคืช ื›ื“ื™ ืœืขื‘ื•ื“ ืขื ืžืกืคืจ ืงื˜ืŸ ืฉืœ ืฆืžืชื™ื (ื ื ื™ื—, ืขื“ ืžืื”). ืžืกืคืจ ื’ื“ื•ืœ ื™ื•ืชืจ ืฉืœ ืฆืžืชื™ื ื™ื“ืจื•ืฉ ื›ื•ื•ื ื•ืŸ - ื›ื‘ืจื™ืจืช ืžื—ื“ืœ, Puppetserver ืžืฉื™ืง ืœื ื™ื•ืชืจ ืžืืจื‘ืขื” ืขื•ื‘ื“ื™ื, ืœื‘ื™ืฆื•ืขื™ื ื˜ื•ื‘ื™ื ื™ื•ืชืจ ืืชื” ืฆืจื™ืš ืœื”ื’ื“ื™ืœ ืืช ืžืกืคืจื ื•ืืœ ืชืฉื›ื— ืœื”ื’ื“ื™ืœ ืืช ืžื’ื‘ืœื•ืช ื”ื–ื™ื›ืจื•ืŸ, ืื—ืจืช ื”ืฉืจืช ื™ืืกื•ืฃ ืืฉืคื” ืจื•ื‘ ื”ื–ืžืŸ.

ืคืจื™ืกืช ืงื•ื“ - ืื ืืชื” ืฆืจื™ืš ืืช ื–ื” ื‘ืžื”ื™ืจื•ืช ื•ื‘ืงืœื•ืช, ืื– ืชืกืชื›ืœ (ื‘-r10k)[https://github.com/puppetlabs/r10k], ืขื‘ื•ืจ ื”ืชืงื ื•ืช ืงื˜ื ื•ืช ื–ื” ืืžื•ืจ ืœื”ืกืคื™ืง ืœืžื“ื™.

ืชื•ืกืคืช 2: ื”ื ื—ื™ื•ืช ืงื™ื“ื•ื“

  1. ืฉื™ื ืืช ื›ืœ ื”ื”ื™ื’ื™ื•ืŸ ื‘ืžื—ืœืงื•ืช ื•ื‘ื”ื’ื“ืจื•ืช.
  2. ืฉืžื•ืจ ืžื—ืœืงื•ืช ื•ื”ื’ื“ืจื•ืช ื‘ืžื•ื“ื•ืœื™ื, ืœื ื‘ืžื ื™ืคืกื˜ื™ื ื”ืžืชืืจื™ื ืฆืžืชื™ื.
  3. ื”ืฉืชืžืฉ ื‘ืขื•ื‘ื“ื•ืช.
  4. ืืœ ืชืขืฉื” ืื ืขืœ ืกืžืš ืฉืžื•ืช ืžืืจื—ื™ื.
  5. ืืชื ืžื•ื–ืžื ื™ื ืœื”ื•ืกื™ืฃ ืคืจืžื˜ืจื™ื ืœืžื—ืœืงื•ืช ื•ื”ื’ื“ืจื•ืช - ื–ื” ืขื“ื™ืฃ ืขืœ ืœื•ื’ื™ืงื” ืžืจื•ืžื–ืช ื”ื—ื‘ื•ื™ื” ื‘ื’ื•ืฃ ื”ืžื—ืœืงื”/ื”ื’ื“ืจื”.

ืื ื™ ืืกื‘ื™ืจ ืžื“ื•ืข ืื ื™ ืžืžืœื™ืฅ ืœืขืฉื•ืช ื–ืืช ื‘ืžืืžืจ ื”ื‘ื.

ืžืกืงื ื”

ื ืกื™ื™ื ืขื ื”ื”ืงื“ืžื”. ื‘ืžืืžืจ ื”ื‘ื ืืกืคืจ ืœื›ื ืขืœ Hiera, ENC ื•-PuppetDB.

ืจืง ืžืฉืชืžืฉื™ื ืจืฉื•ืžื™ื ื™ื›ื•ืœื™ื ืœื”ืฉืชืชืฃ ื‘ืกืงืจ. ืœื”ืชื—ื‘ืจื‘ื‘ืงืฉื”.

ืœืžืขืฉื”, ื™ืฉ ื”ืจื‘ื” ื™ื•ืชืจ ื—ื•ืžืจ - ืื ื™ ื™ื›ื•ืœ ืœื›ืชื•ื‘ ืžืืžืจื™ื ื‘ื ื•ืฉืื™ื ื”ื‘ืื™ื, ืœื”ืฆื‘ื™ืข ืขืœ ืžื” ืฉืชื”ื™ื” ืžืขื•ื ื™ื™ืŸ ืœืงืจื•ื ืขืœื™ื•:

  • 59,1%ื‘ื ื™ื™ืช ื‘ื•ื‘ื•ืช ืžืชืงื“ืžืช - ืงืฆืช ื—ืจื ื‘ืจืžื” ื”ื‘ืื”: ืœื•ืœืื•ืช, ืžื™ืคื•ื™ ื•ื‘ื™ื˜ื•ื™ื™ ืœืžื‘ื“ื” ืื—ืจื™ื, ืื•ืกืคื™ ืžืฉืื‘ื™ื, ืžืฉืื‘ื™ื ืžื™ื•ืฆืื™ื ื•ืชืงืฉื•ืจืช ื‘ื™ืŸ ืžืืจื—ื™ื ื‘ืืžืฆืขื•ืช Puppet, ืชื’ื™ื, ืกืคืงื™ื, ืกื•ื’ื™ ื ืชื•ื ื™ื ืžื•ืคืฉื˜ื™ื.13
  • 31,8%"ืื ื™ ื”ืžื ื”ืœืช ืฉืœ ืืžื ืฉืœื™" ืื• ืื™ืš ื‘ืื‘ื™ื˜ื• ื”ืชื™ื™ื“ื“ื ื• ืขื ื›ืžื” ืฉืจืชื™ ืคื•ืคื˜ื™ื ื‘ื’ืจืกืื•ืช ืฉื•ื ื•ืช, ื•ื‘ืื•ืคืŸ ืขืงืจื•ื ื™, ื”ื—ืœืง ืฉืœ ื ื™ื”ื•ืœ ืฉืจืช ื”ืคื•ืคื˜.7
  • 81,8%ืื™ืš ืื ื—ื ื• ื›ื•ืชื‘ื™ื ืงื•ื“ ื‘ื•ื‘ื•ืช: ืžื›ืฉื•ืจ, ืชื™ืขื•ื“, ื‘ื“ื™ืงื•ืช, CI/CD.18

22 ืžืฉืชืžืฉื™ื ื”ืฆื‘ื™ืขื•. 9 ืžืฉืชืžืฉื™ื ื ืžื ืขื•.

ืžืงื•ืจ: www.habr.com