Python 如何将 ansible 'expect' 模块用于多个不同的响应?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/38393343/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to use ansible 'expect' module for multiple different responses?
提问by Pankaj Hymanson
Here I am trying to test my bash script where it is prompting four times.
在这里,我试图测试我的 bash 脚本,它提示了四次。
#!/bin/bash
date >/opt/prompt.txt
read -p "enter one: " one
echo $one
echo $one >>/opt/prompt.txt
read -p "enter two: " two
echo $two
echo $two >>/opt/prompt.txt
read -p "enter three: " three
echo $three
echo $three >>/opt/prompt.txt
read -p "enter password: " password
echo $password
echo $password >>/opt/prompt.txt
for this script I wrote the code below, and it is working fine
对于这个脚本,我写了下面的代码,它工作正常
- hosts: "{{ hosts }}"
tasks:
- name: Test Script
expect:
command: sc.sh
responses:
enter one: 'one'
enter two: 'two'
enter three: 'three'
enter password: 'pass'
echo: yes
But if I am doing the same for mysql_secure_installation
command it not working
但是如果我对mysql_secure_installation
命令做同样的事情,它就不起作用
- hosts: "{{ hosts }}"
tasks:
- name: mysql_secure_installation Command Test
expect:
command: mysql_secure_installation
responses:
'Enter current password for root (enter for none):': "\n"
'Set root password? [Y/n]:': 'y'
'New password:': '123456'
'Re-enter new password:': '123456'
'Remove anonymous users? [Y/n]:': 'y'
'Disallow root login remotely? [Y/n]:': 'y'
'Remove test database and access to it? [Y/n]:': 'y'
'Reload privilege tables now? [Y/n]:': 'y'
echo: yes
and its trackback is here:
它的引用在这里:
PLAY [S1] **********************************************************************
TASK [setup] *******************************************************************
ok: [S1]
TASK [mysql_secure_installation Command Test] **********************************
fatal: [S1]: FAILED! => {"changed": true, "cmd": "mysql_secure_installation", "delta": "0:00:30.139266", "end": "2016-07-15 15:36:32.549415", "failed": true, "rc": 1, "start": "2016-07-15 15:36:02.410149", "stdout": "\r\n\r\n\r\n\r\nNOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL\r\n SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!\r\n\r\n\r\nIn order to log into MySQL to secure it, we'll need the current\r\npassword for the root user. If you've just installed MySQL, and\r\nyou haven't set the root password yet, the password will be blank,\r\nso you should just press enter here.\r\n\r\nEnter current password for root (enter for none): ", "stdout_lines": ["", "", "", "", "NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL", " SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!", "", "", "In order to log into MySQL to secure it, we'll need the current", "password for the root user. If you've just installed MySQL, and", "you haven't set the root password yet, the password will be blank,", "so you should just press enter here.", "", "Enter current password for root (enter for none): "]}
NO MORE HOSTS LEFT *************************************************************
to retry, use: --limit @/home/Hymanson/AnsibleWorkSpace/AnsibleTest/example1.retry
PLAY RECAP *********************************************************************
S1 : ok=1 changed=0 unreachable=0 failed=1
I have also tried blank ''
instead of "\n"
for the first answer but it is not working either. I also visited Ansible expect
doc but they show only very simple example and explanation. I am also trying regex match for multiple different responses but it is also not working.
Please do not recommend me to use mysql module of Ansible, because here my purpose is to learn this module for future use.
我也试过空白''
而不是"\n"
第一个答案,但它也不起作用。我还访问了 Ansibleexpect
文档,但他们只展示了非常简单的示例和解释。我也在尝试对多个不同的响应进行正则表达式匹配,但它也不起作用。
请不要推荐我使用 Ansible 的 mysql 模块,因为我在这里的目的是学习这个模块以备将来使用。
回答by SiCN
The reason is that the questions are interpreted as regexps. Hence you must escape characters with a special meaning in regular expressions, such as -()[]\?*. et cetara.
原因是这些问题被解释为正则表达式。因此,您必须对正则表达式中具有特殊含义的字符进行转义,例如 -()[]\?*。等等。
Hence:
因此:
'Enter current password for root (enter for none):'
should instead be:
应该是:
'Enter current password for root \(enter for none\):'
Good luck!
祝你好运!