过去一小时这让我感到恼火,我使用Ansible的expect模块来回答命令提示符,即:
Re-format filesystem in Storage Directory /mnt/ephemeral-hdfs/dfs/name ? (Y or N)
我要回复
Y
这应该根据标准正则表达式匹配和this other stackoverflow question
工作 - name: Run Spark Cluster script
expect:
command: /home/ubuntu/cluster_setup/scripts/shell/utils-cluster_launcher-start_spark.sh
responses:
"Re-format filesystem": "Y"
timeout: 600
echo: yes
我面临的问题是,当它达到预期键盘输入的程度时,它不会得到任何东西,因此它会挂起。这样没有错误输出;它只是保持不动。
任何想法如何解决这个问题?
答案 0 :(得分:2)
问题中的任务可以正确处理问题中包含的数据:
---
- hosts: localhost
gather_facts: no
connection: local
tasks:
- name: Run script producing the same prompt as Spark Cluster script
expect:
command: ./prompt.sh
responses:
"Re-format filesystem": "Y"
timeout: 600
echo: yes
register: prompt
- debug:
var: prompt.stdout_lines
./prompt.sh
的内容:
#!/bin/bash
read -p "Re-format filesystem in Storage Directory /mnt/ephemeral-hdfs/dfs/name ? (Y or N) " response
echo pressed: $response
结果:
PLAY [localhost] ***************************************************************
TASK [Run script producing the same prompt as Spark Cluster script] ************
changed: [localhost]
TASK [debug] *******************************************************************
ok: [localhost] => {
"prompt.stdout_lines": [
"Re-format filesystem in Storage Directory /mnt/ephemeral-hdfs/dfs/name ? (Y or N) Y",
"pressed: Y"
]
}
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0
答案 1 :(得分:1)
Ansible documentation for expect示例中的正则表达式周围没有引号。
TimeSpan ts = DateTime.Now - new DateTime(2017, 1, 1);
也许试试:
# Case insensitve password string match
- expect:
command: passwd username
responses:
(?i)password: "MySekretPa$$word"
答案 2 :(得分:0)
我知道这很旧了,但是我在此模块上遇到了同样的麻烦,这些答案也无济于事,但是我确实找到了自己的解决方案,并以为我可以节省一些时间。
首先,张贴者示例中的超时为10分钟。尽管这对于重新格式化很有用,但是这意味着您需要等待10分钟才能使脚本失败。例如如果停止,则等待响应“确定吗?”。调试时,请将超时时间设置得较低,如果您无法忍耐,请耐心等待。
第二个答复字段按字母顺序列出
responses:
"Test a specific string": "Specific"
"Test": "General"
将始终以常规响应所有包含测试的消息,因为这是响应图中的第一个字母顺序。
第三(随后)使我失望,因为在我的情况下,期望只是在提示符下按Enter键,脚本再次要求输入有效数据。然后的问题是我的超时永不触发,什么也没有返回,所以我看不到模块的任何响应,它只是挂起了。在这种情况下,解决方案是转到使用Ansible进行配置的服务器,找到命令Ansible与ps一起运行并杀死它。这使Ansible可以收集输出并向您显示它陷入无限循环的位置。