Запустите удаленный скрипт / приложение в автономном режиме в Ansible

32495
SadBunny

У меня проблемы с запуском сценария запуска удаленного приложения «отдельно» от Ansible playbook. Скрипт запустится, но я не могу заставить его остаться / отстраненным. Я, наверное, что-то делаю не так, но что?

Вот мой репродуктор.

  1. Мое удаленное Java-приложение в Test.java работает в течение 10 секунд:

    class Test { public static void main(String[] args) { for (int I = 1; I <= 10; i++) { System.out.println("Hello world " + I);  try { Thread.sleep(1000); } catch (Exception e) { System.out.println("Exception caught: " + e); } } } } 

Компилируя это в Test.class (javac Test.java), затем запуск этого класса с «java Test» работает как положено (дает 10 выходных сообщений и затем завершается).

  1. Мой исполняемый скрипт оболочки (как в chmod 755), выполняющий это приложение, выглядит следующим образом:

    #!/bin/bash java Test & 

Выполнение этого вручную также прекрасно: приложение Java запускается и генерирует тот же стандартный вывод в моей консоли, но сценарий оболочки завершился, и я снова стал контролировать мой сеанс bash.

  1. Теперь, чтобы запустить его через ANSIBLE playbook с другого сервера. Я пытался использовать модуль «команда» и модуль «оболочка» по-разному, но безрезультатно ...

    --- - hosts: vagrant1 gather_facts: false  tasks: - debug: msg="Running test app through Ansible shell module..."  - name: Start application shell: "/tmp/test.sh" args: chdir: "/tmp" executable: "/bin/bash"  - debug: msg="Running test app through Ansible command module..."  - name: Start application command: "nohup /tmp/test.sh &" args: chdir: "/tmp" 

Все это работает просто отлично, то есть запускается скрипт оболочки, приложение Java запускается и делает свое дело (т.е. запускается в течение 10 секунд, генерирует выходные данные и завершает работу). Но ansible-playbook работает до тех пор, пока приложение Java не завершит работу, а затем возвращает выходные данные, сгенерированные приложением Java. Почему бы просто не отсоединить скрипт оболочки и закончить playbook?

Вывод ansible-playbook:

 monsterkill@monsterkill-ub-dt:~/playbooks$ ansible-playbook testrun.yaml -v  PLAY [vagrant1] ***************************************************************   TASK: [debug msg="Running test app through Ansible shell module..."] **********  ok: [vagrant1] => { "msg": "Running test app through Ansible shell module..." }  TASK: [Start application] *****************************************************  changed: [vagrant1] => {"changed": true, "cmd": " /tmp/test.sh ", "delta": "0:00:10.052927", "end": "2015-01-29 00:14:43.327418", "rc": 0, "start": "2015-01-29 00:14:33.274491", "stderr": "", "stdout": "Hello world 1\nHello world 2\nHello world 3\nHello world 4\nHello world 5\nHello world 6\nHello world 7\nHello world 8\nHello world 9\nHello world 10"}  TASK: [debug msg="Running test app through Ansible command module..."] ********  ok: [vagrant1] => { "msg": "Running test app through Ansible command module..." }  TASK: [Start application] *****************************************************  changed: [vagrant1] => {"changed": true, "cmd": ["nohup", "/tmp/test.sh", "&"], "delta": "0:00:10.045643", "end": "2015-01-29 00:14:53.557164", "rc": 0, "start": "2015-01-29 00:14:43.511521", "stderr": "nohup: ignoring input", "stdout": "Hello world 1\nHello world 2\nHello world 3\nHello world 4\nHello world 5\nHello world 6\nHello world 7\nHello world 8\nHello world 9\nHello world 10"}  PLAY RECAP ********************************************************************  vagrant1 : ok=4 changed=2 unreachable=0 failed=0 
6

3 ответа на вопрос

13
user1338062

Just use an asynchronous action with poll: 0:

- command: yourscript.sh async: 45 poll: 0 

These options are needed to prevent ansible from killing the child processes of that task with os.killpg.

Then in yourscript.sh:

java Test & disown 

disown removes the process from job table, so SIGHUP does not get sent to it. nohup does the same, but is not necessary.

Edit: Note that disown is not available in all shells (eg. dash)

Привет, что нужно сделать, чтобы выполнить команду неопределенно в фоновом режиме, а не блокировать ansible? Опция async позволяет скрипту запускаться только в течение 45 секунд, а затем завершает его. Я хочу запускать команду на неопределенный срок. Я уже использую команду и опцию nohup, но команда завершает работу в тот момент, когда истекло время асинхронизации. Я установил опрос на 0 Mrunal Gosar 8 лет назад 0
Привет, я сталкиваюсь с той же проблемой, и асинхронные задачи работают хорошо. Тем не менее, я не нашел четкого объяснения, также, я не нашел часть кода ansible, которая убивает дочерний процесс. Любая помощь ? Kassav' 6 лет назад 0
5
SadBunny

The google servers must be smoking by now, but I found a solution. When I realized Ansible executes all its remote commands through separate ssh calls, I tested by doing that manually from the ansible server and found that it has to do with ssh functionality.

The answer is, apparently, to have the script that I called to do the double background trick, combined with a nohup to make it ignore hangup signals (SIGHUP) and combined with disconnecting the stdout and stderr streams. So, the remote startup script no longer does:

java Test & 

... but instead now does:

( ( nohup java Test 1>/dev/null 2>&1 ) & ) 

which does what I want. The ansible-playbook now fires up the remote script which in turn fires up the java application, but then double-backgrounds and nohups it and disconnects the output streams.

This stackoverflow thread helped me.

5
smiller171

Running your script as a Daemon with start-stop-daemon seems like a more elegant solution here. http://manpages.ubuntu.com/manpages/raring/man8/start-stop-daemon.8.html

- name: Start application shell: "start-stop-daemon --start --quiet --pidfile /var/run/test --exec /tmp/test.sh" args: executable: "/bin/bash" 
Пожалуйста, дайте всю необходимую информацию в своем ответе. Внешние ссылки отлично подходят для ссылок и дальнейшего чтения, но они не должны быть всего содержания вашего ответа. David Richerby 9 лет назад 0

Похожие вопросы