Fabric: ๋Ÿฐํƒ€์ž„ ๊ตฌ์„ฑ ๋ฌธ์„œ

์— ๋งŒ๋“  2018๋…„ 05์›” 17์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: fabric/fabric

env ์„ ์„ค์ •ํ•˜๋Š” Fabric 1 fabfile์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋ฅผ Fabric 2๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฒƒ์€ ํ˜„์žฌ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด connect_kwargs ํ•˜์ง€๋งŒ์ด๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‚˜ ์œ„์น˜์— ๋Œ€ํ•ด์„œ๋Š”๋ณ„๋กœ ์—†์Šต๋‹ˆ๋‹ค. Invoke ๋ฌธ์„œ๋ฅผ ์ฝ์€ ํ›„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์•ผํ•˜๋ฏ€๋กœ YAML / JSON ๊ตฌ์„ฑ ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (์•„๋ž˜ ์˜ˆ์—์„œ๋Š” keyring ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•”ํ˜ธ ๊ฒ€์ƒ‰).

๋ชจ๋“  ํŒŒ์ผ์„ fabric.py ํŒŒ์ผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

import subprocess
import sys
from getpass import getuser
import os

domain = os.environ.get("DOMAIN", "loctest")

def get_config():
    user = getuser()

    try:
        password = subprocess.check_output(["keyring", "get", domain, user]).strip()
        print("Loaded %s password for %s from keyring" % (domain, user))
    except subprocess.CalledProcessError:
        print(
            "Unable to set password using `keyring` (is it in your PATH?) โ€” expect to be nagged",
            file=sys.stderr,
        )

    return {'user': user, 'password': password}

connect_kwargs = get_config()

๋ถˆํ–‰ํžˆ๋„ TypeError: can't pickle module objects ์ž…๋‹ˆ๋‹ค. __all__ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š”์ด๋ฅผ ํ”ผํ•  ์ˆ˜ ์—†์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์„ ํ•จ์ˆ˜๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์€ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

def get_config():
    import subprocess
    import sys
    from getpass import getuser
    import os

    domain = os.environ.get("DOMAIN", "loctest")
    user = os.environ.get("USER", getuser())

    try:
        password = subprocess.check_output(["keyring", "get", domain, user]).strip()
        print("Loaded %s password for %s from keyring" % (domain, user))
    except subprocess.CalledProcessError:
        print(
            "Unable to set password using `keyring` (is it in your PATH?) โ€” expect to be nagged",
            file=sys.stderr,
        )

    return {"user": user, "password": password}

connect_kwargs = get_config()

์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋” ๊นจ๋—ํ•œ ๋ฐฉ๋ฒ•์ด / ๊ณ„ํš๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฌด์—‡๋ณด๋‹ค๋„์ด ์ฝ”๋“œ๋Š” ๋‚ด๊ฐ€ ํ•„์š”๋กœํ•˜์ง€ ์•Š๋Š” ๊ตฌ์„ฑ์—์„œ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ๊ฐ€์ ธ ์˜ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Fabric 1 ๋ฒ„์ „๊ณผ ์ƒ๋‹นํžˆ ๋™์ผํ•˜์ง€๋Š” ์•Š์ง€๋งŒ "Get the processing ์ด ํ•˜๋‚˜์˜ ๊ฐ’์„ ๊ตฌ์„ฑํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•˜์‹ญ์‹œ์˜ค.

Bug Feature Needs investigation

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

fabfile.py ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ hello world ์˜ˆ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋ฉฐ์น  ๋™์•ˆ ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ์ฝ๊ณ  ์ธํ„ฐ๋„ท์„ ์ƒ…์ƒ…์ด ๋’ค์กŒ๊ณ  v2์—์„œ ์•„์ง ๋‹จ์ผ ๋ช…๋ น์„ ์›๊ฒฉ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์–ป๋Š” ํ•œ SSHException "์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ธ์ฆ ๋ฐฉ๋ฒ• ์—†์Œ"์ด ๋ถ™์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

