ํผํŽซ ์†Œ๊ฐœ

Puppet์€ ๊ตฌ์„ฑ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ๋ฅผ ์›ํ•˜๋Š” ์ƒํƒœ๋กœ ๋งŒ๋“ค๊ณ  ์ด ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ €๋Š” Puppet๊ณผ ํ•จ๊ป˜ ์ผํ•œ ์ง€ XNUMX๋…„์ด ๋„˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ํ…์ŠคํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณต์‹ ๋ฌธ์„œ์˜ ํ•ต์‹ฌ ์‚ฌํ•ญ์„ ๋ฒˆ์—ญํ•˜๊ณ  ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•œ ํŽธ์ง‘๋ณธ์ด๋ฏ€๋กœ ์ดˆ๋ณด์ž๊ฐ€ Puppet์˜ ๋ณธ์งˆ์„ ๋น ๋ฅด๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํผํŽซ ์†Œ๊ฐœ

๊ธฐ๋ณธ ์ •๋ณด

Puppet์˜ ์šด์˜ ์ฒด์ œ๋Š” ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„์ด์ง€๋งŒ ์ œํ•œ๋œ ๊ธฐ๋Šฅ์œผ๋กœ ์„œ๋ฒ„๋ฆฌ์Šค ์ž‘์—…๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—…์˜ ํ’€ ๋ชจ๋ธ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ XNUMX๋ถ„๋งˆ๋‹ค ํ•œ ๋ฒˆ์”ฉ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜์—ฌ ๊ตฌ์„ฑ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. Ansible๋กœ ์ž‘์—…ํ•œ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ํ‘ธ์‹œ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž๊ฐ€ ๊ตฌ์„ฑ ์ ์šฉ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•˜์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ ์ž์ฒด๋Š” ์•„๋ฌด ๊ฒƒ๋„ ์ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋„คํŠธ์›Œํฌ ํ†ต์‹  ์ค‘์—๋Š” ์–‘๋ฐฉํ–ฅ TLS ์•”ํ˜ธํ™”๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๋Š” ์ž์ฒด ๊ฐœ์ธ ํ‚ค์™€ ํ•ด๋‹น ์ธ์ฆ์„œ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•˜์ง€๋งŒ ์›์น™์ ์œผ๋กœ ์™ธ๋ถ€ CA๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ ์–ธ๋ฌธ ์†Œ๊ฐœ

๊ผญ๋‘๊ฐ์‹œ ์šฉ์–ด๋กœ ์ธํ˜• ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋‹ค ๋…ธ๋“œ (๋…ธ๋“œ). ๋…ธ๋“œ ๊ตฌ์„ฑ์ด ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์„ ์–ธ๋ฌธ์—์„œ ํŠน๋ณ„ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด - Puppet DSL.

Puppet DSL์€ ์„ ์–ธ์  ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐœ๋ณ„ ๋ฆฌ์†Œ์Šค ์„ ์–ธ ํ˜•์‹์œผ๋กœ ์›ํ•˜๋Š” ๋…ธ๋“œ ์ƒํƒœ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ํŒŒ์ผ์ด ์กด์žฌํ•˜๋ฉฐ ํŠน์ • ์ฝ˜ํ…์ธ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŒจํ‚ค์ง€๊ฐ€ ์„ค์น˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์„œ๋น„์Šค๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌ์†Œ์Šค๋Š” ์ƒํ˜ธ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ข…์†์„ฑ์ด ์žˆ์œผ๋ฉฐ ๋ฆฌ์†Œ์Šค๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ์ˆœ์„œ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด, "๋จผ์ € ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•œ ๋‹ค์Œ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ํŽธ์ง‘ํ•œ ๋‹ค์Œ ์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค."
  • ์•Œ๋ฆผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ ๊ตฌ๋…ํ•œ ๋ฆฌ์†Œ์Šค์— ์•Œ๋ฆผ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด ๊ตฌ์„ฑ ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์„œ๋น„์Šค๋ฅผ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Puppet DSL์—๋Š” ํ•จ์ˆ˜์™€ ๋ณ€์ˆ˜๋Š” ๋ฌผ๋ก  ์กฐ๊ฑด๋ฌธ๊ณผ ์„ ํƒ๊ธฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. EPP ๋ฐ ERB ๋“ฑ ๋‹ค์–‘ํ•œ ํ…œํ”Œ๋ฆฟ ๋ฉ”์ปค๋‹ˆ์ฆ˜๋„ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

Puppet์€ Ruby๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฏ€๋กœ ๋งŽ์€ ๊ตฌ์„ฑ๊ณผ ์šฉ์–ด๊ฐ€ Ruby์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค. Ruby๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Puppet์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ณต์žกํ•œ ๋…ผ๋ฆฌ, ์ƒˆ๋กœ์šด ์œ ํ˜•์˜ ๋ฆฌ์†Œ์Šค, ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Puppet์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์„œ๋ฒ„์˜ ๊ฐ ํŠน์ • ๋…ธ๋“œ์— ๋Œ€ํ•œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๊ฐ€ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. ๋””๋ ‰ํ† ๋ฆฌ ํ•จ์ˆ˜, ๋ณ€์ˆ˜ ๋ฐ ์กฐ๊ฑด๋ฌธ ํ™•์žฅ์˜ ๊ฐ’์„ ๊ณ„์‚ฐํ•œ ํ›„ ๋ฆฌ์†Œ์Šค์™€ ๊ทธ ๊ด€๊ณ„์˜ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ ๋ฐ ์ฝ”๋“œ ์Šคํƒ€์ผ

์ œ๊ณต๋œ ์˜ˆ์ œ๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ตฌ๋ฌธ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๊ณต์‹ ๋ฌธ์„œ ์„น์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

๋“ค์—ฌ์“ฐ๊ธฐ์™€ ์ค„ ๋ฐ”๊ฟˆ์€ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ ํ•„์ˆ˜ ๋ถ€๋ถ„์€ ์•„๋‹ˆ์ง€๋งŒ ๊ถŒ์žฅ๋˜๋Š” ๋ถ€๋ถ„์€ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ. ์š”์•ฝ:

  • XNUMX์นธ ๋“ค์—ฌ์“ฐ๊ธฐ, ํƒญ์€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ค‘๊ด„ํ˜ธ๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์ง€๋งŒ ์ฝœ๋ก ์€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•˜์—ฌ ๊ฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋’ค์—๋Š” ์‰ผํ‘œ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ณ„๋„์˜ ์ค„์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ์—๋Š” ์˜ˆ์™ธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‰ผํ‘œ ์—†์ด ํ•œ ์ค„์— ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: resource { 'title': } ะธ resource { 'title': param => value }).
  • ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํ™”์‚ดํ‘œ๋Š” ๋™์ผํ•œ ๋ ˆ๋ฒจ์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž์› ๊ด€๊ณ„ ํ™”์‚ดํ‘œ๊ฐ€ ์•ž์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

