じゃあ、おうちで学べる

思考を呼び覚ます このコードに、君は抗えるか。

AnsibleでMYSQLの設定を行う

概要

最近は魂がなく作業のようにPCに向かっている.悲しい. AnsibleでMYSQLの設定を行う.

version

Ansibel実行サーバー

$ansible --version
ansible 2.4.2.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/home/motouchi/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.12 (default, Nov 20 2017, 18:23:56) [GCC 5.4.0 20160609]

MYSQLがインストールされるサーバー

# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

実行する

ディレクトリ構造

$tree
.
├── README.md
├── handlers
│   └── main.yml
├── inventories
│   └── hosts
├── playbooks
│   └── db.yml
├── tasks
│   └── main.yml
└── templates
    └── root
        └── okaimono_db_ddl.sql

メインのロール ./tasks/main

---
# パッケージインストール
- name: install mariadb server
  yum: name="{{ item }}" state=present enablerepo=mariadb
  with_items:
    - MariaDB-devel
    - MariaDB-client
    - MariaDB-server
    - MySQL-python

# DBを読み込む(/root/okaimono_db_ddl.sql がない場合のみ).
- name: create schema_okaimono_db
  template: src=root/"{{ item }}" dest=/root/"{{ item }}"
  with_items:
    - okaimono_db_ddl.sql
  notify:
    - initialize schema_okaimono_db
#DBユーザーを作成します.
- name: add db user
  mysql_user: >
    name="{{ item.name }}" host="{{ item.subnet }}" password="{{ item.pass }}" priv="{{ item.schema }}":"{{ item.auth }}" append_privs=yes
  with_items:
    - { name: 'root', subnet: 'localhost', pass: '****', schema: '*.*' , auth: 'ALL' }
    - { name: 'sample', subnet: 'localhost', pass: '****', schema: 'temoto.*' , auth: 'ALL' }
    - { name: 'sample', subnet: '172.22.0.0/255.255.0.0', pass: '****', schema: 'kago.*' , auth: 'ALL' }
    - { name: 'sample', subnet: '127.0.0.1', pass: '****', schema: 'saihu.*' , auth: 'ALL' }
    - { name: 'api', subnet: '127.0.0.1', pass: '****', schema: 'temoto.*' , auth: 'SELECT,INSERT,UPDATE,DELETE' }

./handlers/main.yml

- name: initialize schema_infra_db
  mysql_db: >
    name=infra_db login_host=127.0.0.1 login_user=root login_password=sampleRootPawsswORDISBADpASSwORD
    state=import target=/root/okaimono_db_ddl.sql

実行

# 実行確認
ansible-playbook -i ./inventories/hosts ./playbooks/db.yml -l sample_host --check
# 実行
ansible-playbook -i ./inventories/hosts ./playbooks/db.yml -l sample_host

注意点

  • hostに複数ホストを登録しても良しなにコントロールしてくれるわけではない
  • subnetは一つずつ指定してあげないと自動で分離はしてくれない
{ name: 'api', subnet: '127.0.0.1,localhost,172.22.0.0/16', pass: '****', schema: 'temoto.*' , auth: 'SELECT,INSERT,UPDATE,DELETE' }

参照

mysql_db - Add or remove MySQL databases from a remote host. — Ansible Documentation
mysql_replication - Manage MySQL replication — Ansible Documentation
mysql_user - Adds or removes a user from a MySQL database. — Ansible Documentation
mysql_variables - Manage MySQL global variables — Ansible Documentation
データベース - Wikipedia
SQL - Wikipedia
トランザクション処理 - Wikipedia
ACID (コンピュータ科学) - Wikipedia
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.3.6 SET TRANSACTION 構文
トランザクション分離レベルの勉強記録(1) 4つのレベルを実験する
MySQL - InnoDBのロック関連まとめ
基礎MySQL ~その 4~ InnoDB①
InnoDB の DoubleWrite 技術をみる

以上です.社会は厳しく元気はありませんが今後もやっていきます.