MySQL 5.7でrootユーザがパスワード認証になっていない時にパスワード認証に変更するやり方

環境はAWS

# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"

Ansibleを使っていてrolesの下が

db
├── tasks
│   └── main.yml
└── templates
    └── mysql.preseed.j2

$ cat roles/db/tasks/main.yml
- template: src=mysql.preseed.j2 dest=/tmp/mysql.preseed
- shell: debconf-set-selections /tmp/mysql.preseed
- apt: name={{ item }} update_cache=yes
  with_items:
  - mysql-server
  - mysql-client
$ cat roles/db/templates/mysql.preseed.j2
mysql-community-server mysql-community-server/root-pass    password {{ password }}
mysql-community-server mysql-community-server/re-root-pass password {{ password }}

みたいな状態で{{ password }}部分を変数として与えてMySQL 5.7をインストールしたら、rootユーザのパスワードが設定されておらず、OSのrootユーザのみがパスワード無しで(かつ、どんなテキトーパスワードでも)接続できるようになっていた。

中身を見てみると

mysql> select plugin, authentication_string from mysql.user where user = 'root';
+-------------+-----------------------+
| plugin      | authentication_string |
+-------------+-----------------------+
| auth_socket |                       |
+-------------+-----------------------+

だと。 パスワードの設定とpluginの値をmysql_native_passwordを変更するには

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'hogehoge';

としてやる。 SET PASSWORD文やALTER USER 'root'@'localhost' IDENTIFIED BY 'hogehoge'ではダメ。

そもそもmysql.preseed.j2の内容がおかしい気もするがここ直せばパスワード設定されるのかは未検証。