我正在创建一个安装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进程等待进程返回。
任何线索该怎么办?
答案 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 程序,而不是仅使用脚本模块运行脚本。这种保证返回代码,以防止脚本没有。
希望这有助于某人!
干杯。