ansibleでmysqlのreplicationを設定する
mysqlのreplicationをansibleでやったのでメモ。
mysqldumpをとる
dumpしてローカルにデータを落として来てる。今回はDBば小さかったので、これでよかったけど、サイズが大きい場合はあらかじめサーバ側でやっておく。 my.cnfとかはあらかじめ配布されてる前提です。
- hosts: [ master ]
become : yes
tasks:
- mysql_db:
state: dump
name: all
login_user: USER
login_password: PASS
target: /tmp/dump.sql
- name: get sqldump to local
local_action: shell scp -r {{ inventory_hostname }}:/tmp/dump.sql ./
dbへdumpをインポート、replの設定をする
- hosts: [ master ]
become : yes
tasks:
- name: get master status
mysql_replication:
mode: getmaster
login_user: USER
login_password: PASS
register: result
- debug: var=result
- hosts : [ slave ]
become : yes
vars_prompt:
- name: mysqlfile
prompt: "mysql.Fileを入力してください"
private: no
- name: mysqlposition
prompt: "mysql.Positionを入力してください"
private: no
tasks:
- name: send sqldump
local_action: shell scp dump.sql {{ inventory_hostname }}:/tmp/dump.sql
- name: Import dump.sql
mysql_db:
state: import
name: dump
target: /tmp/dump.sql
login_user: USER
login_password: PASS
- mysql_replication:
mode: changemaster
master_host: masterhost
master_user: user
master_password: pass
master_log_file: "{{ mysqlfile }}"
master_log_pos: "{{ mysqlposition }}"
login_user: USER
login_password: PASS
- mysql_replication:
mode: startslave
login_user: USER
login_password: PASS
- mysql_replication:
mode: getslave
login_user: ROOT
login_password: PASS
register: result
debug: var=result
#login_user, login_passwordは/root/.my.cnfを設定するならいらない
1.show master statusの表示
2.プロンプトにbinlogとpositionを入れる
3.dump.sqlのインポート
- changemaster
- start slave
- show slave status
こんな感じの流れ。mysql.FIle、positionが結構微妙で、playbook内でgroupを超えた変数(グローバル)を宣言できないっぽいので、promptにしてみた。 昔やった時はもっとshellスクリプトを結構書かないといけない感じだったんですが、mysql_replicationのモジュールができて楽になった。
どうも、ansible描いてるとその場限りの感じが多くなるので、もうちょっと汎用化していきたい。