国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

python - django+celery+ansibleApi無(wú)返回

瀏覽:150日期:2022-09-10 14:47:23

問(wèn)題描述

1.python調(diào)用AnsibleApi遠(yuǎn)程執(zhí)行任務(wù),不用celery的情況下能正確運(yùn)行,使用的話返回為空.pdb調(diào)試發(fā)現(xiàn)是調(diào)用Ansible返回異常,但具體原因幾天實(shí)在無(wú)法查出

2.代碼復(fù)現(xiàn)如現(xiàn)如下:

tasks.py

from celery import shared_taskfrom .deploy_tomcat2 import django_process@shared_taskdef deploy(jira_num): #return ’hello world {0}’.format(jira_num) #rdb.set_trace() return django_process(jira_num)

deploy_tomcat2.py

from .AnsibleApi import CallApidef django_process(jira_num): server = ’10.10.10.30’ name = ’abc’ port = 11011 code = ’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()

AnsibleApi.py

#!/usr/bin/env python# -*- coding: utf-8 -*-import loggingfrom .Logger import Loggerfrom django.conf import settingsfrom collections import namedtuplefrom ansible.parsing.dataloader import DataLoaderfrom ansible.vars import VariableManagerfrom ansible.inventory import Inventoryfrom ansible.playbook.play import Playfrom ansible.executor.task_queue_manager import TaskQueueManagerfrom ansible.plugins.callback import CallbackBaseLog = Logger(’/tmp/auto_deploy_tomcat.log’,logging.INFO)class 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()] = resultclass CallApi(object): user = settings.SSH_USER ssh_private_key_file = settings.SSH_PRIVATE_KEY_FILE results_callback = ResultCallback() Options = namedtuple(’Options’, [’connection’, ’module_path’, ’private_key_file’, ’forks’, ’become’, ’become_method’, ’become_user’, ’check’]) def __init__(self,ip,name,port,code,jdk,jvm):self.ip = ipself.name = nameself.port = portself.code = codeself.jdk = jdkself.jvm = jvmself.results_callback = ResultCallback()self.results_raw = {} def _gen_user_task(self):tasks = []deploy_script = ’autodeploy/tomcat_deploy.sh’dst_script = ’/tmp/tomcat_deploy.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 = Nonefrom celery.contrib import rdb;rdb.set_trace()#import pdb;pdb.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._resultfor host, result in self.results_callback.host_failed.items(): self.results_raw[’failed’][host] = result._resultfor host, result in self.results_callback.host_unreachable.items(): self.results_raw[’unreachable’][host]= result._resultLog.info('result is :%s' % self.results_raw)return self.results_raw

復(fù)現(xiàn)方法

啟動(dòng)celery worker:celery -A jira worker -Q queue.ops.deploy -n 'deploy.%h' -l info

另一窗口生產(chǎn)消息:deploy.apply_async(args=[’150’], queue=’queue.ops.deploy’, routing_key=’ops.deploy’)

問(wèn)題解答

回答1:

有兩種方法解決這個(gè)問(wèn)題,就是關(guān)閉assert:1.在celery 的worker啟動(dòng)窗口設(shè)置export PYTHONOPTIMIZE=1或打開celery這個(gè)參數(shù)-O OPTIMIZATION2.注釋掉python包multiprocessing下面process.py中102行,關(guān)閉assert

回答2:

既然都用django,CRUD看來(lái)是標(biāo)配了,那么你不如試試 post_save 這個(gè) signal直接 deploy.delay(**params)

回答3:

python - django+celery+ansibleApi無(wú)返回請(qǐng)問(wèn)解決了沒,我應(yīng)該是遇到同樣的問(wèn)題,delay執(zhí)行有輸出,可實(shí)際上沒執(zhí)行到ansible的操作

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 国产 一二三四五六 | 欧美成人免费夜夜黄啪啪 | 9191精品国产费久久 | 午夜影院免费体验 | 欧美一级特黄做 | aaaa毛片| 久久国产美女免费观看精品 | 乱淫毛片| 日本一级高清不卡视频在线 | 国产人成午夜免视频网站 | 亚洲成人免费视频 | 国产日韩欧美精品 | 抱着cao才爽免费观看 | 欧美国产一区二区三区 | 亚洲 中文 欧美 日韩 在线人 | 亚洲欧美卡通成人制服动漫 | 精品小视频在线观看 | 成人三级在线播放线观看 | 久久这里一区二区精品 | 97国产成人精品视频 | 久久精品亚洲精品一区 | 精品自拍一区 | 国产视频久久 | 中文字幕乱码在线观看 | 国产在线91精品入口首页 | 国产精品外围在线观看 | 欧美毛片在线观看 | 欧美成人精品 | 欧美成人看片黄a免费看 | 亚洲福利视频一区二区三区 | 亚洲精品国产综合99久久一区 | 一级淫片免费视频 | 久草久热 | 日本免费在线观看视频 | 免费看一级欧美毛片视频 | 久久精品国产只有精品2020 | 日韩一区二区三区精品 | 国产成人v视频在线观看 | 怡红院宜春院 | 全部aⅴ极品视觉盛宴精品 全部免费a级毛片 | 亚洲三级小视频 |