在运行远程期望脚本时,Ansible卡住了

时间:2014-06-01 11:16:18

标签: expect ansible

我正在创建一个安装ispconfig而没有互动的ansible脚本。我正在使用expect来处理ispconfig交互式安装php脚本。我使用Ubuntu 14.04版本的expect和最新版本的ansible在apt-get上安装它。

在运行期望脚本后,会发生什么情况,ansible不会返回。

我使用的脚本如下:expect script on github

我从expect logfile获得的输出是:

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执行它脚本被执行但它不会返回。使用-v运行ansible时不会显示任何日志信息,而ansible正在等待..

ansible脚本的relvant部分是:

  # 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表示期望脚本已不存在。 ansible进程等待进程返回。

任何线索该怎么办?

1 个答案:

答案 0 :(得分:2)

好的,所以似乎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脚本的输出,然后尝试找到一个你保证只在任务完成时显示的字符串。如果您可以找到该字符串,则任务完成,否则失败。

  • 您还要记住使用 expect 程序,而不是仅使用脚本模块运行脚本。这种保证返回代码,以防止脚本没有。

希望这有助于某人!

干杯。