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
答え3
モジュール文書によると expect
プレビューとして表示されているため、変更が変更される可能性があり、モードは非常に簡単です。スクリプトを使用する方が賢明かもしれません。これにより各問題が検出され、新しいバージョンで問題が変更された場合(または誰かがこっそり入り、mysqlアカウントにパスワードを入力した場合または...)、expect
失敗する可能性があります。 )mysql_secure_installation
root
ただし、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でなければなりません。あるいは、ファイルは、初期設定がすべての不可能な実行を実行しないように/todofixme
生成されたことが知られているファイルでもあります。mysql_secure_installation