如何使用ansible运行需要中断操作的shell文件

Quo*_*Lap 3 linux bash shell ansible

我正在使用ansible 1.9.4在服务器上运行shell bash,我遇到了麻烦.例如,我有一个名为jdk-1_5_0_22-linux-amd64.bin的jdk文件 ,我想做一些像下面的命令来安装java:

./jdk-1_5_0_22-linux-amd64.bin
Run Code Online (Sandbox Code Playgroud)

但是当我运行此命令时,屏幕显示许可协议,并询问我"按空格键或输入"滚动它,然后按"是"确认.

或者当我尝试运行包含以下内容的shell bash时:

echo "restart ntp ?[y/n]"
read check
Run Code Online (Sandbox Code Playgroud)

我已经通过shell,脚本,命令模块在ansible中尝试了它,但它没有为我运行,ansible被暂停了.看起来ansible正在等待我的中断动作.我怎样才能做到这一点?我在文档中的任何地方都找不到它.

Mic*_*ael 6

您可以使用yes(参见:) man yesexpect.而yes不断向任何过程发送答案:

 yes | install.sh
Run Code Online (Sandbox Code Playgroud)

expect监听期望输出,然后相应地发送回复.

(安装expect,apt-get install expect,yes应该是你的Linux发行版的一部分的话)

#!/usr/bin/expect

set timeout 10
spawn ./jdk-1_5_0_22-linux-amd64.bin

expect "Input your name:"
send "Quoc Lap\r"

interact
Run Code Online (Sandbox Code Playgroud)

如果jdk安装过程要求,这个小脚本将输出你的名字"input your name:".请注意,名称字符串以返回字符结尾\r

interact 将确保关闭并发送正确的退出代码.

man expect 将为您提供有关如何处理更复杂流程的示例和信息.

最后

你的ansible playbook将需要调用上面的脚本

- name: Install Java JDK (automatic install)
  shell: ./jdk_install.sh
  args:
    chdir=/path/to/your/script
Run Code Online (Sandbox Code Playgroud)

如果您不需要从特定位置运行,只需添加shell操作的路径并删除args-part.