Я хочу использовать Матрицу для развертывания моего кода веб-приложения на разработке, подготовке и рабочих серверах. Мой fabfile:
def deploy_2_dev():
deploy('dev')
def deploy_2_staging():
deploy('staging')
def deploy_2_prod():
deploy('prod')
def deploy(server):
print 'env.hosts:', env.hosts
env.hosts = [server]
print 'env.hosts:', env.hosts
Демонстрационный вывод:
host:folder user$ fab deploy_2_dev
env.hosts: []
env.hosts: ['dev']
No hosts found. Please specify (single) host string for connection:
Когда я создаю a set_hosts()
задача как показано в документах Матрицы, env.hosts поставилась правильно. Однако это не жизнеспособный вариант, ни один не декоратор. Передача хостов на командной строке в конечном счете привела бы к некоторому сценарию оболочки, который называет fabfile, я предпочел бы иметь один единственный инструмент, делают задание правильно.
Это говорит в документах Матрицы, что 'env.hosts просто объект списка Python'. От моих наблюдений это просто не верно.
Кто-либо может объяснить, что продолжается здесь? Как я могу установить хост для развертывания к?
Я застрял на этом, но наконец понял. Вы просто не можете установить конфигурацию env.hosts из в задаче. Каждая задача выполняется N раз, по одному разу для каждого указанного хоста, поэтому настройка принципиально выходит за рамки задачи.
Глядя на ваш код выше, вы можете просто сделать это:
@hosts('dev')
def deploy_dev():
deploy()
@hosts('staging')
def deploy_staging():
deploy()
def deploy():
# do stuff...
Кажется, что он сделает то, что вы намереваетесь.
Или вы можете написать некоторый собственный код в глобальной области видимости, который анализирует аргументы вручную и устанавливает env.hosts до определения вашей функции задачи. По нескольким причинам я собственно так и настроил свою.
Вам необходимо установить host_string
, например:
from fabric.context_managers import settings as _settings
def _get_hardware_node(virtualized):
return "localhost"
def mystuff(virtualized):
real_host = _get_hardware_node(virtualized)
with _settings(
host_string=real_host):
run("echo I run on the host %s :: `hostname -f`" % (real_host, ))
Вы можете назначить env.hoststring
перед выполнением подзадачи. Назначьте эту глобальную переменную в цикле, если вы хотите перебрать несколько хостов.
К сожалению для нас с вами, ткань не предназначена для этого варианта использования. Ознакомьтесь с функцией main
по адресу http://github.com/bitprophet/fabric/blob/master/fabric/main.py , чтобы увидеть, как она работает.
Вам необходимо изменить env.hosts на уровне модуля, а не внутри функции задачи. Я совершил ту же ошибку.
from fabric.api import *
def _get_hosts():
hosts = []
... populate 'hosts' list ...
return hosts
env.hosts = _get_hosts()
def your_task():
... your task ...