Я пытался запустить anisble-playbooks с помощью Java (runtime (). Exec () и ProcessBuilder), и в обоих случаях я вижу, что дополнительные переменные, которые я хочу передать с помощью командной строки, никогда не выполняются, или так кажется.
ProcessBuilder builder = new ProcessBuilder("ansible-playbook", "/root/playbooks/script-ilo.yml", "-e", "'@/tmp/vars.yml'");
и
String[] ansible_run = {"ansible-playbook", "/root/playbooks/script-ilo.yml", "-e", "'@/tmp/vars.yml'"};
Process p = Runtime.getRuntime().exec(ansible_run,null);
Я упаковал код как банку и запустил в тестовой системе, и в обоих случаях ansible запускает playbook и выдает ошибку.
# 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
Когда я запускаю команду ansible-playbook /root/playbooks/script-ilo.yml -e '@/tmp/vars.yml'
в оболочке он работает идеально.
Мне нужна помощь с разблокировкой здесь. Если есть лучший способ сделать это, я все слышу.




String[] ansible_run = {"ansible-playbook", "/root/playbooks/script-ilo.yml", "-e", "'@/tmp/vars.yml'"};
Не помещайте это значение -e в одинарные кавычки; одинарные кавычки нужны только для вашей оболочки, но ProcessBuilder не проходит через вашу оболочку, поэтому аргументы не нужно экранировать.
На самом деле я ожидал, что ansible будет ныть, когда скармливал ему явно поддельный -e, но оказалось, что любое такое значение передается в hostvars как _raw_params, поэтому в вашем случае оно установило бы такое значение, как:
"hostvars": {
"192.168.50.100": {
"_raw_params": "'@/tmp/vars.yml'",
Я столкнулся с аналогичной проблемой и решил ее, используя следующие
ProcessBuilder builder = new ProcessBuilder("ansible-playbook", "/etc/ansible/playbooks_vmware/diskadd1.yaml","-e","vm_name=web04 addSizeInGB=40 scsi=0 unit_number=1");
вот и все! глупый
' 'испортил мне весь вечер.