Fabric: Chaves roledefs adicionais além de 'hosts' não carregam no env

Criado em 13 fev. 2015  ·  7Comentários  ·  Fonte: fabric/fabric

Este snippet dos documentos não disponibiliza as chaves de exemplo 'foo' para o usuário via env, apenas a chave 'hosts' é carregada posteriormente pelo Fabric (em env.hosts)

from fabric.api import env

env.roledefs = {
    'web': {
        'hosts': ['www1', 'www2', 'www3'],
        'foo': 'bar'
    },
    'dns': {
        'hosts': ['ns1', 'ns2'],
        'foo': 'baz'
    }
}

Documentado mais adiante nesta questão stackoverlow

Comentários muito úteis

@bitprophet Por que foi fechado? O comportamento das chaves roledef adicionais não mudou, então isso é um "não corrige"?

Todos 7 comentários

você pode usar o exemplo abaixo como arquivo de configuração e, em seguida, adicionar alguma função interna para lidar com fabfiles.py

como: list.db
interface | ip | senha | função ....
espero que funcione para você.

Existem várias chaves env usadas pelo fabric para determinar a qual host (s) conectar para cada sessão, ou seja, funções, funções_efetivas, hosts, string_de_host. E, claro, decoradores também.

Dito isso, o roledefs é apenas um mapeamento de nome para agrupar hosts, não necessariamente mesclado em env.hosts.

Definir os roledefs como um dict ajuda a organizar outras configurações personalizadas, ao lado dos hosts, que são específicos da função. Você pode acessá-los por meio do caminho completo do env, ou seja, env.roledefs.web.foo

Mas, como você emite, e talvez espere, é que uma função definida como um dict deve ser mesclada com a raiz do env.
É para isso que eu pessoalmente também o uso. Eu só não encontrei uma boa maneira de implementá-lo e puxar a solicitação ainda, devido a todas as maneiras possíveis de realmente definir / obter os papéis "atuais" ao executar uma tarefa específica e a complexidade ao chamar subtarefas dentro de tarefas . Explicado de forma simples, eu faço isso inscrevendo-me nas alterações de env e mesclando a função quando a chave roles é definida em env. Mas a parte "difícil" é manter o estado e limpar qualquer fusão de funções quando novas funções são usadas na sessão.

env.roledefs.web.foo produz o erro: AttributeError: 'dict' object has no attribute 'web'

Quer dizer, você poderia acessá-lo como um dicionário regular, env.roledefs ['web'] ['foo'], mas não vejo por que essa funcionalidade existe no Fabric, é apenas um comando simples. Parece que esse recurso foi implementado por um motivo mais útil?

Desculpe, você está certo, você tem que acessá-lo como diz.

Atualmente não há outro motivo a não ser permitir que você agrupe mais configurações de função ao lado dos hosts.
Mas, quando o marco 1.11 for lançado e o # 1092 existir, fará mais sentido.

Além disso, # 1088 faz parte de 1.11, que é semelhante ao que você está descrevendo / esperando. Mas eu não encontrei uma maneira legal, como eu disse, de implementar a fusão de roledefs ainda. Apenas prova de cocept em fork usando remendo de macaco profundo "feio".

Tudo bem, eu estava batendo minha cabeça contra a parede pensando que estava faltando alguma coisa :) Esses números de problemas mencionados parecem que vão ajudar um pouco sempre que rolarem. Obrigado Jonas!

Isso é confuso e acho que deve ser observado na documentação que essas variáveis ​​adicionais não são acessíveis fora dos roledefs.

@bitprophet Por que foi fechado? O comportamento das chaves roledef adicionais não mudou, então isso é um "não corrige"?

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