Rundeck различные сценарии запуска вывода

#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само по себе). Я рад знать, что это решено!