2015-06-18 2 views
1

В настоящее время я изучаю Runddeck для управления несколькими 100 виртуальными машинами. Rundeck - очень полезный инструмент для запуска скриптов/команд на нескольких компьютерах в то время (каждый скрипт передается на удаленный компьютер, а затем выполняется локально). Однако мне интересно, есть ли способ реализовать следующий сценарий администрирования системы.Как Rundeck может передать список машин сценарию?

Rundeck работа ТРЕБОВАНИЯ (пример: Observium)

  1. "Отправка в Узлы" вариант выбрана, но только одна целевой машина выбрана (Observium машины).
  2. Несмотря на выполнение задания только на одной машине, было бы замечательно, если Rundeck позволяет выбирать несколько машин, которые требуется сценарию. Обратите внимание: сценарий не должен запускаться на всех узлах, он должен быть запущен только на одном удаленном компьютере, но для сценария требуется список машин. [Как это можно сделать?]
  3. Сценарий получает доступ к списку машин в качестве параметра. [Как это можно сделать?]
  4. Если выше на месте, сценарий затем запускается только на одну машину и итерацию по списку машин ==> Например, он работает /opt/observium/add_device.php v2c @[email protected] ${varSNMPCommunity}

Я не хватает репутации включить изображения в этот пост. Пожалуйста, используйте приведенную ниже ссылку, чтобы увидеть блок-схему.

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

ответ

1

Если вы хотите запустить свой скрипт на своей машине rundeck, и скрипт выполнит удаленный ssh ​​непосредственно на целевые машины, тогда вам нужно выбрать локальный компьютер только в rundeck. Затем в скрипте вы можете вызвать rundeck для доставки списка машин для проекта. , например.в Баше вы можете сделать на следующем

#!/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, которые имеют набор тегов для приложения.

+0

Это выглядит очень перспективно. Сейчас у меня нет экземпляра Rundeck, и поэтому я не могу проверить, но этот ответ, скорее всего, решит проблему. – quat

1

Вместо того, чтобы иметь сценарий запуска на одном узле, чтобы получить список машин, попробуйте использовать фильтр узла, чтобы увидеть, если вы можете иметь Rundeck определить целевые узлы из тега. Это будет зависеть от того, как ваш проект настроен на приобретение ресурсов.

Например, если вы используете теги, вы можете захотеть иметь тег, который соответствует вашему состоянию. Предположим, вы хотите найти машины, которые соответствуют созданному тегу, который называется RebootPending. Вы можете использовать это как фильтр узла задания для отправки команды перезагрузки этим узлам.

Другим возможным вариантом может быть то, что ваш скрипт второго шага выдает файл в формате JSON на веб-сервер. Затем вы можете настроить свое задание 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} 

Используя эти настройки, вы можете иметь удаленный веб-страницу (например, выход вашего скрипта) определить целевые узлы. Обратите внимание, что формат JDON RunDeck специфичен и не сообщает о ошибках чтения. Обратите особое внимание на Rundeck User Guide - Option model provider

Если это не жизнеспособный подход, возможно, вам придется рассмотреть возможность использования другого инструмента, такого как Дженкинс.

1

Мне просто нужно было создать задание для аналогичной цели - выполнить скрипт на удаленном узле, но передать этому скрипту произвольное количество серверов. Я сбросил все имена целевого сервера в server.json и использую это как удаленный URL-адрес в опции задания «target». Пользователь выбирает все серверы из выпадающего списка, а Run Deck вызывает результаты $ {option.target}.

Оттуда я создал встроенный сценарий и передал $ {option.target} в качестве аргументов:

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

Так Run Deck в конечном счете посылает ./script.sh foo bar baz quux на узле я уже помеченным, и проблема решена. Имеют смысл?

Извините за резьбу necro, но мое решение казалось родным.

0

Вам необходимо установить инструмент командной строки rundeck-cli 'rd', который заменил команду отправки, упомянутую Istvan.

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)

, чем следующий шаг будет «Workflow Steps '/' Job Reference ', при этом «Run as a» установлен на Step Workflow. Это будет другая работа, которая будет выполняться против localhost и будет выполняться также на двух шагах, но на сервере rundeck, локально.

Job1: Шаг 1,2 'Workflow Шаг' с аргументом передается: -targetnodes "$ {option.target}"

Job2: Шаг 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.