playbook与交互式

假设被管理机器上有一个实验脚本,内容如下:

1
2
3
#/bin/bash
read -p "请输入一句话:" yahoo
echo $yahoo >> /root/123.txt

这个脚本很基础,我们先随便实验一下,如图。

playbook与交互式

现在来到ansible主机,写一个简单的yaml来看一下是否会有交互的环节,yaml如下:

1
2
3
4
5
---
- hosts: all
  tasks:
        - name: 启动test.sh
          shell: sh /root/test.sh

启动这个playbook,效果如图:

playbook与交互式

可见,根本就没有让我们填写“请输入一句话”的机会。而返回到被控制端,打开123.tst看见的效果是这样的:

playbook与交互式

可见ansible-playbook会默认往交互环节里输入一个回车,着尼玛就很坑了啊,因为大批量机器需要一起执行一个有交互环节的脚本是一个很常见的事儿,遇到这种问题肿么办?


答曰,提前把“那句话写好”,比如我们要输入的那句话是“快使用双截棍,哼哼哈兮”,那么把playbook改成这样:

1
2
3
4
5
---
- hosts: all
  tasks:
        - name: 启动test.sh
          shell: echo "快使用双截棍,哼哼哈兮" |  sh /root/test.sh

最简单粗暴的方法就是用shell的思维去解决这个问题。效果如图:

playbook与交互式


那么这是交互一次的情况,如果是交互多次的情况怎么办?比如现在是这样的一个脚本:

1
2
3
4
5
6
7
#/bin/bash
read -p "输入一个球员名字:" yahoo
read -p "输入他的球队:" alibaba
read -p "输入他的球衣号码以及场上位置:" youku
echo $yahoo >> /root/123.txt
echo $alibaba >> /root/123.txt
echo $youku >> /root/123.txt

这样还能一次性输入吗?很多人认为可以在playbook里输入 shell:echo "dirk\nMAVS\n41+pf" | sh /root/test.sh。其实这样是不对的,这样的输入效果只能是第一行是"dirknMAVSn41+pf",然后后两行是空的。


那么这样的情况怎么办?


要么先把东西写好,比如有一个abc.txt,

1
2
3
"dirk"
"mavs"
"41PF"

然后再把playbook改成这样:

1
2
3
4
5
---
- hosts: all
  tasks:
        - name: 启动test.sh
          shell:  sh /root/test.sh < /root/abc.txt

执行一下看效果:

playbook与交互式


要么就是shell:echo -e "dirk\nMAVS\n41+pf" | sh /root/test.sh。


 本文转自 苏幕遮618 51CTO博客,原文链接:http://blog.51cto.com/chenx1242/1857505