Celery: ansible + الكرفس لا يعمل

تم إنشاؤها على ٢٢ فبراير ٢٠١٧  ·  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 .

خطوات التكاثر

1.deploy_tomcat2.py
`من .AnsibleApi استيراد CallApi

def django_process (jira_num):
الخادم = '10 .10.51.30 '
الاسم = 'abc'
المنفذ = 11011
الكود = 'efs'
jdk = '1.12.13'
jvm = 'xxxx'

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

"

  1. أنسبل آبي
    #! / usr / bin / env python

- - الترميز: UTF-8 - -

استيراد التسجيل
من مسجل الاستيراد
من إعدادات استيراد django.conf
من مجموعات استيراد اسمهtuple
من ansible.parsing.dataloader استيراد DataLoader
من ansible.vars استيراد VariableManager
من جرد استيراد ansible.inventory
من ansible.playbook.play استيراد اللعب
من ansible.executor.task_queue_manager استيراد TaskQueueManager
من ansible.plugins.callback استيراد 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 (كائن):
المستخدم = الإعدادات
ssh_private_key_file = الإعدادات
results_callback = ResultCallback ()
الخيارات = مسمى ("خيارات" ،
['connect'، 'module_path'، 'private_key_file'، 'forks'، 'تصبح'، 'get_method'،
'Bec_user'، 'check'])

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__ استيراد Absolute_import، unicode_literals
من استيراد الكرفس shared_task
من .deploy_tomcat2 استيراد django_process

rom الكرفس. مساهمة الاستيراد rdb

تضمين التغريدة
نشر def (عدد):
#return تنسيق "hello world {0}". (num)
# rdb.set_trace ()

return django_process(num)`

سلوك متوقع

في وحدة تحكم django: python manager.py shell ، يمكنني استخدام النشر ('123') ، واستدعاء الكود ansibleApi لنسخ abc.sh إلى خادم dst بنجاح.
لكنني لم أعمل عندما استخدمت "publish.apply_async (args = ['1334']، queue = 'queue.ops.deploy'، routing_key = 'ops.deploy') '

لقد بحثت بضعة أيام ، وما زلت لا أعمل.

السلوك الفعلي

AnsibleApi ترجع رسالة فارغة: {'Success': {}، 'failure': {}، 'unreachable': {}}

التعليق الأكثر فائدة

هناك طريقتان لحل هذه المشكلة تعطيل التأكيد :
1.حيث يبدأ الكرفس ، قم بتعيين تصدير PYTHONOPTIMIZE = 1 أو ابدأ الكرفس بهذه المعلمة -O الأمثل
2.تعطيل عملية المعالجة المتعددة لحزم البايثون. سطر 102:
assert not _current_process._config.get('daemon'), \ 'daemonic processes are not allowed to have children'

ال 3 كومينتر

هناك طريقتان لحل هذه المشكلة تعطيل التأكيد :
1.حيث يبدأ الكرفس ، قم بتعيين تصدير PYTHONOPTIMIZE = 1 أو ابدأ الكرفس بهذه المعلمة -O الأمثل
2.تعطيل عملية المعالجة المتعددة لحزم البايثون. سطر 102:
assert not _current_process._config.get('daemon'), \ 'daemonic processes are not allowed to have children'

هناك طريقتان لحل هذه المشكلة تعطيل التأكيد :
1.حيث يبدأ الكرفس ، قم بتعيين تصدير PYTHONOPTIMIZE = 1 أو ابدأ الكرفس بهذه المعلمة -O الأمثل
2.تعطيل عملية المعالجة المتعددة لحزم البايثون. سطر 102:
تأكيد عدم _current_process._config.get ('daemon') ، \ 'العمليات الخفية غير مسموح لها بإنجاب الأطفال

@ Xuexiang825 معذرة ، لا يعمل ، أنا أستخدم Python 3.6.3 و ansible 2.4.2.0 ، والكرفس 4.1.0. رسالة عرض executer الخاصة بي ولكن لا تفعل شيئًا. علاوة على ذلك ، هل يمكن أن تخبرني شيئًا عن المعلمة -O الأمثل؟

@ Xuexiang825 لقد قرأت للتو إجابتك في سأستخدم اللغة الصينية ، لقد استخدمت متغير التصدير حتى يعمل! لكن يبدو أن المعلمة -O ليس لها أي تأثير ، عامل الكرفس -A celery_worker.celery --loglevel = info -O OPTIMIZATION هذا هو أمر بدء التشغيل الخاص بي.يبدو أنه لا يوجد شيء خطأ ، صحيح

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات