web-dev-qa-db-ja.com

複数の異なる応答にansible 'expect'モジュールを使用する方法は?

ここでは、bash scripyのテストを4回繰り返しています。

#!/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モジュールを使用することはお勧めしません。ここでの目的は、将来使用するためにこのモジュールを学習することです。

14
Pankaj Jackson

その理由は、質問が正規表現として解釈されるためです。したがって、-()[] \?*などの正規表現で特別な意味を持つ文字をエスケープする必要があります。など。

したがって:

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

代わりに:

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

幸運を!

20
SiCN