Ansible to create mysql replication

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もっとやりこまないとな〜〜。

connvoi's Picture

About connvoi

肉とビールと料理と写真とゲーム たまに技術 python / Solr / PHP / ansible

アマゾンセール情報サイト アマセール管理人

Jp, Tokyo https://connvoi.com