pappetserver์˜ ํŒŒ์ผ ์œ„์น˜

์ž์„ธํ•œ ์„ค๋ช…์„ ์œ„ํ•ด โ€œ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌโ€๋ผ๋Š” ๊ฐœ๋…์„ ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” ํŠน์ • ๋…ธ๋“œ์— ๋Œ€ํ•œ Puppet ๊ตฌ์„ฑ์ด ํฌํ•จ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ์ž…๋‹ˆ๋‹ค.

๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” Puppet ๋ฒ„์ „๊ณผ ์‚ฌ์šฉ๋˜๋Š” ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํ™˜๊ฒฝ์€ ๋ณ„๋„์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ €์žฅ๋˜๋Š” ๋…๋ฆฝ์ ์ธ ๊ตฌ์„ฑ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ git๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ด ๊ฒฝ์šฐ ํ™˜๊ฒฝ์€ git ๋ธŒ๋žœ์น˜์—์„œ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ ๋…ธ๋“œ๋Š” ํ•˜๋‚˜์˜ ํ™˜๊ฒฝ ๋˜๋Š” ๋‹ค๋ฅธ ํ™˜๊ฒฝ์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋…ธ๋“œ ์ž์ฒด์—์„œ ๊ตฌ์„ฑํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ๊ธฐ์‚ฌ์—์„œ ์„ค๋ช…ํ•  ENC์—์„œ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์„ธ ๋ฒˆ์งธ ๋ฒ„์ „("old Puppet")์—์„œ ๊ธฐ๋ณธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. /etc/puppet. ํ™˜๊ฒฝ ์‚ฌ์šฉ์€ ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด์ „ Puppet์—์„œ๋Š” ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ™˜๊ฒฝ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ ์œ„์น˜์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. /etc/puppet/environments, ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” ํ™˜๊ฒฝ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ๊ธฐ๋ณธ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • ๋„ค ๋ฒˆ์งธ ๋ฒ„์ „(โ€œnew Puppetโ€)๋ถ€ํ„ฐ ํ™˜๊ฒฝ ์‚ฌ์šฉ์ด ํ•„์ˆ˜๊ฐ€ ๋˜์—ˆ์œผ๋ฉฐ ๊ธฐ๋ณธ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ๋‹ค์Œ์œผ๋กœ ์ด๋™๋˜์—ˆ์Šต๋‹ˆ๋‹ค. /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 ะฟะพะปัƒั‡ะฐะตั‚ ัƒะฒะตะดะพะผะปะตะฝะธะต,
  # ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒัŽั‰ะธะน ัะตั€ะฒะธั ะฟะตั€ะตะทะฐะฟัƒัะบะฐะตั‚ัั.
}

์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด Puppet ์„œ๋ฒ„์— ๋Œ€๋žต ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒŒ์ผ ์œ„์น˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

/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์˜ ํŒŒ์ผ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค)
  • ๋ชฉํ‘œ โ€” ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์œ„์น˜(์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ) ํ•จ์œ ๋Ÿ‰ ๋˜๋Š” )
  • ์†Œ์œ ์ž โ€” ํŒŒ์ผ์„ ์†Œ์œ ํ•ด์•ผ ํ•˜๋Š” ์‚ฌ์šฉ์ž
  • ๊ทธ๋ฃน โ€” ํŒŒ์ผ์ด ์†ํ•ด์•ผ ํ•˜๋Š” ๊ทธ๋ฃน
  • ๋ชจ๋“œ โ€” ํŒŒ์ผ ๊ถŒํ•œ(๋ฌธ์ž์—ด)
  • ์žฌ๊ท€ - ์žฌ๊ท€์ ์ธ ๋””๋ ‰ํ† ๋ฆฌ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•˜์ œ - Puppet์— ์„ค๋ช…๋˜์ง€ ์•Š์€ ํŒŒ์ผ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ •๋ ฅ์—๋„ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. - Puppet์— ์„ค๋ช…๋˜์ง€ ์•Š์€ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊พธ๋Ÿฌ๋ฏธ

ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์•Œ๋ฆผ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ - ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ง€์ •๋œ ๊ฒฝ์šฐ ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์‹œ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ์„ค์น˜_์ƒˆ๋กœ ๊ณ ์นจ.

๋งค๊ฐœ ๋ณ€์ˆ˜ :

  • ๋ฆฌ์†Œ์Šค ์ด๋ฆ„ โ€” ํŒจํ‚ค์ง€ ์ด๋ฆ„(์„ ํƒ ์‚ฌํ•ญ)
  • name โ€” ํŒจํ‚ค์ง€ ์ด๋ฆ„(์ด๋ฆ„์— ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ)
  • ๊ณต๊ธ‰์ž โ€” ์‚ฌ์šฉํ•  ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž
  • ํ™•์ธ โ€” ์›ํ•˜๋Š” ํŒจํ‚ค์ง€ ์ƒํƒœ:
    • present, installed - ์„ค์น˜๋œ ๋ชจ๋“  ๋ฒ„์ „
    • latest - ์ตœ์‹  ๋ฒ„์ „์ด ์„ค์น˜๋จ
    • absent - ์‚ญ์ œ๋จ(apt-get remove)
    • purged โ€” ๊ตฌ์„ฑ ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ์‚ญ์ œ๋จ(apt-get purge)
    • held - ํŒจํ‚ค์ง€ ๋ฒ„์ „์ด ์ž ๊ฒจ ์žˆ์Šต๋‹ˆ๋‹ค(apt-mark hold)
    • ะปัŽะฑะฐั ะดั€ัƒะณะฐั ัั‚ั€ะพะบะฐ โ€” ์ง€์ •๋œ ๋ฒ„์ „์ด ์„ค์น˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์‹œ ์„ค์น˜_์ƒˆ๋กœ ๊ณ ์นจ - ๋งŒ์•ฝ true, ์•Œ๋ฆผ์„ ๋ฐ›์œผ๋ฉด ํŒจํ‚ค์ง€๊ฐ€ ๋‹ค์‹œ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•ด์•ผ ํ•˜๋Š” ์†Œ์Šค ๊ธฐ๋ฐ˜ ๋ฐฐํฌ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ false.

์„œ๋น„์Šค

