我目前正在探索Runddeck,以管理多个100个虚拟机。 Rundeck是一个非常有用的工具,可以在多台机器上运行脚本/命令(每个脚本都传递给远程机器,然后在本地执行)。但是我想知道是否有办法实现以下系统管理方案。
Rundeck工作要求(例如:Observium)
/opt/observium/add_device.php v2c @node.name@ ${varSNMPCommunity}
我没有足够的声誉在这篇文章中包含图片。请使用以下链接查看流程图。
https://www.dropbox.com/s/2zt4r9trulpsaqx/RundeckObservium.png?dl=0
答案 0 :(得分:1)
不是让脚本在一个节点上运行以获取计算机列表,而是尝试使用节点过滤器来查看是否可以让RunDeck从标记中确定目标节点。这取决于您的项目如何配置以获取资源。
例如,如果您使用的是标签,那么您可能希望拥有符合条件的标签。假设您要查找与您创建的名为RebootPending
的标记匹配的计算机。您可以将其用作作业的节点过滤器,以向这些主机发送重新启动命令。
另一种可能的选择可能是让您的第2步脚本将JSON格式的文件输出到Web服务器。然后,您可以使用选项来配置RD作业,该选项可以读取此远程URL(可能是主机列表),然后根据该列表执行操作。可以这样配置作业选项和节点过滤器:
Option Name: inputFilter
Description: Used for targeting nodes
Default Value: (empty)
Input Type: [X]Plain text [ ]Secure [ ]Secure Remote Authentication
Allowed Values: [ ]List [X]Remote URL
Node Filter: tags:${option:inputFilter}
通过使用这些设置,您可以让远程网页(例如,您的脚本的输出)确定目标节点。请注意,RunDeck JSON格式是特定的,不会很好地报告读取错误。密切关注Rundeck User Guide - Option model provider
如果这不是一种可行的方法,您可能需要考虑使用其他工具,例如Jenkins。
答案 1 :(得分:1)
如果您想在rundeck机器上运行脚本,并且脚本将远程ssh自己运行到目标机器,那么您必须仅在rundeck中选择本地机器。然后在脚本中,您可以调用rundeck来为项目提供机器列表。 例如在bash你可以做下面的
#!/bin/bash
projectName="test_project"
nodeFilter="tags:app"
/usr/bin/dispatch -v -p $projectName --filter "$nodeFilter" >/tmp/filtered.node
nodes=( $( grep "hostname" /tmp/filtered.node | cut -f2 -d ":" ) )
echo "$nodes[@]"
以下示例将为您提供test_project中标记设置为app的节点列表。
答案 2 :(得分:1)
我只是为了类似的目的创建一个作业 - 在远程节点上执行一个脚本,但是将任意数量的服务器传递给该脚本。我将所有目标服务器名称转储到server.json中,并将其用作作业选项中的远程URL," target。"用户从结果下拉列表中选择任何服务器,Run Deck调用结果$ {option.target}。
从那里,我创建了一个内联脚本并传递了$ {option.target}作为args:
#!/bin/env bash
OPTION_TARGET="$@"
sudo bash -c "cd /opt/some/directory/bin ; ./script.sh servers=${OPTION_TARGET}"
So Run Deck最终在已经标记的节点上发送./script.sh foo bar baz quux
,问题解决了。有意义吗?
对不起线程坏死,但我的解决方案似乎密切相关。
答案 3 :(得分:0)
你需要安装rundeck-cli命令行工具'rd',它取代了Istvan提到的dispatch命令。
I)。从https://rundeck.github.io/rundeck-cli/
安装$ wget https://bintray.com/rundeck/rundeck-rpm/rpm -O bintray.repo
$ sudo mv bintray.repo /etc/yum.repos.d/
$ sudo yum install rundeck-cli
sudo su - rundeck
mkdir .rd
vim .rd/rd.conf
根据您的设置添加相似的行:
-bash-4.2$ cat rd.conf
export RD_URL=http://localhost:4440
export RD_USER=admin
export RD_PASSWORD=admin
II)。创建两个Rundeck作业Job1和Job2。两者都有两个步骤:
Job1:步骤1.1 针对节点集的一些操作,由标签或列表定义的option.target(将传递给步骤2.1)
比下一步将是“工作流程步骤”/“作业参考”类型,将“运行方式”设置为“工作流程步骤”。这将是另一个工作,对localhost运行,并将在本地运行rundeck服务器上的两个步骤。
Job1:步骤1.2 传递参数的'Workflow Step':-targetnodes“$ {option.target}”
Job2:Step 2.1 option.targetnodes
rd nodes --project {Your project name} --filter ${option.targetnodes} > /tmp/filtered.nodes
并且比某些脚本(例如scp一些文件到本地rundeck机器)迭代来自步骤1.1的一组节点
Job2:步骤2.2
#!/bin/bash
for remoteHost in $(cat /tmp/filtered.nodes | grep -v Nodes | grep -v -e '^[[:space:]]*$')
do
scp "$remoteHost":/tmp/"$remoteHost".users /tmp/
echo "$remoteHost".users copied
done
我这样做是因为在Rundeck中没有从远程复制到本地。