ansibleでmysql replicationを設定する
mysqlのレプリケーションの設定をする必要が出てきたので、ansibleでコマンド化した。 後で忘れそうなのでメモ
inventory
#inventory.yml
[leader]
mydb
[replica]
repldb
ansible playbook
パスワード、サーバ名、データベール名とかは適当に書き直して使う。
- hosts: [ leader ]
vars:
mysqluser: myuser
mysqlpass: mypass
tasks:
- name: "mysqldumpを取得する"
mysql_db:
state: dump
name: mydb
login_user: '{{ mysqluser }}'
login_password: '{{ mysqlpass }}'
target: /tmp/mydbdump.sql
- name: "ファイルをローカルに保存する"
local_action: shell scp -r {{ inventory_hostname }}:/tmp/mydbdump.sql ./
become_user: me
- name: "leaderのshow master statusを表示する"
mysql_replication:
mode: getmaster
login_user: '{{ mysqluser }}'
login_password: '{{ mysqlpass }}'
register: result
- debug: var=result
- hosts: [ replica ]
vars:
mysqluser: myuser
mysqlpass: mypass
tasks:
- name: "slave stopをして、その結果を表示"
mysql_replication:
mode: stopslave
login_user: '{{ mysqluser }}'
login_password: '{{ mysqlpass }}'
register: result
- debug: var=result
- name: "mydbdump.sqlをreplicaのサーバーに転送します"
local_action: shell scp -r mydbdump.sql {{ inventory_hostname }}:/tmp/mydbdump.sql
become_user: kyagi
- name: "replicaのサーバーにdumpしたファイルをimportします"
mysql_db:
state: import
name: mydb
target: /tmp/mydbdump.sql
login_user: '{{ mysqluser }}'
login_password: '{{ mysqlpass }}'
- name: "change masterのsqlを発行します"
mysql_replication:
mode: changemaster
master_host: mydb
master_user: mydb_repl_user
master_password: mydb_repl_pass
master_log_file: "{{ hostvars['mydb']['result']['File'] }}"
master_log_pos: "{{ hostvars['mydb']['result']['Position'] }}"
login_user: '{{ mysqluser }}'
login_password: '{{ mysqlpass }}'
- name: "start slaveをします"
mysql_replication:
mode: startslave
login_user: '{{ mysqluser }}'
login_password: '{{ mysqlpass }}'
- name: "show slave statusをして、その結果を表示"
mysql_replication:
mode: getslave
login_user: '{{ mysqluser }}'
login_password: '{{ mysqlpass }}'
register: result
- debug: var=result
やっていることとしては、
- leaderサーバからmysqldumpでdumpファイルを作成、ローカルにscpする。
- show master statusを表示
- ローカルのdumpファイルをreplicaのサーバへscpし、importする
- change master、start slaveを実行
- show slave statusを表示
みたいな流れ。あくまで、leaderのデータ更新を止めた状態で行う前提。 一旦dumpファイルをローカルに落とすところは直接転送でも良い。
ansible内で実行した結果を- hostsまたいで参照するときにはHostsvarを使えばいいみたい。 もっと早く知りたかった。便利。 Ansibleもっとやりこまないとな〜〜。