"Python ํ˜•์‹"๊ตฌ์„ฑ ํŒŒ์ผ์ด "๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ ์‹คํ–‰์„ ํ†ตํ•ด ๊ตฌ์„ฑ ๊ฐ’ ์ฑ„์šฐ๊ธฐ"์˜ ๊ตฌ๋ฉ์„ ๋Œ€๋žต ์ฑ„์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— .py ํŒŒ์ผ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‚˜๋Š” ๊ทธ ์ƒ๊ฐ์„ ๋๊นŒ์ง€ ๋”ฐ๋ฅด์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์ด ๊ทธ์— ๋Œ€ํ•ด ์ง€๋ถˆํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค, ์‚ฌ๊ณผํ•ฉ๋‹ˆ๋‹ค. (์ด์œ ์˜ ์ผ๋ถ€๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์—… ํŒŒ์ผ / fabfile์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์ง€๋งŒ ๊ตฌ์„ฑ์— ๋”ฐ๋ฅธ ๋ฐ์ดํ„ฐ์—์„œ ๋Ÿฐํƒ€์ž„ ์ž‘์—… ๋ณธ๋ฌธ์œผ๋กœ์˜ ์—ฐ๊ฒฐ์—๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.)

ํ”ผํด ๋ง์ด ๋ฌด์—‡์ธ์ง€ ์ง์ ‘ ๊ธฐ์–ตํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.ํ•˜์ง€๋งŒ ์•„๋งˆ๋„ ๊ตฌ์„ฑ ์‹œ์Šคํ…œ์˜ ์ผ๋ถ€ ๊ธฐ์ด ํ•œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ”ผํด์„ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š”๋‹ค (์š”์ฆ˜, ๋ˆ„๊ฐ€ ์ข‹์•„ํ•œ๋‹ค). ๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ๋งฅ๋ฝ์—์„œ ๊ทธ๊ฒƒ์ด ํŠ€์–ด ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒƒ์€ ์กฐ๊ธˆ ๋†€๋ž๋‹ค.

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

Re : "ํ•˜๋‚˜์˜ ์ค‘์ฒฉ ๋œ ๊ตฌ์„ฑ ๊ฐ’๋งŒ ๋ณ€๊ฒฝ"์ด๋ผ๋Š” ๋” ๋†’์€ ์ˆ˜์ค€์˜ ๋””์ž์ธ ์งˆ๋ฌธ์€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ง๊ด€์ ์œผ๋กœ ์ž‘๋™ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (๊ตฌ์„ฑ ๋ณ‘ํ•ฉ ํ”„๋กœ์„ธ์Šค๋Š” ๊นŠ์€ ๋ณ‘ํ•ฉ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์œผ๋ฏ€๋กœ .py ํŒŒ์ผ์€ connect_kwargs = {'user': foo', 'password': 'bar'} ๋งŒ ์„ค์ •) ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์†Œ์Šค์˜ connect_kwargs ๋‚ด์šฉ๊ณผ ๋ณ‘ํ•ฉ๋˜์–ด์•ผํ•˜์ง€๋งŒ connect_kwargs ํŠนํžˆ # 1762์™€ ๊ฐ™์€ ๋ฒ„๊ทธ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ฒ˜์Œ ํŒจ๋ธŒ๋ฆญ 2 ์—…๊ทธ๋ ˆ์ด๋“œ ์‹œ๋„ ์˜€๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋‹ค์‹œ ํ…Œ์ŠคํŠธํ•ด์•ผํ•˜๋ฉฐ ๊ทธ ์ดํ›„๋กœ ๋งŽ์€ ์ปค๋ฐ‹์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

fabfile.py ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ hello world ์˜ˆ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋ฉฐ์น  ๋™์•ˆ ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ์ฝ๊ณ  ์ธํ„ฐ๋„ท์„ ์ƒ…์ƒ…์ด ๋’ค์กŒ๊ณ  v2์—์„œ ์•„์ง ๋‹จ์ผ ๋ช…๋ น์„ ์›๊ฒฉ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์–ป๋Š” ํ•œ SSHException "์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ธ์ฆ ๋ฐฉ๋ฒ• ์—†์Œ"์ด ๋ถ™์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

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