#bash #rundeck
#баш #rundeck
Вопрос:
Спасибо, что нашли время, чтобы прочитать этот вопрос.
У меня возникли проблемы с запуском скриптов в Rundeck. Имея следующий пример:
#!/bin/bash
SERVICE=$(whereis -b service | awk '{ print $2 }')
MDBC="/etc/mongod.conf"
CHECK=$(ps axu | grep mongod | grep -v grep | wc -l)
if [ $CHECK -eq 0 ]; then
echo "Restarting MongoDB"
$(which mongod) -f $MDBC
if [ $? -ne 0 ]; then
echo "Restart failed. Trigger this job manually."
else
echo "Service restarted."; fi
else
echo "Service is up and running!"; fi
Запуск локально на сервере дает ожидаемый результат:
sudo bash -x test.sh
whereis -b service
awk '{ print $2 }'
SERVICE=/sbin/service
MDBC=/etc/mongod.conf
grep -v grep
wc -l
grep mongod
ps axu
CHECK=0
'[' 0 -eq 0 ']'
echo 'Restarting MongoDB'
Restarting MongoDB
which mongod
/usr/bin/mongod -f /etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 84141
child process started successfully, parent exiting
'[' 0 -ne 0 ']'
echo 'Service restarted.'
Service restarted.
Запуск того же кода, что и параметр script в Rundeck, приводит к следующему:
awk '{ print $2 }'
whereis -b service
SERVICE=/sbin/service
MDBC=/etc/mongod.conf
grep -v grep
ps axu
wc -l
grep mongod
CHECK=3
'[' 3 -eq 0 ']'
echo 'Service is up and running!'
Service is up and running!
Как вы можете видеть, в первом выводе результат для переменной CHECK
равен 0, поскольку процессы MongoDB не запущены.
Второй вывод принимает за 3 значение для CHECK
, следовательно, if
условие завершается немедленно.
Моя версия Rundeck — это версия с открытым исходным кодом 3.3.5
Есть какие-нибудь советы?
Комментарии:
1. На этапе написания сценария вы определили «Строку вызова» (как
/bin/bash
) и «Расширение файла» (как.sh
)? (оба доступны при нажатии на кнопку «Дополнительно»).2. Привет @MegaDrive68k спасибо за вашу помощь! Да, я ввел эти значения, и результат точно такой же.
Ответ №1:
Тестирование вашего скрипта кажется, что строка — ps axu | grep mongodb | grep -v grep | wc -l
не лучший способ проверить, запущен ли процесс, например, запуск одной строки работает как шарм, но вызывается с шага сценария rundeck, создается другой процесс (bash) с именем «mongodb», на который ссылаются следующим образом (генерируя двастроки и всегда выходящие):
user 112156 0.0 0.0 2596 752 pts/1 S 18:09 0:00 sh myscript.sh
user 112166 0.1 0.2 754928 48196 pts/1 Sl 18:09 0:00 /path/to/mongodb/binary
Возможно, лучшим способом определить вашу службу для ее перезапуска было бы что-то вроде (конечно, вы можете ее улучшить):
#!/bin/bash
service docker status | grep 'active (running)' > /dev/null 2>amp;1
if [ $? != 0 ]
then
echo "restarting docker"
sudo service docker restart > /dev/null
echo "docker restarted"
else
echo "docker service is running"
fi
Выглядит так в определении задания Rundeck:
<joblist>
<job>
<defaultTab>nodes</defaultTab>
<description></description>
<executionEnabled>true</executionEnabled>
<id>927d0085-c4f8-45c9-ba2c-01575b167c76</id>
<loglevel>DEBUG</loglevel>
<name>RestartService</name>
<nodeFilterEditable>false</nodeFilterEditable>
<plugins />
<scheduleEnabled>true</scheduleEnabled>
<sequence keepgoing='false' strategy='node-first'>
<command>
<fileExtension>.sh</fileExtension>
<script><![CDATA[#!/bin/bash
service docker status | grep 'active (running)' > /dev/null 2>amp;1
if [ $? != 0 ]
then
echo "restarting docker"
sudo service docker restart > /dev/null
echo "docker restarted"
else
echo "docker service is running"
fi]]></script>
<scriptargs />
<scriptinterpreter>/bin/bash</scriptinterpreter>
</command>
</sequence>
<uuid>927d0085-c4f8-45c9-ba2c-01575b167c76</uuid>
</job>
</joblist>
Лучше, если вы установите сервис в качестве опции:
<joblist>
<job>
<context>
<options preserveOrder='true'>
<option name='service' value='docker' />
</options>
</context>
<defaultTab>nodes</defaultTab>
<description></description>
<executionEnabled>true</executionEnabled>
<id>927d0085-c4f8-45c9-ba2c-01575b167c76</id>
<loglevel>DEBUG</loglevel>
<name>RestartService</name>
<nodeFilterEditable>false</nodeFilterEditable>
<plugins />
<scheduleEnabled>true</scheduleEnabled>
<sequence keepgoing='false' strategy='node-first'>
<command>
<fileExtension>.sh</fileExtension>
<script><![CDATA[#!/bin/bash
service @option.service@ status | grep 'active (running)' > /dev/null 2>amp;1
if [ $? != 0 ]
then
echo "restarting @option.service@"
sudo service @option.service@ restart > /dev/null
echo "@option.service@ restarted"
else
echo "docker service is running"
fi]]></script>
<scriptargs />
<scriptinterpreter>/bin/bash</scriptinterpreter>
</command>
</sequence>
<uuid>927d0085-c4f8-45c9-ba2c-01575b167c76</uuid>
</job>
</joblist>
Оба задания протестированы и работают, не стесняйтесь использовать или изменять их.
Конечно, для перезапуска процессов вам нужны sudo
права доступа, и этот плагин был бы полезен, если служба сосуществует с Rundeck на том же сервере (это исполнитель узла / копировщик файлов) или проверьте это, если речь идет о внешнем сервере.
Комментарии:
1. Спасибо за ваш ответ. Разве это не ошибка Rundeck? Я имею в виду, почему Rundeck создает другой процесс с именем mongodb? Насколько я понимаю, rundeck отправляет скрипт как
script
имя… Я изменил строку, следуя вашей логике, и работал, но странно, почему Rundeck не может обработать логику из первого примера.2. На самом деле это не ошибка, если вы запустите скрипт вручную с тем же именем процесса, эта проблема возникает (и вы увидите две строки «MongoDB» в момент проверки процесса), возможно, rundeck внутренне делает то же самое (вызов bash, содержащий команду mongodb и команду mongodbсамо по себе). Я рад знать, что это решено!