У меня проблемы с запуском сценария запуска удаленного приложения "отдельно" от Ansible playbook. Скрипт запустится, но я не могу заставить его остаться / отстраненным. Я, наверное, что-то делаю не так, но что?
Вот мой репродуктор.
Мое удаленное 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 выходных сообщений и затем завершается).
Мой исполняемый скрипт оболочки (как в chmod 755), выполняющий это приложение, выглядит следующим образом:
#!/bin/bash java Test &
Выполнение этого вручную также прекрасно: приложение Java запускается и генерирует тот же стандартный вывод в моей консоли, но сценарий оболочки завершился, и я снова стал контролировать мой сеанс bash.
Теперь, чтобы запустить его через 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