はじめに
とりま Ansible で MySQL の設定をチェックするようにしたかったのでやってみた。
既存の MySQL サーバが開発ステージング本番マスタースレーブあわせて80機ほどあるのでツールなしで面倒見るのもう無理ぽ。
mysql_variables モジュール
他のモジュールは require 書いてあるのにこれには書いてない。
けど MySQL-python (pyhons-mysqldb?)が必要っぽい(当然MySQLサーバ機上に)。
CentOSでデフォルトのpythonならyumでおk
sudo yum install -y MySQL-python
もちろん pip でもいい(はず)
pip install MySQL-python
playbook
# cat playbooks/mysql_check.yml
- hosts: all
sudo: yes
gather_facts: no
tasks:
- name: check max_connections
mysql_variables:
variable=max_connections
login_user=接続ユーザ
login_password=パスワード
発生したエラーと対処方法
$ ansible-playbook playbooks/mysql_check.yml -l XXXXX
PLAY [all] ********************************************************************
TASK: [check max_connections] *************************************************
failed: [XXXXX] => {"failed": true}
msg: the python mysqldb module is required
FATAL: all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
to retry, use: --limit @/home/myaccount/mysql_check.retry
XXXXX : ok=0 changed=0 unreachable=0 failed=1
※ 対象のサーバに MySQL-python が入っていないので前述のとおりインストールする
$ ansible-playbook playbooks/mysql_check.yml -l XXXXX
PLAY [all] ********************************************************************
TASK: [check max_connections] *************************************************
failed: [XXXXX] => {"failed": true}
msg: unable to connect to database, check login_user and login_password are correct or ~/.my.cnf has the credentials
FATAL: all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
to retry, use: --limit @/home/myaccount/mysql_check.retry
XXXXX : ok=0 changed=0 unreachable=0 failed=1
※ 権限系エラー。MySQLの権限まわりは別途調べましょう。
ちなみにAnsibleだとローカルホスト扱いみたいなので root で接続してもいい、ハズ。。。(いやよくない(反語
成功
$ ansible-playbook playbooks/mysql_check.yml -l XXXXX
PLAY [all] ********************************************************************
TASK: [check max_connections] *************************************************
ok: [XXXXX] => {"changed": false, "msg": [["max_connections", "151"]]}
PLAY RECAP ********************************************************************
XXXXX : ok=1 changed=0 unreachable=0 failed=0
※ わざわざ changed_when: False 書かなくても参照時はちゃんとfalseなのは小町的にポイント高い
one more thing
sudo:yes の場合には root ユーザの、sudo:no の場合には実行時ユーザの、ホームディレクトリの .my.cnf に user と password を設定しておけば、playbook 中からは login_user と login_password は外すことができる。
もっとも、Ansible 実行側の vars 等にホスト毎の変数として置いておいたほうが取り回しは楽だと思うけど。
あと、この .my.cnf に余計な設定があるとエラーになるので注意。
no-auto-rehash と interactive-timeout が ConfigParser.py でエラーになった。