Как установить целевые узлы в файле Матрицы

Я хочу использовать Матрицу для развертывания моего кода веб-приложения на разработке, подготовке и рабочих серверах. Мой 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'. От моих наблюдений это просто не верно.

Кто-либо может объяснить, что продолжается здесь? Как я могу установить хост для развертывания к?

107
задан skaffman 14 March 2010 в 12:58
поделиться

4 ответа

Я застрял на этом, но наконец понял. Вы просто не можете установить конфигурацию env.hosts из в задаче. Каждая задача выполняется N раз, по одному разу для каждого указанного хоста, поэтому настройка принципиально выходит за рамки задачи.

Глядя на ваш код выше, вы можете просто сделать это:

@hosts('dev')
def deploy_dev():
    deploy()

@hosts('staging')
def deploy_staging():
    deploy()

def deploy():
    # do stuff...

Кажется, что он сделает то, что вы намереваетесь.

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

21
ответ дан 24 November 2019 в 03:35
поделиться

Вам необходимо установить 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, ))
9
ответ дан 24 November 2019 в 03:35
поделиться

Вы можете назначить env.hoststring перед выполнением подзадачи. Назначьте эту глобальную переменную в цикле, если вы хотите перебрать несколько хостов.

К сожалению для нас с вами, ткань не предназначена для этого варианта использования. Ознакомьтесь с функцией main по адресу http://github.com/bitprophet/fabric/blob/master/fabric/main.py , чтобы увидеть, как она работает.

2
ответ дан 24 November 2019 в 03:35
поделиться

Вам необходимо изменить env.hosts на уровне модуля, а не внутри функции задачи. Я совершил ту же ошибку.

from fabric.api import *

def _get_hosts():
    hosts = []
    ... populate 'hosts' list ...
    return hosts

env.hosts = _get_hosts()

def your_task():
    ... your task ...
3
ответ дан 24 November 2019 в 03:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: