2017-02-03 3 views
0

Я боролся с этой проблемой на прошлой неделе, и я боюсь, что мое решение не является обычным в соответствии с документацией SaltStack. У нас около 20 митингов, работающих на разных серверах по всей стране, и они должны иметь возможность не только контролировать их, но и периодически выдавать команды и запросы mysql. Это очень легко сделать из CLI через что-то вроде:Доступ к программному программному обеспечению соляной раковины

salt '[minion name here]' cmd.run "tail -4 /usr/local/bin/file.txt" 

Это было бы эффективно вернуть последние четыре строки в file.txt на сервере, что любимца. Однако то, что мы хотим сделать дальше, это сценарий, который периодически вытягивает этот файл и кэширует его на основе соли. Так как SaltStack написан на python, было бы безразлично использовать один и тот же язык для наших задач daemons/cron. Однако проблема, с которой мы сталкиваемся, заключается в том, что нам очень хотелось бы взаимодействовать с SaltStack, не прибегая к запуску процесса из нашего скрипта python. В настоящее время мы имеем следующую строку кода, который делает почти то же самое:

subprocess.Popen(['salt', minion, 'cmd.run', '"tail -4 /usr/local/bin/file.txt"', '--out', 'json'], stdout=subprocess.PIPE) 

После прочтения в документации стало очевидно, что есть способ сделать это предусмотрено SaltStack. Проблема, с которой мы сталкиваемся, заключается в том, что мы не можем определить код, необходимый для фактической работы такой команды, без использования модуля подпроцесса. Кроме того, мы хотим также выполнить удаленные запросы mysql для некоторых из этих миньонов, но мы настолько неопытны (или настолько глупы), что не можем расшифровать то, что должен сделать соответствующий код.

Для примера мы хотели бы перечислить все базы данных, расположенные на одном из наших узлов. Мы нашли следующие две статьи, которые объясняют, как это сделать, но мы смущены тем, что на самом деле должно быть выполнено, чтобы получить наш окончательный результат.

https://docs.saltstack.com/en/2015.8/ref/clients/index.html 
https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.mysql.html 

Из MySQL солевых модулей можно было бы ожидать, чтобы иметь возможность использовать salt.modules.mysql.db_list, но в соответствии с документацией, что функция не принимает никаких параметров. Как мы укажем, какой миньон мы хотим запустить? Я думал, что будет какой-то способ создания нового экземпляра salt.modules.mysql, в котором содержится ссылка на рассматриваемого миньона, но такой функции, похоже, не существует. Может ли кто-нибудь помочь нам в этом вопросе?

ответ

1

Если выполнить модули из командной строки и ваши миньонов Идентификаторы начать с чем-то конкретным, как db-00 и db-01, вы могли бы сделать что-то подобное:

salt 'db*' mysql.db_list

Существуют и другие подходы, чем полагаться на миньонов идентификатор , Подробнее о targeting minions для получения дополнительной информации.

Изнутри python вы можете сделать то же, что описано в your linked docs. Немного скорректированный пример:

import salt.client 

local = salt.client.LocalClient() 
local.cmd('db-*', 'mysql.db_list') 
+0

Большое спасибо. Я наконец добрался до реализации вашего ответа через 5 месяцев. Работа заставила меня слишком заняться :( – CzechErface

Смежные вопросы