Celery: ansible+рдЕрдЬрд╡рд╛рдЗрди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 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 рд╢рд╛рдЦрд╛ рдХреЗ рдЦрд┐рд▓рд╛рдл рдореМрдЬреВрдж рд╣реИред

рдкреНрд░рдЬрдирди рдХреЗ рдЪрд░рдг

1 .deploy_tomcat2.py
`рд╕реЗ .AnsibleApi рдЖрдпрд╛рдд CallApi

рдбреАрдИрдПрдлрд╝ django_process (jira_num):
рд╕рд░реНрд╡рд░ = '10.10.51.30'
рдирд╛рдо = 'рдПрдмреАрд╕реА'
рдкреЛрд░реНрдЯ = 11011
рдХреЛрдб = 'рдИрдПрдлрдПрд╕'
рдЬреЗрдбреАрдХреЗ = '1.12.13'
рдЬреЗрд╡реАрдПрдо = '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 - -

рдЖрдпрд╛рдд рд▓реЙрдЧрд┐рдВрдЧ
рд╕реЗ .рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдЖрдпрд╛рдд рд▓рдХрдбрд╝рд╣рд╛рд░рд╛
django.conf рдЖрдпрд╛рдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реЗ
рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдЖрдпрд╛рдд nametuple
ansible.parsing.dataloader рд╕реЗ рдбреЗрдЯрд╛ рд▓реЛрдбрд░ рдЖрдпрд╛рдд рдХрд░реЗрдВ
ansible.vars рд╕реЗ VariableManager рдЖрдпрд╛рдд рдХрд░реЗрдВ
ansible.inventory рдЖрдпрд╛рдд рд╕реВрдЪреА рд╕реЗ
ansible.playbook.play рд╕реЗ рдЖрдпрд╛рдд рдХрд░реЗрдВ рдкреНрд▓реЗ
ansible.executor.task_queue_manager рд╕реЗ рдЖрдпрд╛рдд рдХрд╛рд░реНрдп рдХрддрд╛рд░ рдкреНрд░рдмрдВрдзрдХ
ansible.plugins.callback рд╕реЗ рдЖрдпрд╛рдд рдХрд░реЗрдВ CallbackBase

рд▓реЙрдЧ = рд▓реЙрдЧрд░ ('/ tmp/auto_deploy_tomcat.log', рд▓реЙрдЧрд┐рдВрдЧ.INFO)

рдХрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рдХреЙрд▓рдмреИрдХ (рдХреЙрд▓рдмреИрдХрдмреЗрд╕):
def __init__ (рд╕реНрд╡рдпрдВ, args, * kwargs):
рд╕реБрдкрд░ (рдкрд░рд┐рдгрд╛рдо рдХреЙрд▓рдмреИрдХ, рд╕реНрд╡).__init__( args, * kwargs)
рд╕реНрд╡рдпрдВ.рд╣реЛрд╕реНрдЯ_рдУрдХреЗ = {}
рд╕реНрд╡рдпрдВ.рд╣реЛрд╕реНрдЯ_рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп = {}
рд╕реНрд╡рдпрдВ.рд╣реЛрд╕реНрдЯ_рдЕрд╕рдлрд▓ = {}

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

рдХреНрд▓рд╛рд╕ рдХреЙрд▓рдПрдкреА (рдСрдмреНрдЬреЗрдХреНрдЯ):
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ = рд╕реЗрдЯрд┐рдВрдЧреНрд╕.SSH_USER
ssh_private_key_file = рд╕реЗрдЯрд┐рдВрдЧреНрд╕.SSH_PRIVATE_KEY_FILE
рдкрд░рд┐рдгрд╛рдо_рдХреЙрд▓рдмреИрдХ = рдкрд░рд┐рдгрд╛рдо рдХреЙрд▓рдмреИрдХ ()
рд╡рд┐рдХрд▓реНрдк = рдиреЗрдордЯреБрдкрд▓ ('рд╡рд┐рдХрд▓реНрдк',
['рдХрдиреЗрдХреНрд╢рди', 'рдореЙрдбреНрдпреВрд▓_рдкрде', 'рдирд┐рдЬреА_рдХреА_рдлрд╛рдЗрд▓', 'рдХрд╛рдВрдЯреЗ', 'рдмрдиреЗрдВ', 'рдмрдиреЗрдВ_рдореЗрдереЛрдб',
'рдмрдиреЗрдВ_рдпреВрд╕рд░', 'рдЪреЗрдХ'])

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__ рд╕реЗ рдирд┐рд░рдкреЗрдХреНрд╖_рдЖрдпрд╛рдд рдЖрдпрд╛рдд рдХрд░реЗрдВ, рдпреВрдирд┐рдХреЛрдб_рд▓рд┐рдЯрд░рд▓реНрд╕
рдЕрдЬрд╡рд╛рдЗрди рдЖрдпрд╛рдд рд╕реЗ рд╕рд╛рдЭрд╛_рдХрд╛рд░реНрдп
рд╕реЗ .deploy_tomcat2 рдЖрдпрд╛рдд django_process

ROM Celery.contrib рдЖрдпрд╛рдд rdb

@shared_task
рдбреАрдИрдПрдлрд╝ рдкрд░рд┐рдирд┐рдпреЛрдЬрди (рд╕рдВрдЦреНрдпрд╛):
#рд░рд┐рдЯрд░реНрди 'рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб {0}'.format(num)
#rdb.set_trace()

return django_process(num)`

