Как мне получить выходные данные из одного шага Rundeck, чтобы использовать их на следующем шаге?
Я пытаюсь собрать, запустить и связать набор Docker-контейнеров с помощью Rundeck. Короче говоря (для тех, кто не знаком с докером), когда изображение запускается, оно возвращает идентификатор контейнера. Я хотел бы использовать этот идентификатор контейнера при запуске последующих заданий.
При запуске из командной строки это будет выглядеть примерно так (только пример!):
# docker run -Pd 23ABCD45
34DEF123
# docker run -Pd --link 34DEF123:host1 ABC123EF
321CB456
(обратите внимание на использование первого возвращаемого значения во второй командной строке)
На этом этапе будут работать два контейнера. Второй будет связан с первым --link
вариант, и он будет адресован с помощью имени хоста host1 из второго контейнера. Чтобы быть справедливым, Docker генерирует (или может быть дано) конкретное имя контейнера, которое можно использовать вместо идентификатора контейнера. Я бы предпочел использовать идентификатор контейнера, чтобы избежать необходимости создавать / отслеживать уникальные имена.
Я хотел бы иметь возможность захватить вывод первой команды (идентификатор контейнера), чтобы его можно было повторно использовать во второй команде. Это возможно?
Редактировать: Эти изображения используются для тестирования сразу после "сборки докера" (которая также выводит аналогичный идентификатор, который я хотел бы включить в мою цепочку) и может сопровождаться командами "docker rm" и "docker rmi", поэтому Есть ряд применений для захвата этого типа выходных данных и проведения его через связанный набор операций. Это не только запуск / связывание контейнеров.
1 ответ
Не существует прямой реализации Rundeck, которая позволяла бы передавать выходные данные с одного задания на другое в качестве входных данных, но есть обходные пути, которые я пробовал в прошлом, и я остановился на втором подходе.
1. Используйте файл для передачи данных
- Сохраните ID/ вывод в файл tmp в первом задании
- Вторая работа прочитать этот файл
Все может пойти не так, потому что вы зависите от файла, но хороший код может улучшиться.
2. Вызовите два задания с помощью CLI Rundeck из другого задания.
Это подход, который я использую.
JobA распечатывает два случайных числа.
echo $RANDOM;echo $RANDOM
JobB распечатывает второе случайное число, произведенное из JobA, которое передается как опция "число"
echo "$RD_OPTION_NUMBER is the number JobB received"
JobC вызывает первую работу, сохраняет последнюю строку в переменную и передает ее в JobB
#!/bin/bash
OUTPUT_FROM_JOB_A=`run -f --id <ID of JobA> | tail -n 1`
run -f --id <ID of JobB> -- -number $OUTPUT_FROM_JOB_A
Выход:
[5394] execution status: succeeded
Job execution started:
[5395] JobB <https://hostname:4443/project/Project/execution/show/5395>
6186 is the number JobB received
[5395] execution status: succeeded
Это просто примитивный пример кода. Вы можете сделать много с подпроцессом Python или просто использовать Bash.