Fabric 将 cronjob 添加到错误的用户

问题描述

我有一个 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}"')