Rundeck如何将机器列表传递给脚本?

时间:2015-06-18 10:02:59

标签: rundeck

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

Rundeck工作要求(例如:Observium)

  1. 选择了“调度到节点”选项但仅选择了一台目标机器(Observium机器)。
  2. 尽管只在一台机器上运行作业,但如果Rundeck允许选择脚本所需的多台机器,那将是很好的。注意,脚本不应该在所有节点上运行,它只应该在单个远程机器上运行,但脚本需要机器列表。 [如何做到这一点?]
  3. 该脚本可以访问机器列表作为参数。 [如何做到这一点?]
  4. 如果上面已经到位,则脚本只在一台机器上运行并遍历机器列表 ==>例如,它运行/opt/observium/add_device.php v2c @node.name@ ${varSNMPCommunity}
  5. 我没有足够的声誉在这篇文章中包含图片。请使用以下链接查看流程图。

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

4 个答案:

答案 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中没有从远程复制到本地。