Ansible에서 Enter 키 시뮬레이션

Ansible에서 Enter 키 시뮬레이션

mysql_secure_installation 명령을 실행하기 위한 플레이북을 생성하려고 합니다.

이 명령은 몇 가지 질문을 합니다. 나는 pexpect를 사용하고 있지만 "입력"을 시뮬레이트하는 방법을 잘 모르겠습니다. 첫 번째 질문은 "루트 비밀번호 입력"입니다. 루트 비밀번호를 입력하고 싶지 않습니다. SQL Server는 로컬 서버만 가능합니다.

- 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

/bin/bash -c "echo""", 명령 및 빈 줄을 사용해 보았지만 아래 응답이 계속 나타납니다.

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): "]}

답변1

효과가 있었습니다. 일부 내용은 정규식 특수 문자로 인식되는 것으로 나타났습니다.

- 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

답변2

~에 따르면이것그리고이것, 빈 문자열을 지정하면 Ansible이 자동으로 "enter"를 따릅니다.

그래도 문제가 해결되지 않으면 다른 제안이 있습니다.여기답변을 위해 /bin/bash -c "echo".

답변3

모듈 문서에 따르면 expect미리보기로 표시되어 있어 변경 사항이 변경될 수 있으며, 모드는 매우 간단합니다. 스크립트를 사용하는 것이 더 현명할 수 있습니다 . 이렇게 하면 각 문제를 감지할 수 있으며 새 버전에서 문제가 변경되면 (또는 누군가가 몰래 들어와 mysql 계정에 비밀번호를 입력하는 경우 또는...) expect실패할 수 있습니다. )mysql_secure_installationroot

그러나 expect패키지를 설치하고 스크립트를 시스템에 복사해야 할 수 있으므로 더 많은 작업이 필요합니다. 세부 사항은 관련된 포트 또는 패키지 시스템과 로컬 스크립트가 설치된 정확한 위치에 따라 다릅니다(다른 곳에 설치하는 것이 좋습니다). 신뢰할 수 있는 로컬 사용자가 읽거나 실행할 수 없는 위치보다...)

- 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

그러면 스크립트는 do-setup-mysql다음과 같이 시작될 수 있습니다.

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

나머지 질문은 이런 식으로 추론됩니다. 스크립트는 create 여야 합니다 . 또는 파일은 초기 설정이 모든 ansible 실행을 실행하지 않도록 /todofixme생성된 것으로 알려진 파일일 수 있습니다 .mysql_secure_installation

관련 정보