Fabric2 CLI: изящно переключать SSH пользователя - PullRequest
0 голосов
/ 03 июля 2018

Я использую Invoke / Fabric с boto3 для создания экземпляра AWS и передачи его в сценарий Ansible. Для этого необходимо подготовить несколько вещей на удаленной машине, прежде чем Ansible сможет вступить во владение, в частности, установить Python, создать пользователя и скопировать открытые ключи SSH.

Образ AWS поставляется с конкретным пользователем. Я хотел бы использовать этого пользователя только для создания своего собственного пользователя, копирования открытых ключей и последующего удаления пароля для входа. При использовании Fabric CLI объект соединения не создается и не может быть изменен в задачах.

Что может быть хорошим способом переключения пользователей (он же воссоздает объект соединения между задачами) и запускает следующие задачи с пользователем, которого я только что создал?

Возможно, я не пойду правильно (я перехожу из Fabric 1, где было достаточно переключения значений env). Вот несколько известных мне стратегий, большинство из которых устраняют некоторую гибкость, на которую мы опирались.

  1. Создайте пользовательский AMI, для которого все приготовления уже выполнены.
  2. Создайте локальный объект Connection в задаче для пользовательской настройки, прежде чем переходить к объекту подключения, предоставленному Fabric CLI.
  3. Более глубокая интеграция AWS с Ansible (проблема в том, что у нас есть пользователи, которые могут использовать Ansible после того, как экземпляр активен, но не имеют привилегий AWS).

Полагаю, в этот список также включен вопрос передового опыта.

1 Ответ

0 голосов
/ 18 июля 2018

Образ 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)
...