如何使用ansible'期望'模块用于多种不同的响应?

时间:2016-07-15 10:04:40

标签: python python-2.7 ansible ansible-playbook ansible-2.x

在这里,我试图测试我的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

对于这个脚本,我在下面写了代码,它工作正常,

- 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

但如果我对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

及其引用在这里:

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/jackson/AnsibleWorkSpace/AnsibleTest/example1.retry

PLAY RECAP *********************************************************************
S1                         : ok=1    changed=0    unreachable=0    failed=1  

我还尝试空白''而不是"\n"作为第一个答案,但它也无效。我还访问了ansible expect doc,但这里有非常简单的例子和​​解释。我也尝试正则表达式匹配多个不同的响应,但它也无法正常工作。请不要建议我使用ansible的mysql模块,因为这里我的目的是学习这个模块以备将来使用。

1 个答案:

答案 0 :(得分:20)

原因是这些问题被解释为正则表达式。因此,您必须在正则表达式中转义具有特殊含义的字符,例如 - ()[] \?*。 et cetara。

因此:

'Enter current password for root (enter for none):'

应改为:

'Enter current password for root \(enter for none\):'
祝你好运!