Celery: ansible + celeryが機能しない

作成日 2017年02月22日  ·  3コメント  ·  ソース: celery/celery

チェックリスト

  • [] celery -A proj reportの出力を問題に含めました。
    ソフトウェア->セロリ:4.0.2(潜在呼び出し)昆布:4.0.2py:3.6.0
    ビリヤード:3.5.0.2py-amqp:2.1.4
    プラットフォーム->システム:ダーウィンアーチ:64ビットインプ:CPython
    ローダー-> celery.loaders.app.AppLoader
    設定-> transport:amqp results:django-db)。
  • []この問題がCeleryの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. AnsibleApi.py
    `#!/ usr / bin / env python

---コーディング:utf-8 ---

インポートログ
from .Logger import Logger
django.confからインポート設定
コレクションからnamedtupleをインポートします
ansible.parsing.dataloaderからインポートDataLoader
ansible.varsからVariableManagerをインポートします
ansible.inventoryインポート在庫から
ansible.playbook.playからインポートPlay
ansible.executor.task_queue_managerからimportTaskQueueManager
ansible.plugins.callbackからインポートCallbackBase

Log = Logger( '/ 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(オブジェクト):
ユーザー= settings.SSH_USER
ssh_private_key_file = settings.SSH_PRIVATE_KEY_FILE
results_callback = ResultCallback()
オプション= namedtuple( 'オプション'、
['connection'、 'module_path'、 'private_key_file'、 'forks'、 'become'、 'become_method'、
'become_user'、 'チェック'])

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 from __future__ import Absolute_import、unicode_literals
セロリからインポートshared_task
from .deploy_tomcat2 import django_process

rom celery.contrib import rdb

@shared_task
def deploy(num):
#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 return empty dict:{'success':{}、 'failed':{}、 'unreachable':{}}

最も参考になるコメント

この問題を解決するには2つの方法があります。assertを無効にします。
1.セロリが開始する場所setexport 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件

この問題を解決するには2つの方法があります。assertを無効にします。
1.セロリが開始する場所setexport PYTHONOPTIMIZE = 1または、このパラメーターを使用してセロリを開始します-O OPTIMIZATION
2.pythonパケットマルチプロセッシングprocess.py行102を無効にします。
assert not _current_process._config.get('daemon'), \ 'daemonic processes are not allowed to have children'

この問題を解決するには2つの方法があります。assertを無効にします。
1.セロリが開始する場所setexport PYTHONOPTIMIZE = 1または、このパラメーターを使用してセロリを開始します-O OPTIMIZATION
2.pythonパケットマルチプロセッシングprocess.py行102を無効にします。
_current_process._config.get( 'daemon')ではなく、\ 'デーモンプロセスに子を含めることはできません'

@ Xuexiang825申し訳ありませんが、動作しません。Python3.6.3とansible 2.4.2.0、celery4.1.0を使用しています。 プレイブック実行機能はメッセージを表示しますが、何もしません。さらに、パラメータ-OOPTIMIZATIONについて教えてください。

@ Xuexiang825この記事であなたの

このページは役に立ちましたか?
0 / 5 - 0 評価