์„œ๋น„์Šค๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์•Œ๋ฆผ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ - ์„œ๋น„์Šค๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ ๋ณ€์ˆ˜ :

  • ๋ฆฌ์†Œ์Šค ์ด๋ฆ„ โ€” ๊ด€๋ฆฌํ•  ์„œ๋น„์Šค(์„ ํƒ ์‚ฌํ•ญ)
  • name โ€” ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์„œ๋น„์Šค(์ด๋ฆ„์— ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ)
  • ํ™•์ธ โ€” ์›ํ•˜๋Š” ์„œ๋น„์Šค ์ƒํƒœ:
    • running - ์ถœ์‹œ
    • stopped - ์ค‘์ง€๋จ
  • ๊ฐ€๋Šฅ โ€” ์„œ๋น„์Šค ์‹œ์ž‘ ๊ธฐ๋Šฅ์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
    • true โ€” ์ž๋™ ์‹คํ–‰์ด ํ™œ์„ฑํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค(systemctl enable)
    • mask - ์œ„์žฅํ•œ (systemctl mask)
    • false โ€” ์ž๋™ ์‹คํ–‰์ด ๋น„ํ™œ์„ฑํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค(systemctl disable)
  • ๋‹ค์‹œ ์‹œ์ž‘ - ์„œ๋น„์Šค๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋Š” ๋ช…๋ น
  • ์ง€์œ„ โ€” ์„œ๋น„์Šค ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ช…๋ น
  • ๋‹ค์‹œ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค โ€” ์„œ๋น„์Šค initscript๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘์„ ์ง€์›ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋งŒ์•ฝ์— false ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ง€์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ์ž‘ โ€” ์ด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ์— false ๋ฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋‹ค์‹œ ์‹œ์ž‘ ์ง€์ •๋˜์ง€ ์•Š์Œ - ์„œ๋น„์Šค๊ฐ€ ์ค‘์ง€๋˜์—ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ systemd๋Š” ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค) systemctl restart).
  • ์ƒํƒœ๊ฐ€ ์ข‹์ง€ ์•Š์Œ โ€” ์„œ๋น„์Šค initscript๊ฐ€ ๋ช…๋ น์„ ์ง€์›ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. status. ๋งŒ์•ฝ false์ด๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ง€์œ„. ๊ธฐ๋ณธ true.

์ž„์›

์™ธ๋ถ€ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ƒ์„ฑ, ๊ฒฝ์šฐ์—๋งŒ, ...์„ ์ œ์™ธํ•˜๋ฉด ๋˜๋Š” ์ƒˆ๋กœ ๊ณ ์นจ ์ „์šฉ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Puppet์ด ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ๋ช…๋ น์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์•Œ๋ฆผ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ - ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ ๋ณ€์ˆ˜ :

  • ๋ฆฌ์†Œ์Šค ์ด๋ฆ„ โ€” ์‹คํ–‰ํ•  ๋ช…๋ น(์„ ํƒ ์‚ฌํ•ญ)
  • ๋ช…๋ น โ€” ์‹คํ–‰ํ•  ๋ช…๋ น(์ด๋ฆ„์— ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ)
  • ํ†ต๋กœ โ€” ์‹คํ–‰ ํŒŒ์ผ์„ ์ฐพ์„ ๊ฒฝ๋กœ
  • ๊ฒฝ์šฐ์—๋งŒ โ€” ์ด ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ง€์ •๋œ ๋ช…๋ น์ด XNUMX ๋ฐ˜ํ™˜ ์ฝ”๋“œ๋กœ ์™„๋ฃŒ๋˜๋ฉด ๊ธฐ๋ณธ ๋ช…๋ น์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ...์„ ์ œ์™ธํ•˜๋ฉด โ€” ์ด ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ง€์ •๋œ ๋ช…๋ น์ด XNUMX์ด ์•„๋‹Œ ๋ฐ˜ํ™˜ ์ฝ”๋“œ๋กœ ์™„๋ฃŒ๋˜๋ฉด ๊ธฐ๋ณธ ๋ช…๋ น์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ์ƒ์„ฑ โ€” ์ด ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ง€์ •๋œ ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ ๋ช…๋ น์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ ๊ณ ์นจ ์ „์šฉ - ๋งŒ์•ฝ true, ์ด exec๊ฐ€ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ์•Œ๋ฆผ์„ ๋ฐ›์„ ๋•Œ๋งŒ ๋ช…๋ น์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • cwd โ€” ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋””๋ ‰ํ„ฐ๋ฆฌ
  • ์‚ฌ์šฉ์ž โ€” ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์‚ฌ์šฉ์ž
  • ๊ณต๊ธ‰์ž - ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•:
    • POSIX โ€” ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ„๋‹จํžˆ ์ƒ์„ฑ๋˜๋ฏ€๋กœ ๋‹ค์Œ์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ†ต๋กœ
    • ๊ป์งˆ - ๋ช…๋ น์ด ์‰˜์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. /bin/sh, ์ง€์ •๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ†ต๋กœ, ๊ธ€๋กœ๋น™, ํŒŒ์ดํ”„ ๋ฐ ๊ธฐํƒ€ ์‰˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํŠน์ˆ˜ ๋ฌธ์ž(|, ;, &&, || ๊ธฐํƒ€).

ํฌ๋ก 

cronjob์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ ๋ณ€์ˆ˜ :

  • ๋ฆฌ์†Œ์Šค ์ด๋ฆ„ - ์ผ์ข…์˜ ์‹๋ณ„์ž์ผ ๋ฟ
  • ํ™•์ธ โ€” ์™•๊ด€ ์ž‘์—… ์ƒํƒœ:
    • present - ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ƒ์„ฑ
    • absent - ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์‚ญ์ œ
  • ๋ช…๋ น - ์‹คํ–‰ํ•  ๋ช…๋ น
  • ํ™˜๊ฒฝ โ€” ๋ช…๋ น์„ ์‹คํ–‰ํ•  ํ™˜๊ฒฝ(ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ชฉ๋ก ๋ฐ ํ•ด๋‹น ๊ฐ’์„ ํ†ตํ•ด) =)
  • ์‚ฌ์šฉ์ž โ€” ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์‚ฌ์šฉ์ž
  • ๋ถ„, ์‹œ๊ฐ„, ์ฃผ์ผ, ์›”, ์›” ์ผ โ€” cron์„ ์‹คํ–‰ํ•  ์‹œ๊ธฐ. ์ด๋Ÿฌํ•œ ์†์„ฑ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ง€์ •๋˜์ง€ ์•Š์œผ๋ฉด crontab์˜ ํ•ด๋‹น ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. *.

