Запуск ansible-playbook из java

Я пытался запустить 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' в оболочке он работает идеально.

Мне нужна помощь с разблокировкой здесь. Если есть лучший способ сделать это, я все слышу.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
0
4 653
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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'",

вот и все! глупый ' ' испортил мне весь вечер.

blo0old 03.12.2018 07:24

Я столкнулся с аналогичной проблемой и решил ее, используя следующие

ProcessBuilder builder = new ProcessBuilder("ansible-playbook", "/etc/ansible/playbooks_vmware/diskadd1.yaml","-e","vm_name=web04 addSizeInGB=40 scsi=0 unit_number=1");

Другие вопросы по теме