Fabric: ์ž‘์—… ์ˆ˜์ค€์˜ ์ˆจ๊ธฐ๊ธฐ ( '์‹คํ–‰ ์ค‘')๊ฐ€ ์†์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2011๋…„ 08์›” 25์ผ  ยท  9์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: fabric/fabric

1) '์ž‘์—… ์‹คํ–‰ ์ค‘ ...'๊ณผ ๊ฐ™์€ ํ•ญ๋ชฉ์„ ์ˆจ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
2) ๋งˆ์ง€๋ง‰ ์ถœ๋ ฅ์—์„œ โ€‹โ€‹์ค„ ๋ฐ”๊ฟˆ์„ ์ œ๊ฑฐํ•˜์—ฌ ๋‹ค์Œ ์ถœ๋ ฅ ์ค„์„ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.

fabfile์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
@์ง๋ฌด
def show_hostname () :
์„ค์ • (hide ( 'running')) :
์‹คํ–‰ ( 'ํ˜ธ์ŠคํŠธ ์ด๋ฆ„')
์‹คํ–‰ ( '๋‚ ์งœ')

% /opt/python-2.7/bin/fab -f output.py -H x1, x2 show_hostname
[x1] 'show_hostname'์ž‘์—… ์‹คํ–‰ ์ค‘
[x1] ์ถœ๋ ฅ : x1mydomain.de
[x1] ์ถœ๋ ฅ : [x1] ์ถœ๋ ฅ : Thu Aug 25 10:34:10 CEST 2011
[x1] out : [x2] 'show_hostname'์ž‘์—… ์‹คํ–‰ ์ค‘
[x2] ์ถœ๋ ฅ : x2.mydomain.de
[x2] ์ถœ๋ ฅ : [x2] ์ถœ๋ ฅ : Thu Aug 25 10:34:11 CEST 2011
[x2] ์ถœ๋ ฅ :
๋๋‚œ.

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์—์žˆ๋Š” ๋™์•ˆ :

3) ์˜ˆ๋ฅผ ๋“ค์–ด run ( 'hostname')์€ ํ•ญ์ƒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋นˆ ์ค„์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

[h1] 'show_hostname'์ž‘์—… ์‹คํ–‰ ์ค‘
[h1] ์ถœ๋ ฅ : h1.mydomain.de
[h1] ์ถœ๋ ฅ :

3) ๋ชฉ์ ์— ๋”ฐ๋ผ ๋นˆ ์ค„์—์„œ 1,2 ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

๊ฐ์‚ฌ,
์Šค๋ฒค

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

  • "์™„๋ฃŒ"๋ฅผ ์ˆจ๊ธฐ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์™„๋ฃŒ ํ›„ ์ธ์‡„๋ฉ๋‹ˆ๊นŒ?
  • "my.server.com์—์„œ ์—ฐ๊ฒฐ ํ•ด์ œ ์ค‘ ... ์™„๋ฃŒ"๋ฅผ ์ˆจ๊ธฐ๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋ฌธ์ œ๊ฐ€์žˆ์„ ๋•Œ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋‚ด๊ฐ€ ๋ช…์‹œ ์ ์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋“  (์ •๋ง ๋ง ๊ทธ๋Œ€๋กœ ๋ชจ๋“ ) ์ถœ๋ ฅ์„ ๋น„ํ™œ์„ฑํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์œ ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์ง๋ฌผ์„ ๋ณด๋ฉด. main : main , '์‹คํ–‰'์ด _outside_ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ˆจ๊ฒจ์ ธ ์žˆ์ง€ ์•Š์€ ์ด์œ ์ž…๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• (๊ธ€๋กœ๋ฒŒ!)์œผ๋กœ fabric.state.output [ 'running'] = False๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ --hide = running์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Gregg๋Š” ๋‹ค์‹œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. "Executing"์ค„์ด ์ธ์‡„ ๋  ๋•Œ ๊ธ€๋กœ๋ฒŒ ์„ค์ •์ด๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ก ์ด๊ฒƒ์ด ๋”์ฐํ•˜๊ฒŒ ์ง๊ด€์ ์ด์ง€ ์•Š๊ณ  ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ์œผ๋ฉดํ•ฉ๋‹ˆ๋‹ค. (์ƒˆ๋กœ์šด ์Šคํƒ€์ผ์˜ ์ž‘์—…์— ๋Œ€ํ•ด ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜„์žฌ ๋‘ ์œ ํ˜• ๊ฐ„์˜ ๋™์ž‘ ์ฐจ์ด๋ฅผ ๋Š˜๋ฆด ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ...)

stdout ๋ธ”๋ก ๋์—์žˆ๋Š” ์ค„ ๋ฐ”๊ฟˆ์€ ์˜๋„์ ์œผ๋กœ IIRC์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๋ช…์‹œ ์ ์œผ๋กœ ์‚ฝ์ž…ํ•˜๋Š”์ง€ ๋˜๋Š” ์‹ค์ œ๋กœ ์›๊ฒฉ ๋์—์„œ ์™”๋Š”์ง€ ๊ธฐ์–ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค (์ƒˆ ์ค„ ์ ‘๋‘์‚ฌ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค). ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ฒ„๊ทธ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