ํผํŽซ 6.0์—์„œ ํฌ๋ก  ๋งˆ์น˜ ์ƒ์ž์—์„œ ๊บผ๋‚ธ 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 ัƒ ์ž„์›, ๋“ฑ๋“ฑ.

๋ฉ”ํƒ€ ๋งค๊ฐœ๋ณ€์ˆ˜

๊ฐ ๋ฆฌ์†Œ์Šค ์œ ํ˜•์—๋Š” ํŠน์„ฑ์— ๊ด€๊ณ„์—†์ด ๋ช‡ ๊ฐ€์ง€ ํŠน์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”ํƒ€ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ „์ฒด ๋ชฉ๋ก Puppet ๋ฌธ์„œ์—์„œ.

์งง์€ ๋ชฉ๋ก:

  • ํ•„์š” โ€” ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ด ๋ฆฌ์†Œ์Šค๊ฐ€ ์˜์กดํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ์ „์— - ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ด ๋ฆฌ์†Œ์Šค์— ์˜์กดํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€์ž… โ€” ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ด ๋ฆฌ์†Œ์Šค๊ฐ€ ์•Œ๋ฆผ์„ ๋ฐ›๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ํ†ต๋ณด โ€” ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ด ๋ฆฌ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ์•Œ๋ฆผ์„ ๋ฐ›๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜์—ด๋œ ๋ชจ๋“  ๋ฉ”ํƒ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋‹จ์ผ ๋ฆฌ์†Œ์Šค ๋งํฌ ๋˜๋Š” ๋Œ€๊ด„ํ˜ธ๋กœ ๋ฌถ์ธ ๋งํฌ ๋ฐฐ์—ด์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ์†Œ์Šค ๋งํฌ

๋ฆฌ์†Œ์Šค ๋งํฌ๋Š” ๋‹จ์ˆœํžˆ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์–ธ๊ธ‰์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ ์ข…์†์„ฑ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋งํฌ์˜ ๊ตฌ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋Œ€๋ฌธ์ž๊ฐ€ ํฌํ•จ๋œ ๋ฆฌ์†Œ์Šค ์œ ํ˜•(์œ ํ˜• ์ด๋ฆ„์— ์ด์ค‘ ์ฝœ๋ก ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ ์ฝœ๋ก  ์‚ฌ์ด์˜ ์ด๋ฆ„ ๋ถ€๋ถ„์ด ๋ชจ๋‘ ๋Œ€๋ฌธ์ž๋กœ ํ‘œ์‹œ๋จ), ๋Œ€๊ด„ํ˜ธ ์•ˆ์˜ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„(์ด๋ฆ„์˜ ๋Œ€/์†Œ๋ฌธ์ž) ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค!). ๊ณต๋ฐฑ์ด ์—†์–ด์•ผ ํ•˜๋ฉฐ, ํƒ€์ž…๋ช… ๋ฐ”๋กœ ๋’ค์— ๋Œ€๊ด„ํ˜ธ๋ฅผ ์“ด๋‹ค.

์˜ˆ :

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

์ข…์†์„ฑ ๋ฐ ์•Œ๋ฆผ

์—ฌ๊ธฐ์— ๋ฌธ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ž์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ฆฌ์†Œ์Šค ๊ฐ„์˜ ๋‹จ์ˆœ ์ข…์†์„ฑ์€ ์ „์ด์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” ์ฃผ์˜ํ•˜์‹ญ์‹œ์˜ค. ์ˆœํ™˜ ์ข…์†์„ฑ์„ ์ƒ์„ฑํ•˜๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ข…์†์„ฑ๊ณผ ๋‹ฌ๋ฆฌ ์•Œ๋ฆผ์€ ์ „์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•Œ๋ฆผ์—๋Š” ๋‹ค์Œ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • ๋ฆฌ์†Œ์Šค๊ฐ€ ์•Œ๋ฆผ์„ ๋ฐ›์œผ๋ฉด ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ ์ž‘์—…์€ ๋ฆฌ์†Œ์Šค ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ž„์› ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ณ , ์„œ๋น„์Šค ์„œ๋น„์Šค๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ณ , ๊พธ๋Ÿฌ๋ฏธ ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์‹œ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค์— ์—…๋ฐ์ดํŠธ ์ž‘์—…์ด ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Puppet์„ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ๋ฆฌ์†Œ์Šค๋Š” ํ•œ ๋ฒˆ๋งŒ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์•Œ๋ฆผ์— ์ข…์†์„ฑ์ด ํฌํ•จ๋˜๊ณ  ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„์—๋Š” ์ฃผ๊ธฐ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • Puppet์ด ๋ฆฌ์†Œ์Šค ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฆฌ์†Œ์Šค๋Š” ์ด๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ์•Œ๋ฆผ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ๋ฆฌ์†Œ์Šค๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋ฉด ์ด๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ์•Œ๋ฆผ์ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

์ง€์ •๋˜์ง€ ์•Š์€ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ฒ˜๋ฆฌ

์ผ๋ฐ˜์ ์œผ๋กœ ์ผ๋ถ€ ๋ฆฌ์†Œ์Šค ๋งค๊ฐœ๋ณ€์ˆ˜์— ๊ธฐ๋ณธ๊ฐ’์ด ์—†๊ณ  ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ Puppet์€ ๋…ธ๋“œ์˜ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์ด ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ ์œ ํ˜•์˜ ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํŒŒ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. owner์„ ์„ ํƒํ•˜๋ฉด Puppet์€ ํ•ด๋‹น ํŒŒ์ผ์˜ ์†Œ์œ ์ž๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํด๋ž˜์Šค, ๋ณ€์ˆ˜ ๋ฐ ์ •์˜ ์†Œ๊ฐœ

๊ตฌ์„ฑ์˜ ๋™์ผํ•œ ๋ถ€๋ถ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ์ฐจ์ด์ ๋„ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ๊ฒƒ์„ ํ•˜๋‚˜์˜ ๋ธ”๋ก์œผ๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. node {}. ๋ฌผ๋ก  ๊ตฌ์„ฑ์˜ ๋™์ผํ•œ ๋ถ€๋ถ„์„ ๊ฐ„๋‹จํžˆ ๋ณต์‚ฌํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Š” ๋‚˜์œ ํ•ด๊ฒฐ์ฑ…์ž…๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์ด ์ปค์ง€๊ณ  ๊ตฌ์„ฑ์˜ ์ผ๋ฐ˜์ ์ธ ๋ถ€๋ถ„์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๋™์ผํ•œ ๋‚ด์šฉ์„ ํŽธ์ง‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ์‹ค์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ DRY(๋ฐ˜๋ณตํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค) ์›์น™์ด ๊ณ ์•ˆ๋œ ๋ฐ์—๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋””์ž์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค.

