我需要一个Python程序,我用它来轮询远程服务器以获得SSH连接,并在它可用时通知.我目前正在使用paramiko这样做; 尝试连接,如果失败,请等待并重试,直到成功或最多重试.这有效,但它有点笨重.另外paramiko似乎连接或抛出错误,所以我能看到的唯一方法是使用try/except块,这是坏的,坏的,坏的.这是方法:
def check_ssh(self, ip, user, key_file, initial_wait=0, interval=0, retries=1):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
sleep(initial_wait)
for x in range(retries):
try:
ssh.connect(ip, username=user, key_filename=key_file)
return True
except Exception, e:
print e
sleep(interval)
return False
Run Code Online (Sandbox Code Playgroud)
必须有比这更优雅的解决方案.Paramiko是我选择的SSH库,但我愿意接受任何建议.
为了澄清,我想避免使用try/except作为控制正常代码执行流程的手段 - 它应该用于捕获实际错误,例如错误的主机密钥,无效的用户等.
我们有一个 ArgoCD 项目。在这个项目中,我们有多个应用程序(我们称它们为 A、B 和 C),它们通过 Kafka 集群相互传递消息。为此,需要创建主题。
应用程序 A 负责管理 Kafka 集群(除其他外)。我们在应用程序 A 中有一个 PreSync 挂钩,用于在更新应用程序 B 和 C 所依赖的其他资源之前创建和配置主题的作业。
这意味着我们需要应用程序 A 在其他应用程序之前同步,以确保顺利推出。为了尝试管理这个问题,我们将应用程序 A 添加到 SyncWave -1,其他应用程序处于默认状态0
kind: Application
metadata:
name: "A"
annotations:
argocd.argoproj.io/sync-wave: "-1"
Run Code Online (Sandbox Code Playgroud)
我们最初的假设(也许是愚蠢的)是同步协调应用于项目内,但是,它似乎仅应用于应用程序内。
因此,应用程序 A 中的资源会等待 PreSync 挂钩按预期配置主题,但应用程序 B 和 C 不会等待应用程序 A 同步。
有没有办法控制项目内应用程序之间同步的顺序/依赖关系?
我见过提到“应用程序的应用程序”模式,其中您有一个应用程序部署所有其他应用程序。这样做是否允许我们利用 SyncWave 确保应用程序 A 在尝试同步应用程序 B 和 C 之前完全解析?如果没有,还有其他办法吗?