celery -A proj report
в выпуск.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()
`
импорт журнала
из .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
@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'
есть два способа решить эту проблему: отключить 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 Я только что прочитал ваш ответ в
Самый полезный комментарий
есть два способа решить эту проблему: отключить 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'