2017-08-21

ansibleを使ってCentOS 6にmysql5.6をインストール

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もインストールが必要だったので加えています。

参考URL

このエントリーをはてなブックマークに追加