Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use ansible 'expect' module for multiple different responses?

Tags:

Here I am trying to test my bash script where it is prompting four times.

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

- 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/jackson/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.

like image 221
Pankaj Jackson Avatar asked Jul 15 '16 10:07

Pankaj Jackson


People also ask

How do you use expect in ansible?

Ansible “expect” command is the built-in command and installed by default with the ansible installation. The main purpose of this command to execute the command on the remote nodes using the “command” parameter and provide the required arguments to run the command using the “response” parameter.

What is expect module?

Synopsis. The expect module executes a command and responds to prompts. The given command will be executed on all selected nodes. It will not be processed through the shell, so variables like $HOME and operations like "<" , ">" , "|" , and "&" will not work.

How do you pass YES in ansible?

Just use the yes shell utility, yes 'y' | <command-name> # ^^The repeated string being 'yes' as the OP had asked.


1 Answers

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!

like image 187
SiCN Avatar answered Sep 20 '22 06:09

SiCN