Fabric: v2 ํ˜ธํ™˜ '์—ญํ• ' ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ

์— ๋งŒ๋“  2017๋…„ 04์›” 22์ผ  ยท  7์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: fabric/fabric

๊ฐœ์š”

์ž‘์„ฑ ๋‹น์‹œ v2 ๋ถ„๊ธฐ์—๋Š” ์ด์ „์— '์—ญํ• '(์ผ๋ช… "์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ˜ธ์ŠคํŠธ ๋ฌถ์Œ")์œผ๋กœ ์•Œ๋ ค์ง„ ๋‹จ์œ„ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋Š” Group ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Group ๊ฐœ์ฒด๋ฅผ ๊ตฌ์„ฑํ•˜๊ฑฐ๋‚˜ ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ•์€ ์•„์ง ์—†์Šต๋‹ˆ๋‹ค. ๊ณ ์œ ํ•œ ๊ณ ์œ ํ•œ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž์˜ ์ˆœ์ˆ˜ํ•œ API ์‚ฌ์šฉ ์‚ฌ๋ก€์—๋Š” ์ถฉ๋ถ„ํžˆ "์™„๋ฃŒ"๋˜์—ˆ์ง€๋งŒ, CLI ์ง€ํ–ฅ ์‚ฌ์šฉ์ž ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ๊ตฌ์ถ•์„ ์›ํ•˜๋Š” ์ค‘๊ธ‰ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.

๋‹ฌ๋ฆฌ ๋งํ•˜๋ฉด, API๋กœ ์ˆœ์ „ํžˆ ๋กค๋งํ•˜์ง€ ์•Š๋Š” ํ•œ, CLI ๋˜๋Š” ์ž‘์—… ํ˜ธ์ถœ ๋น„ํŠธ์—์„œ ์ฐพ์„ ๋ฐฉ๋ฒ•์ด ์—†๋Š” ๊ฒฝ์šฐ ์–ด๋”˜๊ฐ€์— Group ๊ฐœ์ฒด๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์€ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค!

๋ฐฐ๊ฒฝ

