Fabric: Дополнительные ключи roledefs помимо 'hosts' не загружаются в env

Созданный на 13 февр. 2015  ·  7Комментарии  ·  Источник: fabric/fabric

Этот фрагмент из документации не делает примеры ключей 'foo' доступными для пользователя через env, только ключ 'hosts' впоследствии загружается Fabric (в env.hosts)

from fabric.api import env

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

Документировано далее по этому вопросу stackoverlow

Самый полезный комментарий

@bitprophet Почему это закрыли? Поведение дополнительных ключей roledef не изменилось, значит, это «не исправить»?

Все 7 Комментарий

вы можете использовать приведенный ниже пример в качестве файла конфигурации, а затем добавить некоторую внутреннюю функцию для обработки fabfiles.py

например: list.db
интерфейс | ip | пароль | роль ....
надеюсь, это сработает для вас.

Существует несколько ключей env, используемых структурой для определения того, к какому хосту (-ам) подключаться для каждого сеанса, т. Е. Роли, Effective_roles, hosts, host_string. И, конечно же, декораторы.

Тем не менее, roledefs - это только отображение имен для группирования хостов, не обязательно объединенное в env.hosts.

Определение roledefs как dict помогает вам организовать другие пользовательские настройки, помимо хостов, которые зависят от роли. Вы можете получить к ним доступ через полный путь env, то есть env.roledefs.web.foo

Но, как и вы, и, возможно, ожидаете, что роль, определенная как dict, должна быть объединена с корнем env.
Лично я для этого и использую. Я просто еще не нашел хорошего способа реализовать его и запрос на вытягивание из-за всех возможных способов фактически установить / получить «текущую» роль (роли) при выполнении конкретной задачи и сложности при вызове подзадач в задачах . Проще говоря, я делаю это, подписываясь на изменения в env и объединяя роль, когда ключ roles устанавливается в env. Но «сложная» часть - это сохранять состояние и очищать любое слияние ролей, когда в сеансе используются новые роли.

env.roledefs.web.foo выдает ошибку: AttributeError: 'dict' object has no attribute 'web'

Я имею в виду, что вы можете получить к нему доступ как к обычному dict, env.roledefs ['web'] ['foo'], но тогда я не понимаю, почему эта функция вообще существует в Fabric, это просто простой dict. Кажется, эта функция была реализована по более полезной причине?

Извините, вы правы, вам нужно получить к нему доступ, как вы говорите.

В настоящее время нет другой причины, кроме возможности группировать больше параметров ролей рядом с хостами.
Но когда выпущена веха 1.11 и существует # 1092, это имеет больше смысла.

Также # 1088 является частью 1.11, которая похожа на то, что вы описываете / ожидаете. Но, как я уже сказал, я еще не нашел хорошего способа для реализации слияния определений ролей. Только proof-of-cocept в форке с использованием "уродливого" глубокого исправления обезьяны.

Ах, хорошо, я бился головой об стену, думая, что что-то упустил :) Те номера проблем, на которые есть ссылки, выглядят так, как будто они немного помогут всякий раз, когда они катятся. Спасибо, Джонас!

Это сбивает с толку, и я думаю, что в документации следует отметить, что эти дополнительные переменные недоступны вне ролей.

@bitprophet Почему это закрыли? Поведение дополнительных ключей roledef не изменилось, значит, это «не исправить»?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги