ansibleを使ってCentOS 6にmysql5.6をインストールする方法についての備忘録。
CentOS 6のデフォルトのリポジトリだとmysql5.1がインストールされるので、それ以上のバージョンをインストールする場合は、公式レポジトリからrpmを取ってきてインストールする必要があります。そこらへんの処理をansibleで書いて自動プロビジョニングできるようにしました。
3rd Partyのロールを使わない方法
playbookをヒラで書くとこんな感じ。---
- hosts: db_servers
become: yes
user: vagrant
vars:
- mysql_root_password: password
tasks:
- name: install rpm repository
yum: name=https://dev.mysql.com/get/mysql57-community-release-el6-11.noarch.rpm state=present
- name: install mysqld
yum:
name: "{{ item }}"
enablerepo: mysql56-community
disablerepo: mysql57-community
state: present
with_items:
- mysql-community-server
- mysql-community-client
- mysql-community-common
- mysql-community-libs
- mysql-community-libs-compat
- MySQL-python
- libselinux-python
- name: mysqld 起動・自動起動設定
service:
name: mysqld
state: started
enabled: yes
- name: change root password
mysql_user:
name: root
password: "{{ mysql_root_password }}"
host: "{{ item }}"
with_items:
- 127.0.0.1
- ::1
- localhost.localdomain
- localhost
- name: /root/.my.cnf by template
template:
src: templates/my.cnf.j2
dest: /root/.my.cnf
owner: root
group: root
mode: 0600
- name: add user
mysql_user:
name: hoge
password: fuga
host: localhost
priv: '*.*:ALL,GRANT'
install rpm repository/install mysqld
最新のrpmレポジトリをインストールして、mysql56-communityを有効に、mysql57-communityを無効にして、各MySQLのパッケージをインストールします。libselinux-pythonを入れないとファイル(my.cnf)の設置ができず、MySQL-Pythonはmysql_userタスクを使うために必要なパッケージになります。mysqld 起動・自動起動設定
mysqldを起動(state: started)し、自動起動設定(enabled: yes)します。change root password
rootユーザのパスワードを変更しています。初回はパスワードなし、二回目以降は/root/.my.cnfの設定を使ってログインします。/root/.my.cnf by template
jinja2のテンプレートフォーマットで書かれたファイルをリモートホストの指定パスに指定の権限で設置します。今回の場合は.my.cnfをrootに対してセットしています。これは2回目以降のprovisioning時にログインするための仕組みで、2回目以降は1回目と違ってパスワードが変更されているので、パスワードが設定されたら.my.cnfをセットしてログインできるようにしています。3rd Partyのロールを使う場合
geerlingguy.mysqlを使うとこんな感じのplaybookになります。- hosts: db_servers
become: true
user: vagrant
vars:
mysql_enablerepo: mysql56-community
mysql_disablerepo: mysql57-community
roles:
- geerlingguy.mysql
pre_tasks:
- name: Install packages
yum:
name: libselinux-python
state: present
when: ansible_os_family == "RedHat"
- name: Install the MySQL repo.
yum:
name: https://dev.mysql.com/get/mysql57-community-release-el6-11.noarch.rpm
state: present
when: ansible_os_family == "RedHat"
ロールはそのままでは利用できないので、geerlingguy.mysql/tasks/setup-RedHat.yml を書き換えます。disablerepo={{…}}のところが追加分です。
---
- name: Ensure MySQL packages are installed.
yum: "name={{ item }} state=installed enablerepo={{ mysql_enablerepo }} disablerepo={{ mysql_disablerepo }}"
with_items: "{{ mysql_packages }}"
register: rh_mysql_install_packages
- name: Ensure MySQL Python libraries are installed.
yum: "name=MySQL-python state=installed enablerepo={{ mysql_enablerepo }}"
基本的な要素は3rd Partyのロールを使わないパターンと同じです。メイン部分ではmysqldのインストールやルートのパスワード設定をやってくれるので、pre_tasksで最新リポジトリのインストールをすればOKです。また、libselinux-pythonもインストールが必要だったので加えています。