v1์—์„œ ์—ญํ• ์€ ๋‹จ์ˆœํ•œ ๋ฌธ์ž์—ด ๋ ˆ์ด๋ธ”์„ v2์˜ ๊ทธ๋ฃน์— ๋งคํ•‘ํ•˜๋Š” ๋‹จ์ผ ํ”Œ๋žซ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜€์œผ๋ฉฐ ๋Ÿฐํƒ€์ž„ ์‹œ CLI์—์„œ ์„ ํƒ( fab --roles=web,db ) ๋ฐ/๋˜๋Š” ์ž‘์—…์˜ ๊ธฐ๋ณธ ๋Œ€์ƒ์œผ๋กœ ๋“ฑ๋ก( @task('db') \n def migrate(): ), ํ˜ธ์ŠคํŠธ์™€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๋Š” env.roledefs , ๊ฐ„๋‹จํ•œ ์‚ฌ์ „์— ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ค‘๊ฐ„์—์„œ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋Ÿฐํƒ€์ž„(์‚ฌ์ „ ์ž‘์—… ๋˜๋Š” ์„œ๋ธŒ๋ฃจํ‹ด์„ ํ†ตํ•ด), ๋•Œ๋กœ๋Š” ๋ชจ๋“ˆ ๋กœ๋“œ ์‹œ ์ˆ˜์ •์„ ์ค‘์‹ฌ์œผ๋กœ ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค.

ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€/์š”๊ตฌ/ํ•˜์œ„ ๊ธฐ๋Šฅ

  • ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์‚ฌ์šฉ/์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ์ ์ด๊ณ  ์ˆœ์ง„ํ•œ ๋งคํ•‘: ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๊ณ  Group s ๋ฐ/๋˜๋Š” Connection s์˜ ์ผ๋ถ€ ๋ฐ˜๋ณต ๊ฐ€๋Šฅ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    • ์ž์ฃผ ์•จ๋ฆฌ์–ด์‹ฑ ๊ฒƒ์€, ๊ทธ์™€ ํ•จ๊ป˜ ๊ฐ€๊ณ  ์‹ถ์–ด ๊ทธ๋ž˜์„œ ์˜ˆ๋ฅผ ๋“ค๋ฉด Lexicon ๋Œ€์‹ ์˜ dict .

    • '๋ฒˆ๋“ค๋ง'๊ณผ ๊ฐ™์€ ๋” ๊นŠ์€ ๊ตฌ์„ฑ, ์˜ˆ๋ฅผ ๋“ค์–ด db , web , lb ๋ผ๋Š” ์ด๋ฆ„์˜ ์ง์ ‘ ๋งคํ•‘์ด ์žˆ์ง€๋งŒ prod ๋ผ๋Š” ๋‘ ๋ฒˆ์งธ ๊ณ„์ธต ์ด๋ฆ„์ด ์žˆ์Šต๋‹ˆ๋‹ค Lexicon ์ถ”๊ฐ€ํ–ˆ๋Š”์ง€ ์žŠ์–ด๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๋‹ค๋ฅธ ์ง€๋„ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์ถ”๊ฐ€์ ์œผ๋กœ/๋˜๋Š”, ๊ธ€๋กœ๋น™(globbing)์ด๋‚˜ ๊ธฐํƒ€ ๋ฌธ์ž์—ด ๊ตฌ๋ฌธ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์ด์ง€๋งŒ ๊ฐœ์ธ์ ์œผ๋กœ ํŒŒ์ด์ฌ์ด "๋ฌธ์ž์—ด ํ˜•์‹"์ด ์•„๋‹ˆ๋ผ๋Š” ์‚ฌ์‹ค์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜์ง€๋งŒ...

  • ์ฃผ์–ด์ง„ ์—ฐ๊ฒฐ์ด ์†ํ•œ ๊ทธ๋ฃน์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์šฉํ•œ '์—ญ ๋งคํ•‘'.

    • ๋ฌธ์ œ: ํ˜„์žฌ ์ „์—ญ ๊ณต์œ  ์ƒํƒœ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ID๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด์— ๋Œ€ํ•œ ์ˆœ์ง„ํ•œ ๋Œ€๋‹ต์€ ๊ธฐ์ˆ ์ ์œผ๋กœ ๋™์ผํ•œ ์—ฌ๋Ÿฌ ์—ฐ๊ฒฐ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

    • ํŠนํžˆ ๊ทธ๋ฃน์— ๋‹จ์ถ• ํ˜ธ์ŠคํŠธ ๋ฌธ์ž์—ด์„ ์ œ๊ณตํ•˜๋ฉด ๊ทธ๋ฃน์ด ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ์•”์‹œ์ ์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŽธ์˜ ์˜ต์…˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

    • ๊ทธ๋Ÿฌ๋‚˜ ์ „์—ญ ์ƒํƒœ๊ฐ€ ์—†๋‹ค๋Š” ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ฐ์•ˆํ•  ๋•Œ ๋™๋“ฑ์„ฑ ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋ช…๋ฐฑํ•œ ๋ฌธ์ œ๋ฅผ ๋ณผ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด cxn ๊ฐ€ ๊ณ ์œ ํ•œ ๊ฐœ์ฒด์ธ ๊ฒฝ์šฐ์—๋„ if cxn in group ๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. group ๋‚ด๋ถ€์˜ ๋™๋“ฑํ•œ ๋ฉค๋ฒ„์—์„œ.

    • ๋งˆ์Œ์— ๋– ์˜ค๋ฅด๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ ์—ฐ๊ฒฐ์—์„œ ๊ทธ๋ฃน์œผ๋กœ์˜ ๊ฐ•๋ ฅํ•˜๊ณ  ์ƒํƒœ ์ €์žฅ ๋งํฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ(๊ทธ๋ฃน, ๋ณต์ˆ˜์—ฌ์•ผ ํ•จ)๊ฐ€ ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ทธ๊ฒƒ์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ์ด์ „ ๊ธฐ๋Šฅ๊ณผ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋จ: "ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์—ญํ• "์ด ๋ฌด์—‡์ธ์ง€ ๊ฒ€์‚ฌ/ํ‘œ์‹œํ•˜๋Š” ๊ธฐ๋Šฅ(v1์—์„œ ์‚ฌ๋žŒ๋“ค์ด ์˜ค๋žซ๋™์•ˆ ์›ํ–ˆ์ง€๋งŒ ๋””์ž์ธ์œผ๋กœ ์ธํ•ด ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ)

    • ์ฃผ์š” ๋ฌธ์ œ๋Š” ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ๋‘ ๊ฐœ์˜ ๋ฐ˜์ฏค ๋ณ„๊ฐœ์˜ ์งˆ๋ฌธ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. "์ผ๋ฐ˜์ ์œผ๋กœ ๋งํ•˜๋ฉด, ํ˜„์žฌ ํ˜ธ์ŠคํŠธ ๋ถ€๋ถ„์ด ์–ด๋–ค ์—ญํ• (๋“ค)์ธ์ง€"(๊ธฐ๋ณธ์ ์œผ๋กœ ์—ญ๋ฐฉํ–ฅ ์กฐํšŒ์˜ ์ด์ „ ์‚ฌ์šฉ ์‚ฌ๋ก€) "์–ด๋–ค ์—ญํ• (๋“ค)์ด ํŠน๋ณ„ํžˆ ์‹คํ–‰ํ•˜๋„๋ก ์š”์ฒญ๋ฐ›์€ ์‹คํ–‰ ๊ธฐ๊ณ„".

    • ์ฆ‰, ์—ญํ•  A, B, C์— ์†ํ•˜๋Š” ํ˜ธ์ŠคํŠธ 'foo'๊ฐ€ ์ปจํ…์ŠคํŠธ๊ฐ€ 'foo'์ด์ง€๋งŒ '์—ญํ•  A์—์„œ ์‹คํ–‰' ์š”์ฒญ์œผ๋กœ ์ธํ•ด ์‹คํ–‰๋œ ์ฃผ์–ด์ง„ ์ž‘์—… ๋‚ด์—์„œ ๋‹ค์Œ์„ ์ฐพ๊ณ  ์žˆ๋Š” ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค. "A, B ๋ฐ C"(์ „์ฒด์ ์œผ๋กœ 'foo' ์—ญํ• ) ๋˜๋Š” "A"(ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์—ญํ• )์— ๋Œ€ํ•œ ๋‹ต๋ณ€์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

    • ๊ธฐ๋Šฅ ์š”์ฒญ์ด ๋‘ ๊ฐœ๋ฅผ ํ†ตํ•ฉํ•œ ๊ฒƒ์œผ๋กœ ๊ธฐ์–ตํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ๋‘ ๊ฐœ์˜ ๋ณ„๊ฐœ์˜ API ํ˜ธ์ถœ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

  • CLI์—์„œ ์ „์—ญ ๋ฐ/๋˜๋Š” ์ž‘์—…๋ณ„ ๋Œ€์ƒ ์„ ํƒ

    • "๋ชจ๋“  ์ž‘์—…์ด ์ •์˜ํ•œ ๊ฒƒ ์œ„์— ์ถ”๊ฐ€๋˜๋Š” ํ”Œ๋ž˜๊ทธ"๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•œ Invoke์˜ CLI ์‹œ์Šคํ…œ ํ™•์žฅ์ด ์ด๋ฅผ ์œ„ํ•ด ์œ ์šฉํ•˜๊ฑฐ๋‚˜ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ pyinvoke/invoke#205 ์˜์—ญ์— ํ™•๊ณ ํ•˜๊ฒŒ ๋“ค์–ด๊ฐ€๋ฏ€๋กœ ์ด๋ฏธ ์ด์ „๋ณด๋‹ค ๋†’์€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค(์ƒ๋‹นํžˆ ๋†’์Œ).

  • ๋™์ผํ•œ ์ž‘์—… ์ˆ˜์ค€ ๊ธฐ๋ณธ๊ฐ’

    • ์ž‘์—… ์ˆ˜์ค€ ๋Œ€์ƒ ๊ธฐ๋ณธ๊ฐ’์€ ์‹ค์ œ๋กœ ์—ฐ๊ฒฐ, ์—ฐ๊ฒฐ, ๊ทธ๋ฃน obj, ๊ทธ๋ฃน objs ๋˜๋Š” ๊ทธ๋ฃน objs๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ์ด๋ฆ„ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋˜๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ(์ด ํ‹ฐ์ผ“๊ณผ ์ง์ ‘์ ์œผ๋กœ ๊ด€๋ จ๋œ ๊ฒƒ์€ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ๋ฟ์ž…๋‹ˆ๋‹ค)

  • ์ปฌ๋ ‰์…˜ ์ˆ˜์ค€ ๊ธฐ๋ณธ๊ฐ’๊ณผ ๋™์ผ(v2์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ!)

    • ์ฆ‰, "$submodule์˜ ๋ชจ๋“  ์ž‘์—…์€ ๊ธฐ๋ณธ์ ์œผ๋กœ db ์—ญํ• ์— ๋Œ€ํ•ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค."

    • ์ด์ „ ํฌ์ธํŠธ์™€ ๋™์ผํ•œ ๊ฑฐ๋ž˜ - ์ด ๊ธฐ๋ณธ๊ฐ’์€ ๋ฌธ์ž์—ด ํ‚ค๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ๊ฐ’์„ ํ—ˆ์šฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  • ์ด๊ฒƒ๊ณผ ํ•จ๊ป˜ ๊ฐ€๊ณ  ์‹ถ์–ดํ•˜๋Š” OO ์ ‘๊ทผ ๋ฐฉ์‹์— ์˜ํ•ด ๊ฐ€๋Šฅํ•ด์ง„ ์ƒˆ๋กญ๊ณ  ํฅ๋ฏธ๋กœ์šด ๋‹ค๋ฅธ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด Chef ๋˜๋Š” Ansible๊ณผ ๊ฐ™์€ ์‹œ์Šคํ…œ์„ ์™„์ „ํžˆ ์žฌ์ฐฝ์กฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋นŒ๋”ฉ ๋ธ”๋ก ๋ฐ ๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž ํ™œ์„ฑํ™”์— ์ค‘์ ์„ ๋‘์–ด์•ผ ํ•จ์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค.

