Rundeck 如何将机器列表传递给脚本?
How can Rundeck pass a list of machines to the script?
我目前正在探索 Runddeck,以便同时管理 100 台 VM。 Rundeck 是一个非常有用的工具,可以同时在多台机器上 运行 脚本/命令(每个脚本都被传递到远程机器,然后在本地执行)。但是我想知道是否有一种方法可以实现以下系统管理方案。
Rundeck 工作要求(例如:天文台)
- "Dispatch to Nodes" 选项 selected 但只有一台目标机器 selected(Observium 机器)。
- 尽管 运行 只在一台机器上运行该作业,但如果 Rundeck 允许 select 脚本需要的多台机器,那就太好了。请注意,脚本不应该在所有节点上都是 运行,它只应该在单个远程机器上是 运行,但脚本需要机器列表。 [如何做到这一点?]
- 脚本作为参数访问机器列表。 [如何做到这一点?]
- 如果上面的内容到位,则脚本 运行 仅在一台机器上运行并遍历机器列表
==> 例如,它 运行s
/opt/observium/add_device.php v2c @node.name@ ${varSNMPCommunity}
我的声誉不足,无法在此 post 中包含图像。请使用下面的link查看流程图。
https://www.dropbox.com/s/2zt4r9trulpsaqx/RundeckObservium.png?dl=0
与其在一个节点上使用脚本 运行 来获取机器列表,不如尝试使用节点过滤器来查看是否可以让 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 User Guide - Option model provider
如果这不是可行的方法,您可能需要考虑使用其他工具,例如 Jenkins。
如果你想 运行 你的脚本在你的 运行deck 机器上并且脚本将对目标机器进行远程 ssh,那么你必须 select 本地机器在 运行 甲板上。然后在脚本中可以调用运行deck来为项目下发机器列表。
例如在 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.
的那些节点的列表
我只需要为类似的目的创建一个作业 - 在远程节点上执行脚本,但将任意数量的服务器传递给该脚本。我将所有目标服务器名称转储到 server.json 中,并将其用作作业选项中的远程 URL,"target." 用户从结果下拉列表中选择任何服务器,并且 运行 Deck 调用结果 ${option.target}.
从那里,我创建了一个内联脚本并将 ${option.target} 作为参数传递:
#!/bin/env bash
OPTION_TARGET="$@"
sudo bash -c "cd /opt/some/directory/bin ; ./script.sh servers=${OPTION_TARGET}"
所以 运行 Deck 最终在我已经标记的节点上调度 ./script.sh foo bar baz quux
,问题就解决了。有道理吗?
抱歉线程死机了,但我的解决方案似乎很贴切。
您需要安装 运行deck-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。两者都有两个步骤:
作业 1:步骤 1.1
针对标签或列表定义的一组节点 option.target 的某些操作(将传递到步骤 2.1)
下一步将是 'Workflow Steps'/'Job Reference' 类型,'Run as a' 设置为工作流程步骤。这将是另一项工作,针对本地主机 运行 并且 运行 也将在本地 运行deck 服务器上执行两个步骤。
作业 1:步骤 1.2
'Workflow Step' 传递参数:-targetnodes "${option.target}"
作业 2:步骤 2.1
option.target节点
rd nodes --project {Your project name} --filter ${option.targetnodes} > /tmp/filtered.nodes
并且比一些脚本(例如 scp 一些文件到本地 运行deck 机器)迭代步骤 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 中缺少从远程到本地的复制。
我目前正在探索 Runddeck,以便同时管理 100 台 VM。 Rundeck 是一个非常有用的工具,可以同时在多台机器上 运行 脚本/命令(每个脚本都被传递到远程机器,然后在本地执行)。但是我想知道是否有一种方法可以实现以下系统管理方案。
Rundeck 工作要求(例如:天文台)
- "Dispatch to Nodes" 选项 selected 但只有一台目标机器 selected(Observium 机器)。
- 尽管 运行 只在一台机器上运行该作业,但如果 Rundeck 允许 select 脚本需要的多台机器,那就太好了。请注意,脚本不应该在所有节点上都是 运行,它只应该在单个远程机器上是 运行,但脚本需要机器列表。 [如何做到这一点?]
- 脚本作为参数访问机器列表。 [如何做到这一点?]
- 如果上面的内容到位,则脚本 运行 仅在一台机器上运行并遍历机器列表
==> 例如,它 运行s
/opt/observium/add_device.php v2c @node.name@ ${varSNMPCommunity}
我的声誉不足,无法在此 post 中包含图像。请使用下面的link查看流程图。
https://www.dropbox.com/s/2zt4r9trulpsaqx/RundeckObservium.png?dl=0
与其在一个节点上使用脚本 运行 来获取机器列表,不如尝试使用节点过滤器来查看是否可以让 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 User Guide - Option model provider
如果这不是可行的方法,您可能需要考虑使用其他工具,例如 Jenkins。
如果你想 运行 你的脚本在你的 运行deck 机器上并且脚本将对目标机器进行远程 ssh,那么你必须 select 本地机器在 运行 甲板上。然后在脚本中可以调用运行deck来为项目下发机器列表。 例如在 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.
的那些节点的列表我只需要为类似的目的创建一个作业 - 在远程节点上执行脚本,但将任意数量的服务器传递给该脚本。我将所有目标服务器名称转储到 server.json 中,并将其用作作业选项中的远程 URL,"target." 用户从结果下拉列表中选择任何服务器,并且 运行 Deck 调用结果 ${option.target}.
从那里,我创建了一个内联脚本并将 ${option.target} 作为参数传递:
#!/bin/env bash
OPTION_TARGET="$@"
sudo bash -c "cd /opt/some/directory/bin ; ./script.sh servers=${OPTION_TARGET}"
所以 运行 Deck 最终在我已经标记的节点上调度 ./script.sh foo bar baz quux
,问题就解决了。有道理吗?
抱歉线程死机了,但我的解决方案似乎很贴切。
您需要安装 运行deck-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。两者都有两个步骤:
作业 1:步骤 1.1 针对标签或列表定义的一组节点 option.target 的某些操作(将传递到步骤 2.1)
下一步将是 'Workflow Steps'/'Job Reference' 类型,'Run as a' 设置为工作流程步骤。这将是另一项工作,针对本地主机 运行 并且 运行 也将在本地 运行deck 服务器上执行两个步骤。
作业 1:步骤 1.2 'Workflow Step' 传递参数:-targetnodes "${option.target}"
作业 2:步骤 2.1 option.target节点
rd nodes --project {Your project name} --filter ${option.targetnodes} > /tmp/filtered.nodes
并且比一些脚本(例如 scp 一些文件到本地 运行deck 机器)迭代步骤 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 中缺少从远程到本地的复制。