Fabric: Documentação para configuração de tempo de execução

Criado em 17 mai. 2018  ·  4Comentários  ·  Fonte: fabric/fabric

Eu tenho um monte de fabfiles do Tecido 1 que configuram env . Atualmente não é óbvio migrar esse código para o Fabric 2. A documentação faz referência, por exemplo, connect_kwargs mas não há muito sobre como ou onde definir isso. Depois de ler os documentos do Invoke, não parece que posso usar nenhuma das opções de configuração YAML / JSON, pois preciso executar o código (no exemplo abaixo, usando keyring para recuperar as senhas).

Parecia que mover tudo para um arquivo fabric.py poderia funcionar:

import subprocess
import sys
from getpass import getuser
import os

domain = os.environ.get("DOMAIN", "loctest")

def get_config():
    user = getuser()

    try:
        password = subprocess.check_output(["keyring", "get", domain, user]).strip()
        print("Loaded %s password for %s from keyring" % (domain, user))
    except subprocess.CalledProcessError:
        print(
            "Unable to set password using `keyring` (is it in your PATH?) — expect to be nagged",
            file=sys.stderr,
        )

    return {'user': user, 'password': password}

connect_kwargs = get_config()

Infelizmente, isso resulta em TypeError: can't pickle module objects . Definir __all__ não é suficiente para evitar isso, mas mover tudo para a função parece estar funcionando:

def get_config():
    import subprocess
    import sys
    from getpass import getuser
    import os

    domain = os.environ.get("DOMAIN", "loctest")
    user = os.environ.get("USER", getuser())

    try:
        password = subprocess.check_output(["keyring", "get", domain, user]).strip()
        print("Loaded %s password for %s from keyring" % (domain, user))
    except subprocess.CalledProcessError:
        print(
            "Unable to set password using `keyring` (is it in your PATH?) — expect to be nagged",
            file=sys.stderr,
        )

    return {"user": user, "password": password}

connect_kwargs = get_config()

Existe / há planos para uma maneira mais limpa de fazer isso? Entre outras coisas, este código não é exatamente equivalente à versão Fabric 1 porque ele não puxa o nome de usuário da configuração, o que não é algo que eu preciso, mas parece que deveria haver uma maneira de dizer “Pegue o processado configurar e atualizar este valor ”.

Bug Feature Needs investigation

Comentários muito úteis

Existe um exemplo simples hello world usando um arquivo fabfile.py? Tenho lido todos os documentos e vasculhado a Internet há alguns dias e ainda não consegui executar um único comando remotamente na v2. Pelo que entendi, está preso com uma SSHException "Nenhum método de autenticação disponível"

Todos 4 comentários

Eu pretendia que os arquivos de configuração do "formato Python" preenchessem aproximadamente o buraco de "preencher os valores de configuração por meio da execução do código em tempo de execução", então você estava indiscutivelmente no caminho certo com o arquivo .py . Dito isso - não segui esse pensamento até a conclusão e parece que você está pagando por isso, desculpas. (Notarei que parte do motivo é que assumi que os usuários mais avançados fariam coisas em seus arquivos de tarefas / fabfile, mas de qualquer forma a ponte de dados de configuração para corpos de tarefas em tempo de execução precisa funcionar.)

Não me lembro de antemão o que seria decapitar as coisas, mas provavelmente é alguma peculiaridade do sistema de configuração, vou precisar examinar isso. Eu não gosto de picles (hoje em dia, quem gosta), então foi um pouco surpreendente descobrir que apareceu nesse contexto.

Independentemente disso, a causa próxima é que presumimos que o conteúdo do módulo "seja" a configuração, portanto, precisamos de uma filtragem mais rigorosa quando vamos dos atributos do objeto do módulo para a configuração dict aninhada. Retirar módulos pode ser tudo o que é necessário honestamente, já que qualquer outra atribuição de variável seria, sem dúvida, um mau comportamento por parte do autor do arquivo de configuração.

Re: a questão de design de nível superior de "modificar apenas um valor de configuração aninhado", que _pensou_ funcionar intuitivamente na maioria dos casos (o processo de mesclagem de configuração tende a fazer uma fusão profunda, então seu arquivo .py apenas configurando connect_kwargs = {'user': foo', 'password': 'bar'} deve acabar sendo mesclado com o conteúdo de connect_kwargs qualquer outra fonte de configuração), mas acho que pode haver alguns bugs em torno de connect_kwargs especificamente, por exemplo, # 1762.

Devo testar novamente, pois essa foi minha tentativa inicial de atualização do Fabric 2 e vi muitos commits voando desde então.

Existe um exemplo simples hello world usando um arquivo fabfile.py? Tenho lido todos os documentos e vasculhado a Internet há alguns dias e ainda não consegui executar um único comando remotamente na v2. Pelo que entendi, está preso com uma SSHException "Nenhum método de autenticação disponível"

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

SamuelMarks picture SamuelMarks  ·  3Comentários

TimotheeJeannin picture TimotheeJeannin  ·  3Comentários

omzev picture omzev  ·  6Comentários

supriyopaul picture supriyopaul  ·  4Comentários

shadyabhi picture shadyabhi  ·  5Comentários