๊ตฌํ˜„ ์•„์ด๋””์–ด/์šฐ๋ ค์‚ฌํ•ญ

  • ๊ตฌ์„ฑ ์‹œ์Šคํ…œ์„ ๊ธฐ๋ณธ ์ €์žฅ ๋ฒกํ„ฐ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ’์€ yaml, json ๋“ฑ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋ณธ ๊ฐ’์ด "์›ํ•˜์ง€๋งŒ" "๋ชจ๋“  ๊ทธ๋ฃน/์—ฐ๊ฒฐ kwargs๋ฅผ ํฐ ol์— ์ €์žฅ"์œผ๋กœ ๋๋‚˜๋Š” ์›œ ์บ”์ž…๋‹ˆ๋‹ค. list-o-dicts" ๋“ฑ
  • ์ •์˜๊ฐ€ ์ฃผ๋กœ Python์— ์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๊ฒฝ์šฐ ๊ฐ„๋‹จํžˆ "๊ทธ๋ฃน ๊ฐœ์ฒด ์ธ์Šคํ„ด์Šคํ™”"๋ผ๊ณ  ๋งํ•˜๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑ ์‹œ์Šคํ…œ์— ๋ณ‘ํ•ฉํ•˜๊ฑฐ๋‚˜ ์–ด๋–ป๊ฒŒ๋“  ๋…๋ฆฝํ˜•์œผ๋กœ ๋‚จ๊ฒจ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

  • ์•จ๋ฆฌ์–ด์‹ฑ ๋ฐ ๋ฒˆ๋“ค๋ง๊ณผ ๊ฐ™์€ ๋” ๊นŠ์€ ๊ตฌ์„ฑ์€ ๋ณต์žก์„ฑ ๋ฐ ์ˆœ์„œ ๋ฌธ์ œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: key1์˜ ๊ฐ’์ด ๊ทธ๋ฃน์ด์ง€๋งŒ key2์˜ ๊ฐ’์ด key1์ธ ์‚ฌ์†Œํ•œ ๋ณ„์นญ ์„ค์ •์„ ์ƒ์ƒํ•ด ๋ณด์„ธ์š”. ์ด์ œ key2๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์กฐ๋ฅผ ๋‘ ๋ฒˆ ํฌ๋กค๋งํ•ด์•ผ ํ•จ)

    • ์šฐ๋ฆฌ๊ฐ€ ๋Œ€๋ถ€๋ถ„ "ํŒŒ์ด์ฌ ๋‚ด์—์„œ ์ˆ˜ํ–‰" ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ ์–ธ์  ๊ตฌ์กฐ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ดˆ๊ธฐ ์„ค์ • ํ›„ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— ์˜ํ•ด ๋” ๋งŽ์€ ๊ฒƒ์ด ํ™œ์„ฑํ™”๋˜๋Š” ๊ตฌ์„ฑ ์‹œ์Šคํ…œ์˜ API์™€ ๋งค์šฐ ์œ ์‚ฌํ•ด์ง‘๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋”์ฐํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค? ํŽธ์ง‘: ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด Lexicon์ด ์–ด์จŒ๋“  ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • ํ˜•์‹์— ๊ด€๊ณ„์—†์ด ๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž๊ฐ€ ์™ธ๋ถ€ ์†Œ์Šค ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ์†Œ์Šค์—์„œ ์ฆ‰์„์—์„œ ์ƒ์„ฑํ•˜๋ ค๋Š” ๋ฐฉ๋ฒ•์„ ํŒŒ์•…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์•จ๋ฆฌ์–ด์‹ฑ ๋ฌธ์ œ ๋“ฑ์„ ๋”ํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ์–ด๋”˜๊ฐ€์— "์ €์žฅ๋œ" ์ˆœ์ง„ํ•œ ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ทธ๊ฒƒ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœ๋˜๋Š” ์ผ๋ถ€ ๊ฐ์ฒด ๋˜๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ API๋กœ ์›ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

    • ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์—ญํ• /๊ทธ๋ฃน์˜ ์„ ํƒ์—์„œ 'ํ•˜ํ–ฅ' ์ž‘์—…์„ ํ•˜๊ณ  ์‹ถ์–ดํ• ์ง€๋„ ๋ชจ๋ฅธ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž๋Š” ํ•„์—ฐ์ ์œผ๋กœ ๋‹ค์Œ์„ ์›ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— "์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณตํ•œ ๊ฒƒ์„ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋Œ€์ƒ ๋‹จ์œ„๋กœ ์ „ํ™˜"ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ๋†’์€ ์ˆ˜์ค€์˜ API์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น API ํ˜ธ์ถœ์˜ ๊ตฌํ˜„์„ ์™„์ „ํžˆ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ์œ ์šฉํ•œ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€์ง€๋งŒ "์ผ์„ ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•"์œผ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œ์‹œ๋œ ๊ฒƒ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • @RedKrieg๋Š”์ด ๋ฉ‹์ง„ ์•„์ด๋””์–ด๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๊ณณ์ด ๋ผ์ธ์„ ๋”ฐ๋ผ๊ฐ€ @group ์™€ ๊ฐ™์€ @task , ๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋Šฅ์€ ์ž‘์—…์˜ ์‹คํ–‰ ๋‹จ์œ„ ์•„๋‹ˆ์ง€๋งŒ, ๋Œ€์‹  ๊ทธ๋ฃน ๊ฐœ์ฒด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘์—… ๊ณ„์ธต(์ปฌ๋ ‰์…˜)์„ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‹ค์šฉ์ ์ด๊ณ (ํœ ์„ ์žฌ๋ฐœ๋ช…ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ) ์šฐ์•„ํ•ฉ๋‹ˆ๋‹ค(์‹ค์ œ ์‚ฌ๋ก€์—์„œ ์—ญํ• /๊ทธ๋ฃน ์ •์˜๊ฐ€ ์ข…์ข… ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ž‘์—…๊ณผ ๋งค์šฐ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๋งคํ•‘๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค!)



      • ๋˜ํ•œ ๊ทธ๋ฃน์ด ์ž‘์—…์— ๋งคํ•‘๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋„ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฃจํŠธ ์ปฌ๋ ‰์…˜ ์ˆ˜์ค€์—์„œ ์ •์˜๋ฅผ ๊ฐ„๋‹จํžˆ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์‰ฌ์›Œ์š”.



    • ์ด๊ฒƒ์ด ๊ฐ ํ•จ์ˆ˜์—์„œ ๋‹จ์ผ ๊ทธ๋ฃน์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€์ง€, ์—ฌ๋Ÿฌ ๊ทธ๋ฃน(๋˜๋Š” ์—ฐ๊ฒฐ)์„ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์›ํ•˜๋Š”์ง€ ๋˜๋Š” ์žฅ์‹๋œ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ API ํ˜ธ์ถœ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ปฌ๋ ‰์…˜(์˜ˆ: ์ปฌ๋ ‰์…˜ ์ˆ˜์ค€ ๊ตฌ์„ฑ์ด ์ €์žฅ๋˜๋Š” ๋ฐฉ์‹).

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

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š”, ๋ช‡ ๋…„ ํ›„ ์ด ์†Œํ”„ํŠธ์›จ์–ด์— ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ๋ชจ๋ฅด์ง€๋งŒ [email protected] ์—์„œ ํŠนํžˆ $ fab -R dev ์‹คํ–‰ํ•  ๋•Œ "์—ญํ• " ๊ฐœ๋…์„ ๋†“์ณค์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  7 ๋Œ“๊ธ€

๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ์—์„œ:

๋ฐฐํฌ๋˜๋Š” ํ”„๋กœ์ ํŠธ์— ๋”ฐ๋ผ env.roledefs๋ฅผ ๋™์ ์œผ๋กœ ์ฑ„์šฐ๋Š” ์ž์ฒด ๋‚ด๋ถ€ REST API๋ฅผ ๊ตฌํ˜„ํ–ˆ์œผ๋ฉฐ ํ˜ธ์ŠคํŠธ ๋ฌธ์ž์—ด์„ ํ”„๋กœ์ ํŠธ์˜ fabfile์— ํฌํ•จํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ CLI์—์„œ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์— ํฌ๊ฒŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํ™˜๊ฒฝ ์—†๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค https://12factor.net/config. ํ™˜๊ฒฝ(์—ญํ• )๊ณผ ํ•ด๋‹น ํ˜ธ์ŠคํŠธ ๋ฌธ์ž์—ด์€ ์ค‘์•™ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ฐ fabfile.py์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค(ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ env.roledefs๋ฅผ ์ฑ„์›๋‹ˆ๋‹ค).
EnvironmentDatabaseAPIClient(
    'https://rest.api.url/schema/',
    env.service_name,
).apply_env()
  1. ์„œ๋ฒ„ ํ™˜๊ฒฝ์˜ ์ˆ˜ - ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ(์ผ๋ถ€๋Š” ๋น„๊ณต๊ฐœ, ์ผ๋ถ€๋Š” ๊ณต๊ฐœ) ๋ฐ ์—ฌ๋Ÿฌ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ(๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ์šฉ). ๊ฐ ํ™˜๊ฒฝ์€ ํ•˜๋‚˜ ์ด์ƒ์˜ ํ˜ธ์ŠคํŠธ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ํŒจ๋ธŒ๋ฆญ ์—ญํ• ์— ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.

  2. ๊ฐ ์„œ๋น„์Šค(์œ„์˜ ์˜ˆ์—์„œ env.service_name )์—๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํ™˜๊ฒฝ ์„ธํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ๋˜ํ•œ ๋ฉ”ํƒ€ ์—ญํ• (์—ญํ•  ๊ทธ๋ฃน)์ด ์žˆ์Šต๋‹ˆ๋‹ค. group- ์ ‘๋‘์‚ฌ: group-production , group-test , group-external , group-internal , group-all . ์ด๋ฅผ ํ†ตํ•ด ํ•˜๋‚˜์”ฉ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ์—ฌ๋Ÿฌ ์„œ๋ฒ„ ์—ญํ• ์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด group-all ๋Š” ํ”„๋กœ๋•์…˜ ๋ฐ ํ…Œ์ŠคํŠธ์˜ ๋ชจ๋“  ์—ญํ• ์— ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

  4. ์—ญํ•  ๊ทธ๋ฃน, ์—ญํ•  ๋ฐ ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ธ์‡„ํ•˜๋Š” ํŠน๋ณ„ํ•œ ํŒจ๋ธŒ๋ฆญ ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  5. ๋˜ํ•œ ํ˜ธ์ŠคํŠธ ๋ฌธ์ž์—ด์„ ์—ญํ•  ์ด๋ฆ„์œผ๋กœ ๋‹ค์‹œ ๋งคํ•‘ํ•˜๋Š” ์—ญ๋ฐฉํ–ฅ ๋งคํ•‘์— ํฌ๊ฒŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค(ํ˜ธ์ŠคํŠธ ๋ฌธ์ž์—ด์€ service_name๋ณ„๋กœ ๊ณ ์œ ํ•จ). ์ด๋Š” ๋ฐฐํฌ ๋กœ๊น… ๋ฐ ์•Œ๋ฆผ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ ํ˜ธ์ŠคํŠธ์— ์„œ๋น„์Šค ๋ฐฐํฌ๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ์—ญํ• ์˜ ๋ชจ๋“  ํ˜ธ์ŠคํŠธ์— ์„œ๋น„์Šค๊ฐ€ ๋ฐฐํฌ๋˜๋ฉด Slack ์•Œ๋ฆผ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. EnvironmentDatabaseAPI ์„œ๋ฒ„๊ฐ€ ์ด๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค(๋กœ๊ทธ ๋ฐ ๋ฐฐํฌ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•จ). ์ด๊ฒƒ์€ env.host , env.port ๋ฐ env.service_name (์ปค๋ฐ‹ ์ •๋ณด ํฌํ•จ)๋ฅผ API ์„œ๋ฒ„์— ๋‹ค์‹œ ์ œ์ถœํ•˜๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ํŒจ๋ธŒ๋ฆญ ์ž‘์—…์„ ๋ฐ์ฝ”๋ ˆ์ด์…˜ํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

  6. ์šฐ๋ฆฌ๋Š” ์•ž์œผ๋กœ ๋ฐฐํฌ ์ธ์ฆ์„ ์ถ”๊ฐ€ํ•  ๊ณ„ํš์ด๋ฉฐ, ์ž‘์—… ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„œ๋ฒ„์—์„œ ๋” ๋งŽ์€ env ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ฌ ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’์Šต๋‹ˆ๋‹ค.

