Ansible Expect module can't match string/regex

2019-07-11 12:19发布

问题:


I'm trying to automate a script installation through Ansible in a Vagrant machine.

I tried a lot to find a solution across the web but the documentation and the examples are very weak.

That script I'm trying to install is prompting questions that I'm trying to answer programmatically with the Ansible Expect Module.

Ansible Task:

- name: "Running Lisk installation"
  become: True
  become_user: vagrant
  expect:
      command: bash installLisk.sh install -r {{env}}
      responses:
            'Where do you want to install Lisk to? (Default /home/vagrant)': "/home/vagrant"
            'Would like to install NTP? (y/n):': "y"
      echo: yes

It seems it can't recognize the question or the answer, this is the error I'm getting back from the provisioning

TASK [lisk : Running Lisk installation] ****************************************

fatal: [default]: FAILED! => {
"changed": true,
"cmd": "bash installLisk.sh install -r test",
"delta": "0:00:30.137468",
"end": "2016-08-26 08:18:46.740017",
"failed": true,
"rc": null,
"start": "2016-08-26 08:18:16.602549",

"stdout": "Checking prerequisites:\r\n
Curl is installed.\t\t\t\t\t\u001b[32mPassed\u001b(B\u001b[m\r\n
Tar is installed.\t\t\t\t\t\u001b[32mPassed\u001b(B\u001b[m\r\n
Wget is installed.\t\t\t\t\t\u001b[32mPassed\u001b(B\u001b[m\r\n
Sudo is installed and authenticated.\t\t\t\u001b[32mPassed\u001b(B\u001b[m\r\n\
u001b[32mAll preqrequisites passed!\u001b(B\u001b[m\r\n
Where do you want to install Lisk to? (Default /home/vagrant): ",

"stdout_lines": [
"Checking prerequisites:",
"Curl is installed.\t\t\t\t\t\u001b[32mPassed\u001b(B\u001b[m",
"Tar is installed.\t\t\t\t\t\u001b[32mPassed\u001b(B\u001b[m",
"Wget is installed.\t\t\t\t\t\u001b[32mPassed\u001b(B\u001b[m",
"Sudo is installed and authenticated.\t\t\t\u001b[32mPassed\u001b(B\u001b[m",
"\u001b[32mAll preqrequisites passed!\u001b(B\u001b[m",
"Where do you want to install Lisk to? (Default /home/vagrant): "
]}

Thank you all guys in advance

回答1:

Responses in expect module are regular expressions, so question marks have special meanings.
You can simply use:

- expect:
    command: bash installLisk.sh install -r {{env}}
    responses:
      'install Lisk to': '/home/vagrant'
      'install NTP': 'y'
    echo: yes