2016-07-15 121 views
9

Qui sto cercando di testare il mio script di bash dove viene richiesto quattro volte.Come usare il modulo 'expect' di ansible per più risposte diverse?

#!/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 

per questo script ho scritto codice qui sotto, e si sta lavorando bene,

- 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 

Ma se io sto facendo lo stesso per il comando mysql_secure_installation non lavora per me,

- 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 

e il suo trackback è qui:

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 

Ho anche provato in bianco '' invece di "\n" per la prima risposta ma non funziona anche. Ho anche visitato ansible expect doc ma qui molto semplice esempio e spiegazione. Sto anche provando la regex match per più risposte diverse ma non funziona. per favore non mi consiglia di usare il modulo mysql di ansible, perché qui il mio scopo è quello di imparare questo modulo per un uso futuro.

+0

hai trovato una soluzione per questo? – syodage

+0

No, non ho trovato alcuna soluzione. –

risposta

14

La ragione è che le domande sono interpretate come espressioni regolari. Quindi devi sfuggire ai personaggi con un significato speciale nelle espressioni regolari, come ad esempio -() [] \? *. et cetara.

qui:

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

dovrebbe essere invece:

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

Buona fortuna!