рдЕрдкреЗрдХреНрд╖рд┐рддреН рд╡реНрдпрд╡рд╣рд╛рд░

django рдХрдВрд╕реЛрд▓ рдореЗрдВ :python manage.py shell, рдореИрдВ abc.sh рдХреЛ dst рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдирд┐рдпреЛрдЬрди ('123'), рдХреЛрдб рдХреЙрд▓ ansibleApi рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВрдиреЗ 'рддреИрдирд╛рддреА.apply_async(args=['1334'], queue='queue.ops.deploy',routing_key='ops.deploy')' рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рддреЛ рдореИрдВрдиреЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рдореИрдВрдиреЗ рдХреБрдЫ рджрд┐рди рдЦреЛрдЬрд╛, рдлрд┐рд░ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░

AnsibleApi рдЦрд╛рд▓реА рддрд╛рдирд╛рд╢рд╛рд╣реА рд▓реМрдЯрд╛рддрд╛ рд╣реИ: {'рд╕рдлрд▓рддрд╛': {}, 'рд╡рд┐рдлрд▓': {}, 'рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп': {}}

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ, рдореБрдЦрд░ рдЕрдХреНрд╖рдо рдХрд░реЗрдВя╝Ъ
1.рдЬрд╣рд╛рдБ рдЕрдЬрд╡рд╛рдЗрди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдирд┐рд░реНрдпрд╛рдд PYTHONOPTIMIZE = 1 рдпрд╛ рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЕрдЬрд╡рд╛рдЗрди рд╢реБрд░реВ рдХрд░реЗрдВ -O рдЕрдиреБрдХреВрд▓рди
2.рдЕрдХреНрд╖рдо рдЕрдЬрдЧрд░ рдкреИрдХреЗрдЯ рдорд▓реНрдЯреАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛.py рд▓рд╛рдЗрди 102:
assert not _current_process._config.get('daemon'), \ 'daemonic processes are not allowed to have children'

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ, рдореБрдЦрд░ рдЕрдХреНрд╖рдо рдХрд░реЗрдВя╝Ъ
1.рдЬрд╣рд╛рдБ рдЕрдЬрд╡рд╛рдЗрди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдирд┐рд░реНрдпрд╛рдд PYTHONOPTIMIZE = 1 рдпрд╛ рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЕрдЬрд╡рд╛рдЗрди рд╢реБрд░реВ рдХрд░реЗрдВ -O рдЕрдиреБрдХреВрд▓рди
2.рдЕрдХреНрд╖рдо рдЕрдЬрдЧрд░ рдкреИрдХреЗрдЯ рдорд▓реНрдЯреАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛.py рд▓рд╛рдЗрди 102:
assert not _current_process._config.get('daemon'), \ 'daemonic processes are not allowed to have children'

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ, рдореБрдЦрд░ рдЕрдХреНрд╖рдо рдХрд░реЗрдВя╝Ъ
1.рдЬрд╣рд╛рдБ рдЕрдЬрд╡рд╛рдЗрди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдирд┐рд░реНрдпрд╛рдд PYTHONOPTIMIZE = 1 рдпрд╛ рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЕрдЬрд╡рд╛рдЗрди рд╢реБрд░реВ рдХрд░реЗрдВ -O рдЕрдиреБрдХреВрд▓рди
2.рдЕрдХреНрд╖рдо рдЕрдЬрдЧрд░ рдкреИрдХреЗрдЯ рдорд▓реНрдЯреАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛.py рд▓рд╛рдЗрди 102:
рдЬреЛрд░ рдирд╣реАрдВ _current_process._config.get('daemon'), \ 'рдбреЗрдореЛрдирд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдмрдЪреНрдЪреЗ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ'

@ Xuexiang825 рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдкрд╛рдпрдерди 3.6.3 рдФрд░ рдЙрддреНрддрд░рджрд╛рдпреА 2.4.2.0, рдЕрдЬрд╡рд╛рдЗрди 4.1.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдореЗрд░рд╛ рдкреНрд▓реЗрдмреБрдХ рдирд┐рд╖реНрдкрд╛рджрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдкреИрд░рд╛рдореАрдЯрд░-рдУ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ?

@ Xuxiang825 рдореИрдВрдиреЗ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЖрдкрдХрд╛

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

jaddison picture jaddison  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

xiaods picture xiaods  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

sklarsa picture sklarsa  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

aTylerRice picture aTylerRice  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

maxim25 picture maxim25  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