我有一堆设置env
的Fabric 1 fabfile。 目前尚不清楚将该代码迁移到Fabric2。文档参考了例如connect_kwargs
但是关于如何或在何处进行设置没有太多。 阅读Invoke文档后,由于我需要执行代码(在下面的示例中使用keyring
来检索密码),因此我似乎无法使用任何YAML / JSON配置选项。
似乎将它们全部移到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版本并不完全等效,因为它不会从配置中提取用户名,这不是我所需要的,但似乎应该有一种方式说“得到处理”配置并更新此值”。
我打算让“ Python格式”的配置文件大致填补“通过运行时代码执行来填充配置值”的空缺,因此可以说, .py
文件在正确的轨道上。 就是说–我并没有完全按照那种想法得出结论,这听起来像是您为此付出的代价,歉意。 (我会注意到,部分原因是我认为大多数高级用户将在他们的任务文件/ fabfile中执行操作,但是从配置式数据到运行时任务主体的桥梁都需要工作。)
别忘了立即进行腌制,但这可能是配置系统的一些古怪之处,我需要对此进行深入研究。 我不喜欢泡菜(这些天,谁喜欢),所以发现它在这种情况下弹出有点令人惊讶。
无论如何,最直接的原因是我们假设模块的内容“是”配置,因此,当我们从模块对象属性转到配置嵌套字典时,我们需要进行更严格的过滤。 坦白地说,剥离模块可能是所有需要的,因为任何其他变量分配在配置文件作者看来都是不良行为。
回复:更高级别的设计问题“仅更改一个嵌套的配置值”,即_在大多数情况下可以直观地工作(配置合并过程倾向于进行深度合并,因此您的.py文件只需设置connect_kwargs = {'user': foo', 'password': 'bar'}
应该最终与任何其他配置源的connect_kwargs
内容合并),但我认为在connect_kwargs
周围可能存在一些错误,例如,#1762。
我应该对此进行重新测试,因为那是我最初的Fabric 2升级尝试,从那时起,我已经看到很多提交。
有没有使用fabfile.py文件的简单的hello world示例? 我已经阅读了所有文档并在Internet上搜寻了几天,而且还无法在v2上远程运行单个命令。 据我所知,SSHException卡住了“没有可用的身份验证方法”
最有用的评论
有没有使用fabfile.py文件的简单的hello world示例? 我已经阅读了所有文档并在Internet上搜寻了几天,而且还无法在v2上远程运行单个命令。 据我所知,SSHException卡住了“没有可用的身份验证方法”