Celery: ансибл + сельдерей не работает

Созданный на 22 февр. 2017  ·  3Комментарии  ·  Источник: celery/celery

Контрольный список

  • [] Я включил вывод celery -A proj report в выпуск.
    программное обеспечение -> сельдерей: 4.0.2 (скрытый вызов) комбу: 4.0.2 py: 3.6.0
    бильярд: 3.5.0.2 py-amqp: 2.1.4
    платформа -> система: Арка Дарвина: 64-битный имп: CPython
    загрузчик -> celery.loaders.app.AppLoader
    настройки -> транспорт: результаты amqp: django-db).
  • [] Я подтвердил, что проблема существует с ветвью master Celery.

Действия по воспроизведению

1 .deploy_tomcat2.py
`from .AnsibleApi импортировать CallApi

def django_process (jira_num):
server = '10 .10.51.30 '
name = 'abc'
порт = 11011
код = 'efs'
jdk = '1.12.13'
jvm = 'хххх'

if str.isdigit(jira_num):
    # import pdb
    # pdb.set_trace()
    call = CallApi(server,name,port,code,jdk,jvm)
    return call.run_task()

`

  1. AnsibleApi.py
    `#! / usr / bin / env python

- - кодировка: utf-8 - -

импорт журнала
из .Logger import Logger
из настроек импорта django.conf
из коллекции импортировать namedtuple
из ansible.parsing.dataloader импорт DataLoader
из ansible.vars импортировать VariableManager
из ansible.inventory импорт Inventory
из ansible.playbook.play импорт Играть
из ansible.executor.task_queue_manager импорт TaskQueueManager
из ansible.plugins.callback import CallbackBase

Журнал = Регистратор ('/ tmp / auto_deploy_tomcat.log', logging.INFO)

класс ResultCallback (CallbackBase):
def __init __ (self, args, * kwargs):
super (ResultCallback, self) .__ init __ ( args, * kwargs)
self.host_ok = {}
self.host_unreachable = {}
self.host_failed = {}

def v2_runner_on_unreachable(self, result):
    self.host_unreachable[result._host.get_name()] = result

def v2_runner_on_ok(self, result, *args, **kwargs):
    self.host_ok[result._host.get_name()] = result

def v2_runner_on_failed(self, result, *args, **kwargs):
    self.host_failed[result._host.get_name()] = result

класс CallApi (объект):
user = settings.SSH_USER
ssh_private_key_file = settings.SSH_PRIVATE_KEY_FILE
results_callback = ResultCallback ()
Options = namedtuple ('Параметры',
['соединение', 'путь_модуля', 'частный_файл_ключа', 'вилки', 'стать', 'стать_методом',
'стать_пользователем', 'проверить'])

def __init__(self,ip,name,port,code,jdk,jvm):
    self.ip = ip
    self.name = name
    self.port = port
    self.code = code
    self.jdk = jdk
    self.jvm = jvm
    self.results_callback = ResultCallback()
    self.results_raw = {}

def _gen_user_task(self):
    tasks = []
    deploy_script = 'autodeploy/abc.sh'
    dst_script = '/tmp/abc.sh'
    cargs = dict(src=deploy_script, dest=dst_script, owner=self.user, group=self.user, mode='0755')
    args = "%s %s %d %s %s '%s'" % (dst_script, self.name, self.port, self.code, self.jdk, self.jvm)
    tasks.append(dict(action=dict(module='copy', args=cargs),register='shell_out'))
    tasks.append(dict(action=dict(module='debug', args=dict(msg='{{shell_out}}'))))
    # tasks.append(dict(action=dict(module='command', args=args)))
    # tasks.append(dict(action=dict(module='command', args=args), register='result'))
    # tasks.append(dict(action=dict(module='debug', args=dict(msg='{{result.stdout}}'))))
    self.tasks = tasks

def _set_option(self):
    self._gen_user_task()

    self.variable_manager = VariableManager()
    self.loader = DataLoader()
    self.options = self.Options(connection='smart', module_path=None, private_key_file=self.ssh_private_key_file, forks=None,
                                become=True, become_method='sudo', become_user='root', check=False)
    self.inventory = Inventory(loader=self.loader, variable_manager=self.variable_manager, host_list=[self.ip])
    self.variable_manager.set_inventory(self.inventory)

    play_source = dict(
    name = "auto deploy tomcat",
        hosts = self.ip,
        remote_user = self.user,
        gather_facts='no',
        tasks = self.tasks
    )
    self.play = Play().load(play_source, variable_manager=self.variable_manager, loader=self.loader)

def run_task(self):
    self.results_raw = {'success':{}, 'failed':{}, 'unreachable':{}}
    tqm = None
    from celery.contrib import rdb
    rdb.set_trace()
    self._set_option()
    try:
        tqm = TaskQueueManager(
            inventory=self.inventory,
            variable_manager=self.variable_manager,
            loader=self.loader,
            options=self.options,
            passwords=None,
            stdout_callback=self.results_callback,
        )
        result = tqm.run(self.play)
    finally:
        if tqm is not None:
            tqm.cleanup()

    for host, result in self.results_callback.host_ok.items():
        self.results_raw['success'][host] = result._result

    for host, result in self.results_callback.host_failed.items():
        self.results_raw['failed'][host] = result._result

    for host, result in self.results_callback.host_unreachable.items():
        self.results_raw['unreachable'][host]= result._result
    Log.info("result is :%s" % self.results_raw)
    return self.results_raw

3.tasks.py из __future__ import absolute_import, unicode_literals
из сельдерея импорта shared_task
из .deploy_tomcat2 импортировать django_process

rom celery.contrib импорт rdb

@shared_task
def развертывание (число):
#return 'hello world {0}'. format (num)
# rdb.set_trace ()

return django_process(num)`