์ˆ˜์—…

ํด๋ž˜์Šค ํฌํŽซ ์ฝ”๋“œ์˜ ๋ช…๋ช…๋œ ๋ธ”๋ก์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € ํด๋ž˜์Šค๋ฅผ ์„ค๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„ค๋ช… ์ž์ฒด๋Š” ์–ด๋””์—๋„ ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋Š” ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

# ะžะฟะธัะฐะฝะธะต ะบะปะฐััะฐ ะฝะฐั‡ะธะฝะฐะตั‚ัั ั ะบะปัŽั‡ะตะฒะพะณะพ ัะปะพะฒะฐ 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๊ฐ€ ํฌํ•จ๋œ ํŒจํ‚ค์ง€ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด 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,
) {
  ...
}

ํด๋ž˜์Šค: ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ class{'classname':} ํฌํ•จ

๊ฐ ํด๋ž˜์Šค๋Š” ์œ ํ˜•์˜ ๋ฆฌ์†Œ์Šค์ž…๋‹ˆ๋‹ค. ์ˆ˜์—…. ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๋ฆฌ์†Œ์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋™์ผํ•œ ๋…ธ๋“œ์— ๋™์ผํ•œ ํด๋ž˜์Šค์˜ ๋‘ ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ๋…ธ๋“œ์— ํด๋ž˜์Šค๋ฅผ ๋‘ ๋ฒˆ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•˜๋ฉด class { 'classname':} (์ฐจ์ด๊ฐ€ ์—†๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋‹ค๋ฅด๊ฑฐ๋‚˜ ๋™์ผํ•จ) ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฆฌ์†Œ์Šค ์Šคํƒ€์ผ์˜ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฆ‰์‹œ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ include, ๊ทธ๋Ÿฌ๋ฉด ์›ํ•˜๋Š” ๋งŒํผ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค์€ include ํด๋ž˜์Šค๊ฐ€ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฉฑ๋“ฑ์„ฑ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค๊ฐ€ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์—†์œผ๋ฉด ์ถ”๊ฐ€ํ•˜๊ณ , ์ด๋ฏธ ์žˆ์œผ๋ฉด ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ include ํด๋ž˜์Šค ์„ ์–ธ ์ค‘์—๋Š” ํด๋ž˜์Šค ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์†Œ์Šค(Hiera ๋˜๋Š” ENC)์—์„œ ์„ค์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ธฐ์‚ฌ์—์„œ ์ด์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ •์˜ํ•˜๋‹ค

์ด์ „ ๋ธ”๋ก์—์„œ ๋งํ–ˆ๋“ฏ์ด ๋™์ผํ•œ ํด๋ž˜์Šค๋Š” ๋…ธ๋“œ์— ๋‘ ๋ฒˆ ์ด์ƒ ์กด์žฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๋™์ผํ•œ ๋…ธ๋“œ์—์„œ ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ ๋™์ผํ•œ ์ฝ”๋“œ ๋ธ”๋ก์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ž์ฒด์ ์ธ ๋ฆฌ์†Œ์Šค ์œ ํ˜•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, PHP ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•ด Avito์—์„œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ด ๋ชจ๋“ˆ๋กœ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค.
  2. ์ด ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  3. php-fpm ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  4. 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' }
}

Duplicate ์„ ์–ธ ์˜ค๋ฅ˜๋ฅผ ์žก๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ Define์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ •์˜์— ์ƒ์ˆ˜ ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ๊ณ  ์ผ๋ถ€ ๋…ธ๋“œ์— ์ด ์ •์˜์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ ์žˆ๋Š” ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ์ž์‹ ์„ ๋ณดํ˜ธํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ •์˜ ๋‚ด์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋Š” ๋‹ค์Œ์— ๋”ฐ๋ผ ์ด๋ฆ„์„ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. $title. ๋Œ€์•ˆ์€ ๋ฆฌ์†Œ์Šค์˜ ๋ฉฑ๋“ฑ์  ์ถ”๊ฐ€์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ ์ •์˜์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์— ๊ณตํ†ต์ ์ธ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณ„๋„์˜ ํด๋ž˜์Šค๋กœ ์ด๋™ํ•˜๊ณ  ์ด ํด๋ž˜์Šค๋ฅผ ์ •์˜์— ํฌํ•จํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. include ๋ฉฑ๋“ฑ์„ฑ.

๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ๋ฉฑ๋“ฑ์„ฑ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•, ์ฆ‰ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. defined ะธ ensure_resourcesํ•˜์ง€๋งŒ ์ด์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ ์—ํ”ผ์†Œ๋“œ์—์„œ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

ํด๋ž˜์Šค์™€ ์ •์˜์— ๋Œ€ํ•œ ์ข…์†์„ฑ ๋ฐ ์•Œ๋ฆผ

ํด๋ž˜์Šค์™€ ์ •์˜๋Š” ์ข…์†์„ฑ ๋ฐ ์•Œ๋ฆผ ์ฒ˜๋ฆฌ์— ๋‹ค์Œ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  • ํด๋ž˜์Šค/์ •์˜์— ๋Œ€ํ•œ ์ข…์†์„ฑ์€ ํด๋ž˜์Šค/์ •์˜์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ž˜์Šค/์ •์˜ ์ข…์†์„ฑ์€ ๋ชจ๋“  ํด๋ž˜์Šค/์ •์˜ ๋ฆฌ์†Œ์Šค์— ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ž˜์Šค/์ •์˜ ์•Œ๋ฆผ์€ ํด๋ž˜์Šค/์ •์˜์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค.
  • ํด๋ž˜์Šค/์ •์˜ ๊ตฌ๋…์€ ํด๋ž˜์Šค/์ •์˜์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ๊ตฌ๋…ํ•ฉ๋‹ˆ๋‹ค.

์กฐ๊ฑด๋ฌธ ๋ฐ ์„ ํƒ๊ธฐ

์—ฌ๊ธฐ์— ๋ฌธ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

if

์—ฌ๊ธฐ์— ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

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

...์„ ์ œ์™ธํ•˜๋ฉด

Except ๋Š” if ์˜ ์—ญ์ˆœ์ž…๋‹ˆ๋‹ค: ํ‘œํ˜„์‹์ด false์ธ ๊ฒฝ์šฐ ์ฝ”๋“œ ๋ธ”๋ก์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

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

์ผ€์ด์Šค

์—ฌ๊ธฐ์—๋„ ๋ณต์žกํ•œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ •๊ทœ๊ฐ’(๋ฌธ์ž์—ด, ์ˆซ์ž ๋“ฑ), ์ •๊ทœ์‹, ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์„ ํƒ๊ธฐ

