问题描述
我有一个 Fabric 部署脚本,可以将 cronjobs 添加到远程机器上的特定用户。
fabfile 首先使用 ssh 配置连接到远程,然后使用 Connection.sudo(cmd)
Fabric 将用户更改为指定的用户并执行命令。
这很有效,当我尝试添加一个 cronjob 时,它只是被添加到普通用户而不是被添加到 sudoed 用户。
'prod': {
'host': 'myhost','sudo': {'user': 'special-user'},}
def add_cronjobs(conn,cron_hash,jobs):
if jobs:
conn.sudo("crontab -l | grep -v '{cron_hash}' ; echo '{jobs}' | crontab -".format(cron_hash=cron_hash,jobs=jobs))
@task
def deploy(ctx):
with Connection(host=ctx.host,config=ctx.config) as conn:
add_cronjobs(conn,CRON_HASH,cron)
其他命令正常工作,但 crontab 将作业添加到错误的用户
解决方法
结构中存在一个已知问题,更准确地说是在 pyinvoke
中,您可以关注 here
环境没有被正确拾取。作为一种解决方法,我发现自己在 crontab 之前调用了 bash。
def add_cronjobs(conn,cron_hash,jobs):
if jobs:
cmd = f"crontab -l | grep -v '{cron_hash}' ; echo '{jobs}' | crontab -"
conn.sudo(f'bash -c "{cmd}"')