ansible module mysql_user について

これは Ansible Blogger 2018 (sponsored by Red Hat) Advent Calendar 2018 - Qiita 2日目の記事です。

ansible module mysql_user

DBもちゃんと管理したい! という話は当然のようにあって、 複数DBに同じユーザがいてほしい! だとか、 残念ながらあの人いなくなるので、全DBから確実にユーザ削除したい! だとか、 よくある話だと思います。

そんなよくある話を(mysqlに限って)解決してくれるのが ansible の mysql_user モジュールです。

詳しいドキュメントは mysql_user - Adds or removes a user from a MySQL database. — Ansible Documentation をみましょう。

で終わってはあんまり意味がないので、便利ポイントを絞って説明します。

option update_password

update_password というオプションがあります。

通常、個人ユーザを作成したら、パスワードの管理はその個人に任せます。というか任せてないとなんかおかしい気がします。

そんな時はこのオプションを on_create に設定することで、既にユーザが作成されている場合は、パスワードを変更しないようにできます。

こうすることで、初期パスワードを適当に設定して、ユーザに通知し、パスワード変更を含め、ユーザに管理をゆだねることができるようになります。

とても便利。

ユーザがパスワードを忘れてしまった場合は、ここをデフォルトのalwaysにして、パスワードを初期化することで再設定を促せます。

とても便利。

more security

ところで、上述のパスワード、ユーザごとのものであれば、ユーザがパスワードを変更するまでが寿命ですが、 例えばアプリケーションが利用するユーザなどは、設定するパスワードは一定期間有効となります。

そんなデータはきちんと扱わないと危険ですよね、そんな重要なデータはまずは ansible-vaultを使って暗号化して保管しておきましょう。

Ansible Vault — Ansible Documentation

また、そんな重要なデータが実行時にログとして出てくると、とても、つらいですよね、 そんな時はno_log という実行時にログ出力しなくなるオプションがあるのでそれを利用しましょう。 no_logオプションはmysql_user固有のオプションではなく、registerなどと同じく一般的なオプションです。

なので

- name: "sample user"
  no_log: true
  mysql_user:
    user: sample
    password: "{{ vault-sample-password }}"
    state: present
    host: localhost

たとえばこんな風に書きます。

まだ実装されてない、実装されると便利そうな機能

そもそもDBで個別にパスワード管理したくないよね?pluginって仕組みあるし! というのは割と誰しも考える事なのではないかと思いますが、今のところ認証pluginを利用する方法は実装されていません。

認証pluginを利用するためには with を用いるのですが、 mysql_user モジュールは mariadb でも利用されることを想定しています。 mariadbにも認証pluginを利用する仕組みはあるのですが、withではなくvia を利用します。

というような事情があったりするのが原因の一つです。

add support for auth_socket by verwilst · Pull Request #3587 · ansible/ansible-modules-core · GitHub

Add plugin as parameter for mysql_user, to allow use of auth_socket plugin · Issue #27179 · ansible/ansible · GitHub

バージョンをチェックして、どのバージョンであればどの記載方法を受け付けるのか といったことを網羅的に調べて、 モジュール内で適切に分岐させるという必要があり 割と面倒ですし、テストも結構大変そうだなぁという気はしていますが、 求めてる人はそこそこいそうなので、挑戦すると喜ばれるのでは?