simula a tecla enter em Ansible

0

Eu estou tentando criar um playbook para executar o comando mysql_secure_installation.

Este comando faz várias perguntas. Eu estou usando pexpect, mas não sei como simular um "enter" A primeira pergunta que ele faz é "digite uma senha de root" Eu não quero digitar uma senha de root. O servidor sql será apenas local.

- name: "Secure MariaDB"
  expect:
    command: /bin/mysql_secure_installation
    responses:
      Question:
        - ''          #I want to have ansible hit enter
        - 'n'         # Type n
        - 'y'         # Type y
        - 'y'         # Type y
        - 'y'         # Type y
        - 'y'         # Type y

Eu tentei com um '', o comando /bin/bash -c "echo" e até mesmo apenas uma linha em branco e continuo recebendo a resposta abaixo.

FAILED! => {"changed": true, "cmd": "/bin/mysql_secure_installation", "delta": "0:00:30.128184", "end": "2018-08-29 18:54:30.983455", "msg": "non-zero return code", "rc": 1, "start": "2018-08-29 18:54:00.855271", "stdout": "\r\nNOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB\r\n      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!\r\n\r\nIn order to log into MariaDB to secure it, we'll need the current\r\npassword for the root user.  If you've just installed MariaDB, 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 MariaDB", "      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!", "", "In order to log into MariaDB to secure it, we'll need the current", "password for the root user.  If you've just installed MariaDB, 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): "]}
    
por user2236794 29.08.2018 / 19:44

3 respostas

1

De acordo com este e isso , você só precisa especificar uma string vazia; Ansible será automaticamente segui-lo com "enter".

Se isso não funcionar, há outra sugestão aqui para usar /bin/bash -c "echo" para a resposta.

    
por 29.08.2018 / 21:00
1

Entendi. Acontece que algumas das coisas estavam sendo reconhecidas como caracteres especiais de regex.

- name: "Secure MariaDB"
  expect:
    command: /bin/mysql_secure_installation
    responses:
      'Enter current password for root \(enter for none\): ': ''
      'Set root password\? \[Y\/n\] ': 'n'
      '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
    
por 01.09.2018 / 01:11
0

De acordo com a documentação do módulo expect é sinalizado como visualização, portanto, pode ser alterado e o módulo é muito simples. Pode ser mais sensato usar um script expect ; isso permitiria a detecção de cada pergunta e a capacidade de falhar se as questões mudassem em alguma nova versão de mysql_secure_installation (ou falhar se alguém entrar e colocar uma senha na conta root mysql, ou .. .)

No entanto, esse é mais um trabalho, pois o pacote expect pode precisar ser instalado e o script copiado para o sistema. Os detalhes variam dependendo das portas ou do sistema de pacotes envolvidos e onde exatamente os scripts locais são instalados (esperamos que usuários locais não confiáveis não podem lê-los ou executá-los ...)

- name: install packages for centos
  yum: name={{ item }} state=present
  with_items:
    - expect
    ...
- name: copy script
  copy: src=root/bin/do-setup-mysql dest=/root/bin/do-setup-mysql ...
- name: initial setup of mysql
  command: /root/bin/do-setup-mysql
  args:
    creates: /todofixme

E o script do-setup-mysql pode começar nas seguintes linhas:

#!/usr/bin/env expect
proc die {msg} { puts stderr $msg; exit 1 }
#log_file /root/do-setup-mysql.log
spawn -noecho mysql_secure_installation
expect "Enter current password for root"
send "\r"
expect {
    timeout { die "timeout before response" }
    "Access denied" { die "root password already set" }
    "Setting the root password" {}
}
expect "Change the root password"
send "n\r"
...

E assim por diante para o restante das perguntas. O script deve criar /todofixme ou, em vez disso, esse arquivo poderia ser algo conhecido criado por mysql_secure_installation , para que a configuração inicial não seja executada em todas as execuções esperadas.

    
por 31.08.2018 / 16:08

Tags