首页 > 解决方案 > Fabric2 CLI:优雅切换 SSH 用户

问题描述

我正在使用 Invoke/Fabric 和 boto3 创建一个 AWS 实例并将其交给 Ansible 脚本。为了做到这一点,在 Ansible 接管之前,必须在远程机器上准备一些东西,特别是安装 Python、创建用户和复制公共 SSH 密钥。

AWS 映像随特定用户一起提供。我只想使用这个用户来创建我自己的用户,复制公钥,然后删除密码登录。使用 Fabric CLI 时,不会创建连接对象,也无法在任务中修改。

切换用户(也就是在任务之间重新创建连接对象)并与我刚刚创建的用户一起运行以下任务的好方法是什么?

我可能不会以正确的方式进行(我正在从 Fabric 1 迁移,其中 env 值的切换就足够了)。以下是我知道的一些策略,它们中的大多数消除了我们一直依赖的一些灵活性。

  1. 创建一个已完成所有准备工作的自定义 AMI。
  2. 在回退到 Fabric CLI 提供的连接对象之前,在任务中为用户设置创建一个本地连接对象。
  3. 将 AWS 与 Ansible 更深入地集成(问题是我们的用户可能在实例处于活动状态后使用 Ansible 但没有 AWS 权限)。

我想这个列表还包括一个最佳实践问题。

标签: pythoninvokefabric

解决方案


AWS 映像随特定用户一起提供。我只想使用这个用户来创建我自己的用户,复制公钥,然后删除密码登录。使用 Fabric CLI 时,不会创建连接对象,也无法在任务中修改。

我不确定这是否准确。我在执行任务期间切换了用户就好了。您只需确保所有需要更新 env 的后续调用都使用该execute操作。

例如

def create_users():
    run('some command')

def some_other_stuff():
    run('whoami')

@task
def new_instance():
    # provision instance using boto3
    env.host = [ ip_address ]
    env.user = 'ec2-user'
    env.password = 'sesame'
    execute(create_users)
    env.user = 'some-other-user'
    execute(some_other_stuff)

推荐阅读