"๋ˆ„๋ฝ ๋œ"์ค„ ๋ฐ”๊ฟˆ์€ ๊ด€๋ จ์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์‹ ์œผ๋กœ๋“  ์ถ”์•…ํ•˜๊ฒŒ ๋ณด์ผ ๊ฒƒ์ด๊ณ  ์ถ”์•…ํ•จ์„ ๋œ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋กœ ์˜ฎ๊ฒจ์•ผํ•˜๋Š” ์ƒํ™ฉ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฒ„๊ทธ / UI ๋ถˆ์ผ์น˜์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ํŒจ๋ธŒ๋ฆญ์„ ํ†ตํ•ด ํŒŒ์ผ์„ ์ถ”์ ํ•˜๋ ค๊ณ ํ•˜๋Š”๋ฐ "[hostname]"์ถœ๋ ฅ์„ ๋งˆ์Šคํ‚นํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

fabric.state.output['running'] = False ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†์Šต๋‹ˆ๋‹ค.

@charlax fab --hide=running ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹คํ–‰ ์‹œ์ž‘์‹œ ์ถœ๋ ฅ ๋ ˆ๋ฒจ์ด ํ•ด์ œ๋˜๋ฏ€๋กœ ์ž‘์—… ๋‚ด๋ถ€์—์„œ ์ˆจ๊ธธ ์ˆ˜์—†๋Š” ๋ชจ๋“  '์‹คํ–‰์ค‘์ธ ์ž‘์—… x'ํ•ญ๋ชฉ์„ ์ˆจ๊ฒจ์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ์˜๊ฒฌ์—์„œ ์™œ ์ด๊ฒƒ์„ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ fabfile์˜ ๋ชจ๋“ˆ (์ตœ์ƒ์œ„) ์ˆ˜์ค€์—์„œ ์–ธ๊ธ‰ ํ•œ fabric.state.output ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋„ํ–ˆ์„ ๋•Œ ์ •ํ™•ํžˆ ์–ด๋””์— ๋„ฃ์—ˆ์Šต๋‹ˆ๊นŒ? ์ž‘์—… ๋‚ด๋ถ€์— ์žˆ์œผ๋ฉด ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„ ๋งž๋‹ค, ์‚ฌ์‹ค ๋‚ด๊ฐ€ํ•˜๋ ค๋Š” ๊ฒƒ์€ [host.com] out: ๋ถ€๋ถ„์„ โ€‹โ€‹์ˆจ๊ธฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜คํ•ด๋ฅผํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ์ค„์˜ ๊ทธ ๋ถ€๋ถ„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ์ด์— ๋Œ€ํ•œ ๊ฐœ์ธ ๊ตฌ์„ฑ ์„ค์ •์ด ์žˆ์ง€๋งŒ fab 2.0์ด ๋‚˜์˜ค๊ธฐ ์ „์— ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ•˜๋ฏ€๋กœ ๋น„๋ฐ€์„ ์•Œ๋ ค ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. env.output_prefix ์ด๊ณ  False๋กœ ์„ค์ •ํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค. ์ค„ ์ ‘๋‘์‚ฌ์—†์ด ๋ฆฌํ„ฐ๋Ÿด stdout / stderr์„ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌ!

@hosts () ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ๊ฐ•์ œ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š๊ณ  ์‹คํ–‰์ค‘์ธ ์ถœ๋ ฅ์˜ 'ํ˜ธ์ŠคํŠธ'๋ถ€๋ถ„์„ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

fabric.state.output['running']

์ „ ์„ธ๊ณ„์ ์œผ๋กœ. ์ด๊ฒƒ์€ ๊ทธ๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ์ผ์ธ ๋‹จ์ผ ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•ด env.hosts๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋นˆ ๋ฐ˜๋ณต์ž (๋˜๋Š” None)๋กœ ์„ค์ •ํ•˜๋ฉด ํ˜ธ์ŠคํŠธ๋ฅผ ์ธ์‡„ํ•˜์ง€ ์•Š๋Š” local_only ์‹คํ–‰์„ ํŠธ๋ฆฌ๊ฑฐํ•ด์•ผํ•œ๋‹ค๋Š” ์ ์—์„œ env.hosts์ฒ˜๋Ÿผ ๋™์ž‘ํ•ด์•ผํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ @hosts ์˜ ๋นˆ ๋ฐ˜๋ณต๊ธฐ๋Š” ๋ฌด์‹œ๋˜๊ณ  env.hosts ์‚ฌ์šฉ์œผ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ํ’€๋ฆฌ๋ฉด ํŒจ์น˜๋ฅผ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • "์™„๋ฃŒ"๋ฅผ ์ˆจ๊ธฐ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์™„๋ฃŒ ํ›„ ์ธ์‡„๋ฉ๋‹ˆ๊นŒ?
  • "my.server.com์—์„œ ์—ฐ๊ฒฐ ํ•ด์ œ ์ค‘ ... ์™„๋ฃŒ"๋ฅผ ์ˆจ๊ธฐ๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋ฌธ์ œ๊ฐ€์žˆ์„ ๋•Œ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋‚ด๊ฐ€ ๋ช…์‹œ ์ ์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋“  (์ •๋ง ๋ง ๊ทธ๋Œ€๋กœ ๋ชจ๋“ ) ์ถœ๋ ฅ์„ ๋น„ํ™œ์„ฑํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์œ ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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