Ansible зависает при запуске сценария удаленного ожидания

Я создаю доступный сценарий для установки ispconfig без взаимодействия. Я использую сценарий для ispconfig интерактивной установки php. Я устанавливаю его на Ubuntu 14.04, используя apt-get версию expect и последнюю версию ansible.

Что случается, что после запуска ожидаемого скрипта ansible не возвращается.

Я использую следующий сценарий: ожидайте скрипт на github < / а>

Результат, который я получаю из ожидаемого файла журнала:

Stopping amavisd: amavisd-new.
Starting amavisd: amavisd-new.
 * Stopping ClamAV daemon clamd
   ...done.
 * Starting ClamAV daemon clamd
   ...done.
dovecot stop/waiting
dovecot start/running, process 30668
reload: Unknown instance:
 * Reloading nginx configuration nginx
   ...done.
Installation completed.
string detected

Когда я запускаю сценарий на удаленных хостах, он работает безупречно. Выполняя это через ansible, скрипт выполняется, но он не возвращается. Запуск ansible с параметром -v не показывает никакой информации журнала, пока ansible ожидает.

Соответствующая часть доступного скрипта:

  # as isconfig install is a interactive script we use expect to deal with that
  # by checking if ispconfig is present we make this an idempotent process  
  # if ispconfig absent the install will run
  - name: Check for installed ispconfig
    command: /usr/bin/test ! -e "/usr/local/ispconfig"
    register: ispconfig_absent
    ignore_errors: true

  - name: Copy expect script to configure ispconfig
    template: src=ispconfig.exp dest=/root/ispconfig.exp
    when: ispconfig_absent|success

  - name: set perm for script to configure ispconfig
    file: path=/root/ispconfig.exp mode=0750
    when: ispconfig_absent|success

  - name: configure ispconfig
    command: "/root/ispconfig.exp"
    when: ispconfig_absent|success

  - name: remove ispconfig configure script
    file: path=/root/ispconfig.exp state=absent
    when: ispconfig_absent|success

Выполнение ps aux показывает, что ожидаемый сценарий больше не работает. Доступный процесс ожидает возврата процесса.

Есть подсказки, что делать?


person waylander    schedule 01.06.2014    source источник
comment
У меня точно такая же проблема, вы нашли решение?   -  person codehitman    schedule 30.07.2014


Ответы (1)


Хорошо, похоже, что ansible не любит сценарий ожидания среди других. Итак, вот решение, которое сработало для меня (с примером):

- name: run the expect script which will interactively install crashplan
  command: expect install_crashplan.expect {{ crashplan_backup_drive }} chdir=/opt/CrashPlan_test/CrashPlan-install
  register: command_result
  failed_when: "'CrashPlan has been installed' not in command_result.stdout"

Если вы добавите правило отладки (вам, возможно, придется изменить правило failed_when, чтобы принудительно завершить его) и распечатайте словарную переменную command_result, вы увидите, что она не содержит ошибок и фактически завершена. Но все равно он никогда не вернется !?

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

  • Вы также должны помнить, что следует использовать программу expect, а не просто запускать скрипт с модулем скрипт. Этот вид гарантирует код возврата в случае, если ожидаемый скрипт этого не делает.

Надеюсь, это кому-то поможет!

Ваше здоровье.

person codehitman    schedule 30.07.2014
comment
Хорошее обходное решение! Я заменил ожидать пустым, это тоже сработало. empty.sourceforge.net - person waylander; 18.10.2014