以编程方式访问 saltstack minion
Accessing saltstack minion programmatically
过去一周我一直在努力解决这个问题,根据 SaltStack 文档,我担心我的解决方案不是传统的。我们在全国各地的各种服务器上有大约 20 个 minions 运行ning,不仅需要能够监控它们,还需要不时发出命令和 mysql 查询。这很容易从 CLI 通过类似的东西来完成:
salt '[minion name here]' cmd.run "tail -4 /usr/local/bin/file.txt"
那将有效地 return 服务器 file.txt 中的最后四行 运行 宁那个小兵。然而,我们接下来要做的是有一个脚本,定期拉下这个文件并将其缓存在 salt master 上。由于 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 提供了一种方法可以做到这一点。我们遇到的问题是,如果不使用 subprocess 模块,我们无法弄清楚实际 运行 这样的命令所需的代码。此外,我们还希望对这些 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
的新实例,该实例包含对相关 minion 的引用,但似乎不存在这样的功能。谁能帮我们解决这个问题?
如果你从 cli 执行模块并且你的 minion id 以特定的东西开头,比如 db-00
和 db-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')
过去一周我一直在努力解决这个问题,根据 SaltStack 文档,我担心我的解决方案不是传统的。我们在全国各地的各种服务器上有大约 20 个 minions 运行ning,不仅需要能够监控它们,还需要不时发出命令和 mysql 查询。这很容易从 CLI 通过类似的东西来完成:
salt '[minion name here]' cmd.run "tail -4 /usr/local/bin/file.txt"
那将有效地 return 服务器 file.txt 中的最后四行 运行 宁那个小兵。然而,我们接下来要做的是有一个脚本,定期拉下这个文件并将其缓存在 salt master 上。由于 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 提供了一种方法可以做到这一点。我们遇到的问题是,如果不使用 subprocess 模块,我们无法弄清楚实际 运行 这样的命令所需的代码。此外,我们还希望对这些 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
的新实例,该实例包含对相关 minion 的引用,但似乎不存在这样的功能。谁能帮我们解决这个问题?
如果你从 cli 执行模块并且你的 minion id 以特定的东西开头,比如 db-00
和 db-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')