1

我目前正在探索 Runddeck 来管理几个 100 台虚拟机。Rundeck 是一个非常有用的工具,可以同时在多台机器上运行脚本/命令(每个脚本都被传递到远程机器,然后在本地执行)。但是我想知道是否有一种方法可以实现以下系统管理方案。

Rundeck 工作要求(例如:Observium)

  1. 选择了“分派到节点”选项,但只选择了一台目标机器(Observium 机器)。
  2. 尽管只在一台机器上运行该作业,但如果 R​​undeck 允许选择多台机器,这将是非常棒的,这是脚本需要的。请注意,脚本不应该在所有节点上运行,它只应该在单个远程机器上运行,但脚本需要机器列表。[这怎么可能?]
  3. 该脚本可以作为参数访问机器列表。[这怎么可能?]
  4. 如果上述内容到位,则脚本仅在一台机器上运行并遍历机器列表 ==> 例如,它运行/opt/observium/add_device.php v2c @node.name@ ${varSNMPCommunity}

我没有足够的声誉在这篇文章中包含图片。请使用下面的链接查看流程图。

https://www.dropbox.com/s/2zt4r9trulpsaqx/RundeckObservium.png?dl=0

4

4 回答 4

1

与其让脚本在一个节点上运行来获取机器列表,不如尝试使用节点过滤器来查看是否可以让 RunDeck 从标签中确定目标节点。这将取决于您的项目如何配置为获取资源。

例如,如果您使用标签,那么您可能希望有一个符合您的条件的标签。假设您要查找与您创建的名为RebootPending. 您可以将其用作作业的节点过滤器,以向这些主机发送重启命令。

另一个可能的选择可能是让您的第 2 步脚本将 JSON 格式的文件输出到 Web 服务器。然后,您可以使用读取此远程 URL(可能是主机列表)的选项配置您的 RD 作业,然后根据该列表执行操作。作业选项和节点过滤器可以这样配置:

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 用户指南 - 选项模型提供者

如果这不是一种可行的方法,您可能需要考虑使用不同的工具,例如 Jenkins。

于 2015-06-21T08:09:03.690 回答
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 的那些节点的列表。

于 2016-06-02T10:37:04.447 回答
1

我只需要为类似目的创建一个作业 - 在远程节点上执行一个脚本,但将任意数量的服务器传递给该脚本。我在 server.json 中转储了所有目标服务器名称,并将其用作作业选项“目标”中的远程 URL。用户从结果下拉列表中选择任何服务器,Run Deck 调用结果 ${option.target}。

从那里,我创建了一个内联脚本并将 ${option.target} 作为参数传递:

#!/bin/env bash 
OPTION_TARGET="$@" 
sudo bash -c "cd /opt/some/directory/bin ; ./script.sh servers=${OPTION_TARGET}"

所以 Run Deck 最终./script.sh foo bar baz quux在我已经标记的节点上调度,并且问题解决了。说得通?

对不起线程坏死,但我的解决方案似乎密切相关。

于 2016-07-08T18:51:37.293 回答
0

您需要安装 rundeck-cli 命令行工具“rd”,它取代了 Istvan 提到的调度命令。

我)。从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

二)。创建两个 Rundeck 作业 Job1 和 Job2。两者都将有两个步骤:

Job1:Step 1.1 针对一组节点 option.target 由标签或列表定义的一些操作(将传递给 Step 2.1)

下一步将是“工作流程步骤”/“工作参考”类型,“运行方式”设置为工作流程步骤。这将是另一项工作,针对 localhost 运行,并且还将运行两个步骤,但在本地 rundeck 服务器上。

Job1:Step 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 迭代一组节点

工作2:步骤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 中缺少从远程到本地的复制。

于 2018-02-02T16:37:10.473 回答