@max-arnold ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‚˜๋Š” ๊ณผ๊ฑฐ์— ๋‚ด ์ž์‹ ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋„ ๋งŽ์€ ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์—ญ ๋งคํ•‘ ๋น„ํŠธ๋Š” v1์— ๋ช‡ ๋ฒˆ ๋‚˜์™”๋˜ ๊ฒƒ์œผ๋กœ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

Fabric v2๊ฐ€ ๋‚˜์—๊ฒŒ ์œ ์šฉํ•˜๋ ค๋ฉด fab ์— ์ž‘์—…์„ ์‹คํ–‰ํ•  ํ˜ธ์ŠคํŠธ ์ง‘ํ•ฉ์„ ์•Œ๋ ค์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด์ „์—๋Š” ์—ญํ• ์„ ์ •์˜ํ•œ ๋‹ค์Œ fab -R ... . (์‹ค์ œ๋กœ ์—ญํ• ์€ IP ์ฃผ์†Œ ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ •์˜๋˜์—ˆ์ง€๋งŒ ์š”๊ตฌ ์‚ฌํ•ญ์€ ์•„๋‹ˆ๋ฉฐ YAML ํŒŒ์ผ ๋‚ด๋ถ€์˜ ์ •์  ๋ชฉ๋ก์€ ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

Fabric v2์—์„œ ์ด์— ์ƒ์‘ํ•˜๋Š” ๊ฒƒ์„ ์ฐพ์ง€ ๋ชปํ–ˆ๊ณ  ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๊ธฐ๋Šฅ์„ ์—๋ฎฌ๋ ˆ์ดํŠธํ•˜๋Š” ๋ฐ๋„ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋‹ค์Œ์„ ํฌํ•จํ•˜๋Š” fabric.yaml ๊ตฌ์„ฑ ํŒŒ์ผ
active_hostset: null
hostsets:
  myhostset:
  - ...
  • active_hostset = config["hostsets"][config["active_hostset"]] ์˜ fabfile.py
  • env INVOKE_ACTIVE_HOSTSET=myhostset fab ...

์˜ˆ์ƒ ํ˜ธ์ŠคํŠธ ๋ชฉ๋ก ๋Œ€์‹  KeyError: 'active_hostset' ์–ป์Šต๋‹ˆ๋‹ค.

Fabric v1์˜ ๊ฐ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ๊ฐ ์—ญํ• ์— ์„œ๋กœ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ ์„ธํŠธ๋ฅผ ๋งคํ•‘ํ•˜๊ณ  role.environment:staging ์ž‘์—…์„ ์‹คํ–‰ํ•˜์—ฌ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜์—ฌ ํ™˜๊ฒฝ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์ž‘์—…์€ ๋‹ค์Œ ์ž‘์—…์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ˜ธ์ŠคํŠธ์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค.

v2์—์„œ ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋ฌธ์ œ๋Š” Executor.expand_calls role.environment ์ž‘์—…์ด ์‹คํ–‰๋˜๊ธฐ ์ „์— Executor.expand_calls ๊ฐ€ ์‹คํ–‰๋˜๋ฏ€๋กœ ๋‹ค์Œ ์ž‘์—… ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ํ˜ธ์ŠคํŠธ ๋ชฉ๋ก์„ ๋™์ ์œผ๋กœ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•ด ํ™˜๊ฒฝ์„ ์•Œ์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Executor.expand_calls ์ƒ์„ฑ๊ธฐ๋ฅผ ๋งŒ๋“ค๋ฉด ์ž‘์—… ์‹คํ–‰์ด ์ดํ›„ ์ž‘์—… ์‹คํ–‰์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์˜ ์˜ˆ๋Š” ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•œ ์—ญํ• ์„ ์ ์ ˆํ•˜๊ฒŒ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ์„ ์•Œ์•„์•ผ ํ•˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ Task ๊ฐ€ ์žˆ๋Š” ๊ณณ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: fab role.environment dev deploy.app - deploy.app ๊ฐ€ ํ™•์žฅ๋˜๊ธฐ ์ „์— role.environment ์ž‘์—…์ด ์‹คํ–‰๋˜๋ฏ€๋กœ deploy.app ๋Š” ํ™˜๊ฒฝ์„ ์•Œ๊ณ  ํ˜ธ์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹ค์Œ์œผ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์ž‘์—… ์„ธํŠธ.

๋‚ด ํฌํฌ์—์„œ ํ”„๋กœํ† ํƒ€์ž…์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/pyinvoke/invoke/compare/master...rectallogic:expand-generator
https://github.com/fabric/fabric/compare/master...rectallogic:expand-generator

์•ˆ๋…•ํ•˜์„ธ์š”, ๋ช‡ ๋…„ ํ›„ ์ด ์†Œํ”„ํŠธ์›จ์–ด์— ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ๋ชจ๋ฅด์ง€๋งŒ [email protected] ์—์„œ ํŠนํžˆ $ fab -R dev ์‹คํ–‰ํ•  ๋•Œ "์—ญํ• " ๊ฐœ๋…์„ ๋†“์ณค์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์—ญํ• ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ ๋™์ผํ•œ ์ž‘์—… ์ง‘ํ•ฉ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋ช…๋ช…๋œ ์—ญํ• ๊ณผ ๋ช…๋ช…๋œ ํ™˜๊ฒฝ์˜ ๊ฐœ๋…์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ• ๊นŒ์š”? ์—์„œ์™€ ๊ฐ™์ด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์›น ์—ญํ• .

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