Ad Widget

Collapse

ztc скрипты

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • garcia
    Junior Member
    • Jul 2017
    • 18

    #1

    ztc скрипты

    есть два контейнера, настроена mysql репликация, при проверке на первом контейнере
    Code:
    /opt/ztc/bin/mysql.py ping
    0.031466
    на втором контейнере
    Code:
    /opt/ztc/bin/mysql.py ping
    0
    и в логе пишется
    Code:
    [MyDB] 2019-03-04 16:31:28,307 - ERROR: Failed to connect to mysql
    конфиги на двух серверах сравнивал - /usr/local/lib/python2.7/dist-packages/ztc/
    все одинаково настроено, я так понимаю вся загвоздка в mysql socket
    Code:
    ls -al /var/run/mysqld/mysqld.sock
    srwxrwxrwx 1 mysql mysql 0 Mar  4 16:06 /var/run/mysqld/mysqld.sock
    но пути на двух контейнерах одинаковые

    может кто подскажет где этот socket прописать правильно или в чем может быть причина?
  • garcia
    Junior Member
    • Jul 2017
    • 18

    #2
    Code:
    #!/usr/bin/env python
    """
    MySQL module for ZTC
    
    Copyright (c) 2010-2011 Vladimir Rusinov <[email protected]>
    Copyright (c) 2011 Murano Software [http://muranosoft.com]
    Licensed under GNU GPL v.3
    """
    
    import time
    
    import MySQLdb
    
    #import ztc.commons
    from ztc.check import ZTCCheck, CheckFail
    
    class MyDB(ZTCCheck):
        name = 'mysql'
    
        OPTPARSE_MIN_NUMBER_OF_ARGS = 1
        OPTPARSE_MAX_NUMBER_OF_ARGS = 2
    
        #database='mysql'
        #host='localhost'
        #user='root'
        #password=''
        #unix_socket = None
    
        lasterr = None
        connected = None
    
        #def __init__(self):
        #    self.config = ztc.commons.get_config('mysql')
        #    self.database = self.config.get('database', self.database)
        #    self.host = self.config.get('host', self.host)
        #    self.user = self.config.get('user', self.user)
        #    self.password = self.config.get('password', self.password)
        #    self.unix_socket = self.config.get('unix_socket', self.unix_socket)
        #
        #    self._connect()
    
        def _connect(self):
            if self.connected:
                return True
            unix_socket = self.config.get('unix_socket', None)
            host = self.config.get('host', 'localhost')
            user = self.config.get('user', 'root')
            database = self.config.get('database', 'mysql')
            password = self.config.get('password', '')
            try:
                # TODO: remove this if, filter arguments instead
                if unix_socket:
                    self.conn =  MySQLdb.connect (host = host,
                               user = user,
                               passwd = password,
                               db = database,
                               unix_socket = unix_socket,
                               connect_timeout = 2
                               )
                else:
                    self.conn =  MySQLdb.connect (host = host,
                               user = user,
                               passwd = password,
                               db = database,
                               connect_timeout = 2
                               )
                self.cursor = self.conn.cursor();
                return True
            except MySQLdb.OperationalError:
                self.logger.error("Failed to connect to mysql")
                self.conn = None
                self.cursor = None
                return False
    
        def _get(self, metric, *args, **kwargs):
            if metric == 'ping':
                return self._get_ping()
            elif metric == 'status':
                try:
                    return self._get_status(args[0])
                except IndexError:
                    raise CheckFail("not enough arguments - pass global status "
                                    "metric name as 2nd arg")
    def _get_ping(self):
            """ calculate ping by executing very simple select """
            st = time.time()
            if not self._connect():
                return 0
            else:
                self.query('SELECT 1')
                return time.time() - st
    
        def _get_status(self, metric):
            if not self._connect():
                self.logger.error("get_status: could not connect to mysql")
                raise self.lasterr
            r = self.query('SHOW GLOBAL STATUS LIKE "%s"' % (self.escape(metric)))
            if r:
                return r[0][1]
            else:
                raise CheckFail('uncknown global status metric: %s' % (metric ))
    
    
        def query(self, query):
            """ execute query and return all its results (fetchall) """
            self.logger.debug("running query '%s'" % (query, ))
            self.cursor.execute(query)
            return self.cursor.fetchall()
    
        def escape(self, str):
            return MySQLdb.escape_string(str)
    
    if __name__ == '__main__':
        m = MyDB()
        print m.query("SELECT 1")
    вот какой socket он берет для mysql ?
    Last edited by garcia; 04-03-2019, 20:09.

    Comment

    • Victor Vislobokov
      Senior Member
      • Aug 2018
      • 298

      #3
      Проверьте на обоих хостах наличие и содержимое файла .my.cnf в домашнем каталоге zabbix.

      Comment

      • garcia
        Junior Member
        • Jul 2017
        • 18

        #4
        Originally posted by Victor Vislobokov
        Проверьте на обоих хостах наличие и содержимое файла .my.cnf в домашнем каталоге zabbix.
        на обоих хостах
        Code:
        zabbix:x:104:106::/var/run/zabbix/:/bin/false
        Code:
        ls -la /var/run/zabbix/
        total 4.0K
        drwxr-xr-x  2 zabbix zabbix  60 Mar  5 02:41 .
        drwxr-xr-x 11 root   root   360 May 24  2018 ..
        -rw-rw-r--  1 zabbix zabbix   5 Mar  5 02:41 zabbix_agentd.pid
        даже если от рута проверяю
        Code:
        /opt/ztc/bin/mysql.py ping
        0.058681
        Code:
        /opt/ztc/bin/mysql.py ping
        0
        в руте есть .my.cnf
        Code:
        cat .my.cnf
        [client]
        host     = localhost
        user     = debian-sys-maint
        password = ***
        socket   = /var/run/mysqld/mysqld.sock
        Last edited by garcia; 05-03-2019, 11:42.

        Comment

        • Victor Vislobokov
          Senior Member
          • Aug 2018
          • 298

          #5
          Я просто не в курсе как делается подключение к MySQL в Python. Но будем логичными. Если у вас в скрипте питона закоменчены данные для доступа к mysql то откуда он их пытается взять - и на одном хосте даже работает? Ответ очевиден из .my.cnf

          Comment

          • garcia
            Junior Member
            • Jul 2017
            • 18

            #6
            Originally posted by Victor Vislobokov
            Я просто не в курсе как делается подключение к MySQL в Python. Но будем логичными. Если у вас в скрипте питона закоменчены данные для доступа к mysql то откуда он их пытается взять - и на одном хосте даже работает? Ответ очевиден из .my.cnf
            да, но почему тогда от рута на одном контейнере все работает, на втором нет?

            Comment

            • Victor Vislobokov
              Senior Member
              • Aug 2018
              • 298

              #7
              А руками проверили? Типа:
              # su - zabbix
              $ /opt/ztc/bin/mysql.py ping
              или (если учётка zabbix без шела)
              # sudo -u zabbix /opt/ztc/bin/mysql.py ping

              Comment

              • garcia
                Junior Member
                • Jul 2017
                • 18

                #8
                Originally posted by Victor Vislobokov
                А руками проверили? Типа:
                # su - zabbix
                $ /opt/ztc/bin/mysql.py ping
                или (если учётка zabbix без шела)
                # sudo -u zabbix /opt/ztc/bin/mysql.py ping
                Code:
                UserParameter=mysql.ping,/opt/ztc/bin/mysql.py ping
                Code:
                su - zabbix
                zabbix@node1:~$ /opt/ztc/bin/mysql.py ping
                0.006239
                Code:
                zabbix@node1:~$ pwd
                /var/run/zabbix
                zabbix@node1:~$ ls -la
                total 8
                drwxr-xr-x  2 zabbix zabbix  80 Mar  6 12:08 .
                drwxr-xr-x 11 root   root   360 May 24  2018 ..
                -rw-------  1 zabbix zabbix  44 Mar  6 12:08 .bash_history
                -rw-rw-r--  1 zabbix zabbix   5 Mar  6 02:40 zabbix_agentd.pid
                Code:
                su - zabbix
                zabbix@node2:~$ /opt/ztc/bin/mysql.py ping
                0
                Code:
                zabbix@node2:~$ pwd
                /var/run/zabbix
                zabbix@node2:~$ ls -la
                total 8
                drwxr-xr-x  2 zabbix zabbix  80 Mar  6 12:09 .
                drwxr-xr-x 11 root   root   360 May 24  2018 ..
                -rw-------  1 zabbix zabbix  44 Mar  6 12:09 .bash_history
                -rw-rw-r--  1 zabbix zabbix   5 Mar  6 02:41 zabbix_agentd.pid

                Comment

                • Victor Vislobokov
                  Senior Member
                  • Aug 2018
                  • 298

                  #9
                  Ну вот, что я вам и говорил. Заббикс тут не при чём, разбирайтесь что не так с подключением. Может логин-пароль не те, может сокет не туда показывает. В любом случае - это уже не заббикс.
                  Попробуйте простым mysql клиентом зайти. Если и тут не покатит, точно с логином-паролем какая-то ерунда

                  Comment

                  • garcia
                    Junior Member
                    • Jul 2017
                    • 18

                    #10
                    Originally posted by Victor Vislobokov
                    Ну вот, что я вам и говорил. Заббикс тут не при чём, разбирайтесь что не так с подключением. Может логин-пароль не те, может сокет не туда показывает. В любом случае - это уже не заббикс.
                    Попробуйте простым mysql клиентом зайти. Если и тут не покатит, точно с логином-паролем какая-то ерунда
                    прикол в том, что я ничего пару дней не делал и оно само как-то заработало, мистика какая-то

                    Comment

                    Working...