首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从java运行ansible-playbook

从java运行ansible-playbook
EN

Stack Overflow用户
提问于 2018-12-03 05:39:14
回答 2查看 6.1K关注 0票数 4

我一直试图使用Java (运行时().exec()和ProcessBuilder)运行anisble,在这两种情况下,我都看到我希望使用命令行传递的额外变量永远不会被执行。

代码语言:javascript
复制
ProcessBuilder builder = new ProcessBuilder("ansible-playbook", "/root/playbooks/script-ilo.yml", "-e", "'@/tmp/vars.yml'");

代码语言:javascript
复制
String[] ansible_run = {"ansible-playbook", "/root/playbooks/script-ilo.yml", "-e", "'@/tmp/vars.yml'"};
Process p = Runtime.getRuntime().exec(ansible_run,null);

我将代码打包为jar,并在测试系统中执行,在这两种情况下,ansible运行剧本并抛出一个错误。

代码语言:javascript
复制
# java -jar /home/admin/test-script.jar

PLAY [esxi] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.50.100]

TASK [Set XML with new secrets] ************************************************
fatal: [192.168.50.100]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'change_user' is undefined\n\nThe error appears to have been in '/root/playbooks/script-ilo.yml': line 3, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n  tasks:\n    - name: Set XML with new secrets\n      ^ here\n"}
        to retry, use: --limit @/root/playbooks/script-ilo.retry

PLAY RECAP *********************************************************************
192.168.50.100             : ok=1    changed=0    unreachable=0    failed=1

当我在shell中运行命令ansible-playbook /root/playbooks/script-ilo.yml -e '@/tmp/vars.yml'时,它运行得非常完美。

我需要帮助解除这里的封锁。如果有更好的方法来做这件事,我会全神贯注的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-03 06:09:02

String[] ansible_run = {"ansible-playbook", "/root/playbooks/script-ilo.yml", "-e", "'@/tmp/vars.yml'"};

不要将单引号放在-e值中;单引号仅用于shell,但ProcessBuilder不需要遍历shell,因此不需要转义参数。

实际上,当我给它喂食一个公然伪造的-e时,我还以为ansible会发牢骚,但是事实证明,任何这样的值都会以_raw_params的形式传递给hostvars,所以在您的例子中,它会设置如下的值:

代码语言:javascript
复制
"hostvars": {
    "192.168.50.100": {
        "_raw_params": "'@/tmp/vars.yml'",
票数 3
EN

Stack Overflow用户

发布于 2020-12-14 10:30:52

我也面临过类似的问题,并使用以下方法解决了这个问题

代码语言:javascript
复制
ProcessBuilder builder = new ProcessBuilder("ansible-playbook", "/etc/ansible/playbooks_vmware/diskadd1.yaml","-e","vm_name=web04 addSizeInGB=40 scsi=0 unit_number=1");
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53588058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档