์„ ํƒ์ž๋Š” ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ์–ธ์–ด ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. case, ๊ทธ๋Ÿฌ๋‚˜ ์ฝ”๋“œ ๋ธ”๋ก์„ ์‹คํ–‰ํ•˜๋Š” ๋Œ€์‹  ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

๋ชจ๋“ˆ

๊ตฌ์„ฑ์ด ์ž‘์œผ๋ฉด ํ•˜๋‚˜์˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ์‰ฝ๊ฒŒ ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๊ฐ€ ์„ค๋ช…ํ•˜๋Š” ๊ตฌ์„ฑ์ด ๋งŽ์„์ˆ˜๋ก ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ๋” ๋งŽ์€ ํด๋ž˜์Šค์™€ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๊ณ  ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋ฉฐ ์ž‘์—…ํ•˜๊ธฐ๊ฐ€ ๋ถˆํŽธํ•ด์ง‘๋‹ˆ๋‹ค.

๋˜ํ•œ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ์žˆ์œผ๋ฉด ์ด ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๊ณผ ๊ณต์œ ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ด ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Puppet์—๋Š” ๋ชจ๋“ˆ์ด๋ผ๋Š” ์—”ํ„ฐํ‹ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“ˆ - ์ด๋Š” ๋ณ„๋„์˜ ๋””๋ ‰ํ† ๋ฆฌ์— ๋ฐฐ์น˜๋œ ํด๋ž˜์Šค, ์ •์˜ ๋ฐ ๊ธฐํƒ€ Puppet ์—”ํ„ฐํ‹ฐ ์„ธํŠธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋“ˆ์€ Puppet ๋กœ์ง์˜ ๋…๋ฆฝ์ ์ธ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด nginx ์ž‘์—…์„ ์œ„ํ•œ ๋ชจ๋“ˆ์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ nginx ์ž‘์—…์— ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ํฌํ•จํ•˜๊ฑฐ๋‚˜ PHP ์ž‘์—…์„ ์œ„ํ•œ ๋ชจ๋“ˆ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“ˆ์˜ ๋ฒ„์ „์ด ๊ด€๋ฆฌ๋˜๋ฉฐ ๋ชจ๋“ˆ ๊ฐ„์˜ ์ข…์†์„ฑ๋„ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์˜ ๊ณต๊ฐœ ์ €์žฅ์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค - ๊ผญ๋‘๊ฐ์‹œ ๋Œ€์žฅ๊ฐ„.

Puppet ์„œ๋ฒ„์—์„œ ๋ชจ๋“ˆ์€ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๋ชจ๋“ˆ ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ชจ๋“ˆ ๋‚ด๋ถ€์—๋Š” ๋งค๋‹ˆํŽ˜์ŠคํŠธ, ํŒŒ์ผ, ํ…œํ”Œ๋ฆฟ, 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, ํ…œํ”Œ๋ฆฟ ๊ฒฝ๋กœ๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์œ ํ˜•์˜ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ content. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

๊ฒฝ๋กœ ๋ณด๊ธฐ <modulename>/<filename> ํŒŒ์ผ์„ ์˜๋ฏธ <rootdir>/modules/<modulename>/templates/<filename>.

๊ทธ์™ธ์— ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค inline_template โ€” ํŒŒ์ผ ์ด๋ฆ„์ด ์•„๋‹Œ ํ…œํ”Œ๋ฆฟ ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค.

ํ…œํ”Œ๋ฆฟ ๋‚ด์—์„œ ํ˜„์žฌ ๋ฒ”์œ„์˜ ๋ชจ๋“  Puppet ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Puppet์€ ERB ๋ฐ EPP ํ˜•์‹์˜ ํ…œํ”Œ๋ฆฟ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

ERB์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ

์ œ์–ด ๊ตฌ์กฐ:

  • <%= ะ’ะซะ ะะ–ะ•ะะ˜ะ• %> โ€” ํ‘œํ˜„์‹์˜ ๊ฐ’์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
  • <% ะ’ะซะ ะะ–ะ•ะะ˜ะ• %> โ€” ์‹์˜ ๊ฐ’์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค(์‚ฝ์ž…ํ•˜์ง€ ์•Š๊ณ ). ์กฐ๊ฑด๋ฌธ(if)๊ณผ ๋ฃจํ”„(๊ฐ๊ฐ)๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์—ฌ๊ธฐ์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • <%# ะšะžะœะœะ•ะะขะะ ะ˜ะ™ %>

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์˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ๋˜๋Š” ์–ด๋–ป๊ฒŒ ์‹คํ–‰ ํŒŒ์ผ. ์‚ฌ์‹ค์€ ํ˜•์‹์œผ๋กœ๋„ ์ œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ ํ…์ŠคํŠธ ํŒŒ์ผ ๋…ธ๋“œ์—.

์ž‘๋™ ์ค‘์— puppet ์—์ด์ „ํŠธ๋Š” ๋จผ์ € ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์‚ฌ์‹ค ์ˆ˜์ง‘๊ธฐ๋ฅผ pappetserver์—์„œ ๋…ธ๋“œ๋กœ ๋ณต์‚ฌํ•œ ํ›„ ์ด๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ˆ˜์ง‘๋œ ์‚ฌ์‹ค์„ ์„œ๋ฒ„๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๊ทธ ํ›„ ์„œ๋ฒ„๋Š” ์นดํƒˆ๋กœ๊ทธ ์ปดํŒŒ์ผ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ํŒŒ์ผ ํ˜•ํƒœ์˜ ์‚ฌ์‹ค

์ด๋Ÿฌํ•œ ์‚ฌ์‹ค์€ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ชจ๋“ˆ์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค. facts.d. ๋ฌผ๋ก  ํŒŒ์ผ์€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ์‹œ YAML ๋˜๋Š” key=value ํ˜•์‹์œผ๋กœ ํ‘œ์ค€ ์ถœ๋ ฅ์— ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“ˆ์ด ๋ฐฐํฌ๋˜๋Š” ํฌํŽซ ์„œ๋ฒ„์— ์˜ํ•ด ์ œ์–ด๋˜๋Š” ๋ชจ๋“  ๋…ธ๋“œ์— ์‚ฌ์‹ค์ด ์ ์šฉ๋œ๋‹ค๋Š” ์ ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋”ฐ๋ผ์„œ ์Šคํฌ๋ฆฝํŠธ์—์„œ ํŒฉํŠธ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ๊ณผ ํŒŒ์ผ์ด ์‹œ์Šคํ…œ์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

