以编程方式访问saltstack minion

时间:2017-02-03 00:18:54

标签: python salt-stack

过去一周我一直在努力解决这个问题,我担心根据SaltStack文档,我的解决方案并不常规。我们在全国各地的服务器上运行大约20个小兵,并且不仅需要能够监视它们,还需要不时发出命令和mysql查询。通过CLI可以很容易地做到这一点:

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

这将有效地返回运行该minion的服务器上file.txt中的最后四行。但是,我们接下来要做的是有一个脚本定期将此文件拉下来并将其缓存在salt master上。由于SaltStack是用python编写的,因此在我们的守护进程/ cron作业中使用相同的语言是明智的选择。但是,我们遇到的问题是我们非常想要一种与SaltStack接口的方式,而不必诉诸于在我们的python脚本中运行进程。目前,我们有以下几行代码,几乎完全相同:

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

在阅读文档后,很明显有一种方法可以实现SaltStack提供的功能。我们遇到的问题是,我们无法找出在不使用子进程模块的情况下实际运行此类命令所需的代码。此外,我们还希望对其中一些minions执行远程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模块我们希望能够使用salt.modules.mysql.db_list,但根据文档说该函数不接受任何参数。我们如何指定我们想要运行查询的哪个minion?我认为会有一些方法来实例化salt.modules.mysql的新实例,该实例持有对相关小兵的引用,但似乎不存在这样的功能。任何人都可以帮我们解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

如果你从cli执行模块,你的minion id从特定的东西开始,比如db-00db-01,你会做类似的事情:

salt 'db*' mysql.db_list

还有其他方法,而不是依赖于minion id。有关详细信息,请阅读有关targeting minions的更多信息。

在python中你可以像your linked docs中描述的那样做。一个略微调整的例子:

import salt.client

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