Назад | Перейти на главную страницу

check_mysql_query не может подключиться к mysql, но работает из командной строки

У меня Nagios 3 работает на Debian Wheezy. Я могу выполнить следующий запрос из командной строки. Учетные данные для mysql db хранятся в ~nagios/.my.cnf

nagios@intranet:~$ /usr/lib/nagios/plugins/check_mysql_query -H 'myhost.mydomain.com' -q "SELECT cast(AVG(availability)*100 AS DECIMAL(5,2)   ) FROM crm.api_clients;" -w 70:100 -c 40:100
QUERY OK: 'SELECT cast(AVG(availability)*100 AS DECIMAL(5,2)   ) FROM crm.api_clients;' returned 100.000000

Но когда та же команда вызывается из Nagios, он не может подключиться к базе данных.

Соответствующие разделы определения команды и службы:

define command{
        command_name    check_proxy
        command_line    /usr/lib/nagios/plugins/check_mysql_query -H 'myhost.mydomain.com' -q "SELECT cast(AVG(availability)*100 AS DECIMAL(5,2)   ) FROM crm.api_clients;"  -w '$ARG1$' -c '$ARG2$'
}

define service{
        use                             generic-service         ; Name of service template to use
        host_name                       rds_read_replica
        service_description             Proxy availability
        check_command                   check_proxy!70:100!40:100
}

В веб-консоли я вижу следующую ошибку службы:

QUERY CRITICAL: Access denied for user 'nagios'@'172.33.13.112' (using password: NO)

Консоль работает, когда я передаю команде имя пользователя и пароль. Но я бы хотел check_mysql_query использовать учетные данные, хранящиеся в .my.cnf. Как я могу этого добиться?

Nagios будет запускать плагины без ENV и, следовательно, без установки $ HOME. Вы можете смоделировать это с помощью env -i для ручного тестирования.

Вы можете изменить свою команду проверки на что-то вроде HOME=/home/nagios && /usr/lib/nagios/plugins/check_mysql_query ... (или какой там путь).

Если вы не можете заставить это работать, оберните всю эту check_command в сценарий оболочки, который устанавливает HOME, прежде чем вызывать настоящий плагин. Также не забудьте взять код возврата и передать его через сценарий оболочки.