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 ์ด ํ๋์ ๊ฐ์ ๊ตฌ์ฑํ๊ณ ์ ๋ฐ์ดํธํ์ญ์์ค.
"Python ํ์"๊ตฌ์ฑ ํ์ผ์ด "๋ฐํ์ ์ฝ๋ ์คํ์ ํตํด ๊ตฌ์ฑ ๊ฐ ์ฑ์ฐ๊ธฐ"์ ๊ตฌ๋ฉ์ ๋๋ต ์ฑ์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ .py
ํ์ผ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๊ณ ์์์ต๋๋ค. ์ฆ, ๋๋ ๊ทธ ์๊ฐ์ ๋๊น์ง ๋ฐ๋ฅด์ง ์์๊ณ ๋น์ ์ด ๊ทธ์ ๋ํด ์ง๋ถํ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค, ์ฌ๊ณผํฉ๋๋ค. (์ด์ ์ ์ผ๋ถ๋ ๋๋ถ๋ถ์ ๊ณ ๊ธ ์ฌ์ฉ์๊ฐ ์์
ํ์ผ / fabfile์์ ์์
์ ์ํํ๋ค๊ณ ๊ฐ์ ํ์ง๋ง ๊ตฌ์ฑ์ ๋ฐ๋ฅธ ๋ฐ์ดํฐ์์ ๋ฐํ์ ์์
๋ณธ๋ฌธ์ผ๋ก์ ์ฐ๊ฒฐ์๋ ์์
์ด ํ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.)
ํผํด ๋ง์ด ๋ฌด์์ธ์ง ์ง์ ๊ธฐ์ตํ์ง ๋ง์ญ์์ค.ํ์ง๋ง ์๋ง๋ ๊ตฌ์ฑ ์์คํ ์ ์ผ๋ถ ๊ธฐ์ด ํ ๊ฒ์ผ ์ ์์ต๋๋ค. ๋๋ ํผํด์ ์ข์ํ์ง ์๋๋ค (์์ฆ, ๋๊ฐ ์ข์ํ๋ค). ๊ทธ๋์ ์ด๋ฐ ๋งฅ๋ฝ์์ ๊ทธ๊ฒ์ด ํ์ด ๋์ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋ ๊ฒ์ ์กฐ๊ธ ๋๋๋ค.
์ด์จ๋ ๊ทผ์ฌํ ์์ธ์ ๋ชจ๋ ๋ด์ฉ์ด ๊ตฌ์ฑ์ด๋ผ๊ณ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ๊ฐ์ฒด ์์ฑ์์ ๊ตฌ์ฑ ์ค์ฒฉ ์ฌ์ ์ผ๋ก ์ด๋ํ ๋ ๋ ์๊ฒฉํ ํํฐ๋ง์ด ํ์ํฉ๋๋ค. ๋ชจ๋์ ์ ๊ฑฐํ๋ ๊ฒ์ด ์ ์งํ๊ฒ ํ์ํ ์ ๋ถ์ผ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๋ณ์ ํ ๋น์ ๊ตฌ์ฑ ํ์ผ ์์ฑ์ ์ธก์์ ์๋ชป๋ ๋์ ์ผ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
Re : "ํ๋์ ์ค์ฒฉ ๋ ๊ตฌ์ฑ ๊ฐ๋ง ๋ณ๊ฒฝ"์ด๋ผ๋ ๋ ๋์ ์์ค์ ๋์์ธ ์ง๋ฌธ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ง๊ด์ ์ผ๋ก ์๋ํด์ผํฉ๋๋ค (๊ตฌ์ฑ ๋ณํฉ ํ๋ก์ธ์ค๋ ๊น์ ๋ณํฉ์ ์ํํ๋ ๊ฒฝํฅ์ด ์์ผ๋ฏ๋ก .py ํ์ผ์ connect_kwargs = {'user': foo', 'password': 'bar'}
๋ง ์ค์ ) ๋ค๋ฅธ ๊ตฌ์ฑ ์์ค์ connect_kwargs
๋ด์ฉ๊ณผ ๋ณํฉ๋์ด์ผํ์ง๋ง connect_kwargs
ํนํ # 1762์ ๊ฐ์ ๋ฒ๊ทธ๊ฐ์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฒ์ ํจ๋ธ๋ฆญ 2 ์ ๊ทธ๋ ์ด๋ ์๋ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ค์ ํ ์คํธํด์ผํ๋ฉฐ ๊ทธ ์ดํ๋ก ๋ง์ ์ปค๋ฐ์ด ๋ฐ์ํ๋ ๊ฒ์ ๋ณด์์ต๋๋ค.
fabfile.py ํ์ผ์ ์ฌ์ฉํ๋ ๊ฐ๋จํ hello world ์์ ๊ฐ ์์ต๋๊น? ๋๋ ๋ฉฐ์น ๋์ ๋ชจ๋ ๋ฌธ์๋ฅผ ์ฝ๊ณ ์ธํฐ๋ท์ ์ ์ ์ด ๋ค์ก๊ณ v2์์ ์์ง ๋จ์ผ ๋ช ๋ น์ ์๊ฒฉ์ผ๋ก ์คํํ ์ ์์์ต๋๋ค. ๋ด๊ฐ ์ป๋ ํ SSHException "์ฌ์ฉ ๊ฐ๋ฅํ ์ธ์ฆ ๋ฐฉ๋ฒ ์์"์ด ๋ถ์ด ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
fabfile.py ํ์ผ์ ์ฌ์ฉํ๋ ๊ฐ๋จํ hello world ์์ ๊ฐ ์์ต๋๊น? ๋๋ ๋ฉฐ์น ๋์ ๋ชจ๋ ๋ฌธ์๋ฅผ ์ฝ๊ณ ์ธํฐ๋ท์ ์ ์ ์ด ๋ค์ก๊ณ v2์์ ์์ง ๋จ์ผ ๋ช ๋ น์ ์๊ฒฉ์ผ๋ก ์คํํ ์ ์์์ต๋๋ค. ๋ด๊ฐ ์ป๋ ํ SSHException "์ฌ์ฉ ๊ฐ๋ฅํ ์ธ์ฆ ๋ฐฉ๋ฒ ์์"์ด ๋ถ์ด ์์ต๋๋ค.