我无法从 Ansible 剧本“分离地”运行远程应用程序启动脚本。脚本将运行,但我无法让它获得/保持分离。我可能做错了什么,但什么?
这是我的复制器。
我在 Test.java 中的远程 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);
}
} } }
Run Code Online (Sandbox Code Playgroud)将其编译为 Test.class (javac Test.java),然后使用“java Test”运行该类按预期工作(给出 10 条输出消息,然后退出)。
我运行此应用程序的可执行 shell 脚本(如在 chmod 755 中)如下所示:
#!/bin/bash
java Test &
Run Code Online (Sandbox Code Playgroud)手动运行它也完全没问题:Java 应用程序在我的控制台中运行并生成相同的标准输出,但 shell 脚本已经退出,我重新控制了我的 bash 会话。
现在通过来自另一台服务器的 ansible playbook 运行它。我尝试以不同的方式使用“command”模块和“shell”模块,但无济于事......
--- …
Run Code Online (Sandbox Code Playgroud)我编写了这个 ansible 任务来在远程流浪盒上运行一个进程。(嗯,实际上 ansible 文件本身要长得多,但这是一个只运行启动脚本的复制器。)
---
- hosts: myappname_server
vars_files:
- install_myappname_vars.yaml
gather_facts: false
sudo: true
sudo_user: "{{ project_name }}"
tasks:
- name: Restart application
command: "{{ project_target_dir_env }}/run"
args:
chdir: "{{ project_target_dir_env }}"
Run Code Online (Sandbox Code Playgroud)
它适用于包含的 vars 文件中的这些 vars:
---
project_name: myappname
project_source_dir_files: files/myappname
project_source_dir_env: "{{ project_source_dir_files }}/environment_files"
project_target_root: /home/myappname
project_target_dir_env: "{{ project_target_root }}/bin"
Run Code Online (Sandbox Code Playgroud)
这个想法是在远程框上使用用户“myappname”(由“myappname_server”正确别名,我运行的其他播放效果很好)在将目录更改为“/”后运行“/home/myappname/bin/run”家/我的应用程序名称/bin”。如果我手动执行此操作,一切正常,即目录存在,文件可读,脚本工作等,一切都很好。但是如果我执行脚本,生成的ansible 执行代码似乎有问题。是我和我的配置希望如此)?它是 ansible 吗?
我用 -vvvv 运行它以获取大量信息:
monsterkill@monsterkill-ub-dt:~/playbooks$ ansible-playbook install_myappname_restart.yaml -vvvv
PLAY [myappname_server] **********************************************************
TASK: [Restart application] ***************************************************
<vagrant1> ESTABLISH CONNECTION FOR USER: vagrant
<vagrant1> …
Run Code Online (Sandbox Code Playgroud)