Этот фрагмент из документации не делает примеры ключей '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
вы можете использовать приведенный ниже пример в качестве файла конфигурации, а затем добавить некоторую внутреннюю функцию для обработки 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 не изменилось, значит, это «не исправить»?
Самый полезный комментарий
@bitprophet Почему это закрыли? Поведение дополнительных ключей roledef не изменилось, значит, это «не исправить»?