Ожидаемое поведение

В консоли django: оболочка python manage.py, я могу использовать deploy ('123'), вызов кода ansibleApi для успешного копирования abc.sh на сервер dst.
Но я не работал, когда использовал deploy.apply_async (args = ['1334'], queue = 'queue.ops.deploy', routing_key = 'ops.deploy') »

Искал несколько дней, все никак не получается.

Фактическое поведение

AnsibleApi возвращает пустой dict: {'success': {}, 'failed': {}, 'unreachable': {}}

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

есть два способа решить эту проблему: отключить assert :
1. где начинается сельдерей, установите export PYTHONOPTIMIZE = 1 ИЛИ запустите сельдерей с этим параметром -O OPTIMIZATION
2. отключить многопроцессорную обработку пакетов python process.py строка 102:
assert not _current_process._config.get('daemon'), \ 'daemonic processes are not allowed to have children'

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

есть два способа решить эту проблему: отключить assert :
1. где начинается сельдерей, установите export PYTHONOPTIMIZE = 1 ИЛИ запустите сельдерей с этим параметром -O OPTIMIZATION
2. отключить многопроцессорную обработку пакетов python process.py строка 102:
assert not _current_process._config.get('daemon'), \ 'daemonic processes are not allowed to have children'

есть два способа решить эту проблему: отключить assert :
1. где начинается сельдерей, установите export PYTHONOPTIMIZE = 1 ИЛИ запустите сельдерей с этим параметром -O OPTIMIZATION
2. отключить многопроцессорную обработку пакетов python process.py строка 102:
assert not _current_process._config.get ('daemon'), \ 'демоническим процессам не разрешено иметь потомков'

@ Xuexiang825 Извините, это не работает, я использую Python 3.6.3 и ansible 2.4.2.0, celery 4.1.0. Мой исполнитель плейбука отображает сообщение, но ничего не делает. Кроме того, не могли бы вы рассказать мне что-нибудь о параметре -O OPTIMIZATION?

@ Xuexiang825 Я только что прочитал ваш ответ в

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