#!/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 ์˜ค๋ž˜๋œ ์ธํ˜•์ด๋‚˜ /etc/puppetlabs/facts.d ์ƒˆ๋กœ์šด ์ธํ˜•์—์„œ.

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

์‚ฌ์‹ค ํ™•์ธ

์‚ฌ์‹ค์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์‚ฌ์ „์„ ํ†ตํ•ด $facts: $facts['fqdn'];
  • ์‚ฌ์‹ค ์ด๋ฆ„์„ ๋ณ€์ˆ˜ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ: $fqdn.

์‚ฌ์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. $facts๋˜๋Š” ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ „์—ญ ๋„ค์ž„์ŠคํŽ˜์ด์Šค($::facts).

๋‹ค์Œ์€ ๋ฌธ์„œ์˜ ๊ด€๋ จ ์„น์…˜์ž…๋‹ˆ๋‹ค.

๋‚ด์žฅ ๋ณ€์ˆ˜

์‚ฌ์‹ค ์™ธ์—๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋ณ€์ˆ˜, ์ „์—ญ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์‹ค โ€” ํด๋ผ์ด์–ธํŠธ์˜ ์ธ์ฆ์„œ์—์„œ ๊ฐ€์ ธ์˜จ ๋ณ€์ˆ˜(์ธ์ฆ์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํฌํ• ์„œ๋ฒ„์—์„œ ๋ฐœ๊ธ‰๋˜๋ฏ€๋กœ ์—์ด์ „ํŠธ๋Š” ์ธ์ฆ์„œ๋ฅผ ๊ฐ€์ ธ์™€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋ณ€์ˆ˜๋Š” "์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"): ์ธ์ฆ์„œ ์ด๋ฆ„, ์ธ์ฆ์„œ ์ด๋ฆ„ ํ˜ธ์ŠคํŠธ ๋ฐ ๋„๋ฉ”์ธ, ์ธ์ฆ์„œ์˜ ํ™•์žฅ๋ช….
  • ์„œ๋ฒ„ ์‚ฌ์‹ค โ€”์„œ๋ฒ„ ์ •๋ณด์™€ ๊ด€๋ จ๋œ ๋ณ€์ˆ˜โ€”๋ฒ„์ „, ์ด๋ฆ„, ์„œ๋ฒ„ IP ์ฃผ์†Œ, ํ™˜๊ฒฝ.
  • ๋Œ€๋ฆฌ์ธ ์‚ฌ์‹ค โ€” ํŒฉํ„ฐ๊ฐ€ ์•„๋‹Œ puppet-agent์— ์˜ํ•ด ์ง์ ‘ ์ถ”๊ฐ€๋œ ๋ณ€์ˆ˜ โ€” ์ธ์ฆ์„œ ์ด๋ฆ„, ์—์ด์ „ํŠธ ๋ฒ„์ „, puppet ๋ฒ„์ „.
  • ๋งˆ์Šคํ„ฐ ๋ณ€์ˆ˜ - Pappetmaster ๋ณ€์ˆ˜(sic!). ์—์„œ์™€ ๊ฑฐ์˜ ๊ฐ™์Šต๋‹ˆ๋‹ค ์„œ๋ฒ„ ์‚ฌ์‹ค, ๊ตฌ์„ฑ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ปดํŒŒ์ผ๋Ÿฌ ๋ณ€์ˆ˜ โ€” ๊ฐ ๋ฒ”์œ„์—์„œ ๋‹ค๋ฅธ ์ปดํŒŒ์ผ๋Ÿฌ ๋ณ€์ˆ˜: ํ˜„์žฌ ๋ชจ๋“ˆ์˜ ์ด๋ฆ„๊ณผ ํ˜„์žฌ ๊ฐ์ฒด์— ์•ก์„ธ์Šคํ•œ ๋ชจ๋“ˆ์˜ ์ด๋ฆ„. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐœ์ธ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์ง์ ‘ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ 1: ์ด ๋ชจ๋“  ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ•˜๊ณ  ๋””๋ฒ„๊ทธํ•˜๋‚˜์š”?

๊ธฐ์‚ฌ์—๋Š” ์ธํ˜• ์ฝ”๋“œ์˜ ๋งŽ์€ ์˜ˆ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ ์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ „ํ˜€ ์•Œ๋ ค์ฃผ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ธ€์Ž„, ๋‚˜๋Š” ๋‚ด ์ž์‹ ์„ ์ •์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—์ด์ „ํŠธ๋Š” Puppet์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์ถฉ๋ถ„ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์„œ๋ฒ„๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋ฆฌ์ธ

์ ์–ด๋„ ๋ฒ„์ „ XNUMX๋ถ€ํ„ฐ๋Š” puppet-agent ํŒจํ‚ค์ง€๊ฐ€ ๊ณต์‹ Puppetlabs ์ €์žฅ์†Œ ๋ชจ๋“  ์ข…์†์„ฑ(ruby ๋ฐ ํ•ด๋‹น gem)์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์„ค์น˜์— ์–ด๋ ค์›€์ด ์—†์Šต๋‹ˆ๋‹ค. (์ €๋Š” Debian ๊ธฐ๋ฐ˜ ๋ฐฐํฌํŒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” 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

๋ฌผ๋ก  ์„œ๋ฒ„๋ฅผ ์„ค์ •ํ•˜๊ณ  ๋ฐ๋ชฌ ๋ชจ๋“œ๋กœ ๋…ธ๋“œ์—์„œ ์—์ด์ „ํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ XNUMX๋ถ„๋งˆ๋‹ค ํ•œ ๋ฒˆ์”ฉ ์„œ๋ฒ„์—์„œ ๋‹ค์šด๋กœ๋“œํ•œ ๊ตฌ์„ฑ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—…์˜ ํ‘ธ์‹œ ๋ชจ๋ธ์„ ๋ชจ๋ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€์‹ฌ ์žˆ๋Š” ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜์—ฌ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. sudo puppet agent -t. ์—ด์‡  -t (--test)์—๋Š” ์‹ค์ œ๋กœ ๊ฐœ๋ณ„์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ์˜ต์…˜์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜ต์…˜์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • ๋ฐ๋ชฌ ๋ชจ๋“œ์—์„œ ์‹คํ–‰ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค(๊ธฐ๋ณธ์ ์œผ๋กœ ์—์ด์ „ํŠธ๋Š” ๋ฐ๋ชฌ ๋ชจ๋“œ์—์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค).
  • ์นดํƒˆ๋กœ๊ทธ๋ฅผ ์ ์šฉํ•œ ํ›„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค(๊ธฐ๋ณธ์ ์œผ๋กœ ์—์ด์ „ํŠธ๋Š” XNUMX๋ถ„๋งˆ๋‹ค ํ•œ ๋ฒˆ์”ฉ ๊ณ„์† ์ž‘๋™ํ•˜๊ณ  ๊ตฌ์„ฑ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค).
  • ์ž์„ธํ•œ ์ž‘์—… ์ผ์ง€๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.
  • ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

์—์ด์ „ํŠธ์—๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†๋Š” ์ž‘๋™ ๋ชจ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ๊ตฌ์„ฑ์„ ์ž‘์„ฑํ–ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š๊ณ  ์ž‘๋™ ์ค‘์— ์—์ด์ „ํŠธ๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ๋ณ€๊ฒฝํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์— ์˜ํ•ด ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. --noop ๋ช…๋ น์ค„์—์„œ: sudo puppet agent -t --noop.

๋˜ํ•œ ์ž‘์—…์˜ ๋””๋ฒ„๊น… ๋กœ๊ทธ๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋กœ๊ทธ์—๋Š” puppet์ด ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…(ํ˜„์žฌ ์ฒ˜๋ฆฌ ์ค‘์ธ ๋ฆฌ์†Œ์Šค, ์ด ๋ฆฌ์†Œ์Šค์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜, ์‹œ์ž‘ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ)์— ๋Œ€ํ•ด ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๊ฒƒ์€ ๋งค๊ฐœ๋ณ€์ˆ˜์ด๋‹ค. --debug.

์„œ๋ฒ„

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” pappetserver์˜ ์ „์ฒด ์„ค์ •๊ณผ ์—ฌ๊ธฐ์— ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹จ์ง€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์†Œ์ˆ˜์˜ ์„œ๋ฒ„์—์„œ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ์™„์ „ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์„œ๋ฒ„ ๋ฒ„์ „์ด ์žˆ๋‹ค๋Š” ์ ๋งŒ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ(์˜ˆ: ์ตœ๋Œ€ XNUMX๊ฐœ). ๋” ๋งŽ์€ ์ˆ˜์˜ ๋…ธ๋“œ๋ฅผ ์กฐ์ •ํ•˜๋ ค๋ฉด ์กฐ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ puppetserver๋Š” XNUMX๊ฐœ ์ดํ•˜์˜ ์ž‘์—…์ž๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ์–ป์œผ๋ ค๋ฉด ๋…ธ๋“œ ์ˆ˜๋ฅผ ๋Š˜๋ ค์•ผ ํ•˜๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์„œ๋ฒ„๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„ ๋™์•ˆ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ๋ฐฐํฌ - ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ํ•„์š”ํ•˜๋‹ค๋ฉด (r10k์—์„œ)[https://github.com/puppetlabs/r10k], ์†Œ๊ทœ๋ชจ ์„ค์น˜์˜ ๊ฒฝ์šฐ์—๋Š” ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

๋ถ€๋ก 2: ์ฝ”๋”ฉ ์ง€์นจ

  1. ๋ชจ๋“  ๋กœ์ง์„ ํด๋ž˜์Šค์™€ ์ •์˜์— ๋ฐฐ์น˜ํ•˜์„ธ์š”.
  2. ๋…ธ๋“œ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋งค๋‹ˆํŽ˜์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๋ชจ๋“ˆ์— ํด๋ž˜์Šค์™€ ์ •์˜๋ฅผ ์œ ์ง€ํ•˜์„ธ์š”.
  3. ์‚ฌ์‹ค์„ ํ™œ์šฉํ•˜์„ธ์š”.
  4. ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ if๋ฅผ ๋งŒ๋“ค์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  5. ํด๋ž˜์Šค์™€ ์ •์˜์— ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์ถ”๊ฐ€ํ•˜์„ธ์š”. ์ด๋Š” ํด๋ž˜์Šค/์ •์˜ ๋ณธ๋ฌธ์— ์ˆจ๊ฒจ์ง„ ์•”์‹œ์  ๋…ผ๋ฆฌ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๊ธ€์—์„œ ์ด ๋ฐฉ๋ฒ•์„ ์ถ”์ฒœํ•˜๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์†Œ๊ฐœ๋ฅผ ๋งˆ์น˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ธฐ์‚ฌ์—์„œ๋Š” Hiera, ENC ๋ฐ PuppetDB์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋“ฑ๋ก๋œ ์‚ฌ์šฉ์ž๋งŒ ์„ค๋ฌธ ์กฐ์‚ฌ์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ์ œ๋ฐœ

์‹ค์ œ๋กœ ํ›จ์”ฌ ๋” ๋งŽ์€ ์ž๋ฃŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฃผ์ œ์— ๋Œ€ํ•œ ๊ธฐ์‚ฌ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๊ณ , ์ฝ๊ณ  ์‹ถ์€ ๋‚ด์šฉ์— ํˆฌํ‘œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • 59,1%๊ณ ๊ธ‰ ๊ผญ๋‘๊ฐ์‹œ ๊ตฌ์„ฑ - ๋‹ค์Œ ์ˆ˜์ค€์˜ ๊ฒƒ๋“ค: ๋ฃจํ”„, ๋งคํ•‘ ๋ฐ ๊ธฐํƒ€ ๋žŒ๋‹ค ํ‘œํ˜„์‹, ๋ฆฌ์†Œ์Šค ์ˆ˜์ง‘๊ธฐ, ๋‚ด๋ณด๋‚ธ ๋ฆฌ์†Œ์Šค ๋ฐ Puppet, ํƒœ๊ทธ, ๊ณต๊ธ‰์ž, ์ถ”์ƒ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ํ†ตํ•œ ํ˜ธ์ŠคํŠธ ๊ฐ„ ํ†ต์‹ .13
  • 31,8%"์ €๋Š” ์–ด๋จธ๋‹ˆ์˜ ๊ด€๋ฆฌ์ž์ž…๋‹ˆ๋‹ค" ๋˜๋Š” Avito์—์„œ ๋‹ค์–‘ํ•œ ๋ฒ„์ „์˜ ์—ฌ๋Ÿฌ Poppet ์„œ๋ฒ„์™€ ์นœ๊ตฌ๊ฐ€ ๋œ ๋ฐฉ๋ฒ•๊ณผ ์›์น™์ ์œผ๋กœ Poppet ์„œ๋ฒ„ ๊ด€๋ฆฌ์— ๊ด€ํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.7
  • 81,8%ํผํŽซ ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐฉ๋ฒ•: ๊ณ„์ธก, ๋ฌธ์„œํ™”, ํ…Œ์ŠคํŠธ, CI/CD.18

22๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ํˆฌํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค. 9๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๊ถŒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com