前回ansibleでmysqlのインストールで手こずったのでメモです。
上記のURLで紹介しているMySQLは http://ftp.jaist.ac.jp/ からインストールしていました。
苦しかったymlの書き方
---
- hosts: local.example.com
sudo: yes
vars:
mysql_url: http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6
mysql_ver: "5.6.26-1"
mysql_items:
- rpm: MySQL-client-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-devel-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-server-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-shared-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-shared-compat-{{ mysql_ver }}.el6.x86_64.rpm
tasks:
- name: install mysql
yum: name={{ mysql_url }}/{{ item.rpm }} state=present
with_items: mysql_items
- name: start mysql
service: name=mysql state=started enabled=yes
- name: get mysql password
shell: cat /root/.mysql_secret | awk '{print $18}'
register: mysql_root_password
- name: setup mysql root
command: mysqladmin -u root password {{ mysql_root_password.stdout }}
- name: copy .my.cnf
template: src=.my.cnf.j2 dest=/root/.my.cnf owner=root mode=0600
- name: setup mysql database
mysql_db: name=test state=present
- name: setup mysql user
mysql_user: name=test password=pass priv=*.*:ALL,GRANT state=present
何をやっているのかというと、
実行するホストを宣言します。
- hosts: local.example.com
sudoで全部実行することを宣言します。
sudo: yes
varsで変数に値を入れています。
vars:
mysql_url: http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6
mysql_ver: "5.6.26-1"
mysql_items:
- rpm: MySQL-client-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-devel-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-server-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-shared-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-shared-compat-{{ mysql_ver }}.el6.x86_64.rpm
ansibleで実行するタスクを書いていきます。
tasks:
yumでmysqlを引っ張ってきます。
- name: install mysql
yum: name={{ mysql_url }}/{{ item.rpm }} state=present
with_items: mysql_items
mysqlをrestart。
- name: start mysql
service: name=mysql state=started enabled=yes
初期パスワードが.mysql_secret内に記述されているため、パスワードだけawkで抜き出して変数に設定します。
- name: get mysql password
shell: cat /root/.mysql_secret | awk '{print $18}'
register: mysql_root_password
rootのパスワードを設定しないと、ansibleから実行すると
failed: [...] msg: unable to connect to database, check login_user and login_password are correct or ~/.my.cnf has the credentials.
とエラーが出てしまうので、先ほどの初期設定パスワードで上書きします。
- name: setup mysql root
command: mysqladmin -u root password {{ mysql_root_password.stdout }}
.my.cnfが無いと上記と同じエラーが起きるので、あらかじめ用意してある.my.cnfに先ほど設定したパスワードを設定してVagrantサーバー上にコピーします。
- name: copy .my.cnf
template: src=.my.cnf.j2 dest=/root/.my.cnf owner=root mode=0600
testデーターベース作成。
- name: setup mysql database
mysql_db: name=test state=present
testユーザー作成。
- name: setup mysql user
mysql_user: name=test password=pass priv=*.*:ALL,GRANT state=present
と、いうのが前回の記事。
実はそんなことしなくても、MySQL本家 http://dev.mysql.com/ からインストールすれば上記よりも四苦八苦はしなくて良かったです。
正解のymlの書き方
---
- hosts: local.example.com
sudo: yes
vars:
mysql_url: http://dev.mysql.com/get/Downloads/MySQL-5.6
mysql_ver: "5.6.26-1"
mysql_items:
- rpm: MySQL-client-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-devel-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-server-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-shared-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-shared-compat-{{ mysql_ver }}.el6.x86_64.rpm
tasks:
- name: install mysql
yum: name={{ mysql_url }}/{{ item.rpm }} state=present
with_items: mysql_items
- name: start mysql
service: name=mysql state=restarted enabled=yes
- name: get mysql password
shell: cat /root/.mysql_secret | awk '{print $18}'
register: mysql_root_password
- name: copy .my.cnf
template: src=.my.cnf.j2 dest=/root/.my.cnf owner=root mode=0600
- name: setup mysql database
mysql_db: name=test state=present
- name: setup mysql user
mysql_user: name=test password=pass priv=*.*:ALL,GRANT state=present
わざわざrootのパスワード設定しなくても動きました。
こっちのほうが重くないので本家以外からインストールしている人は見直してみるといいかもしれません。
MySQL5.5だと、更に.mysql_secret自体が無くなり、my.cnfのコピーも不要になりもっと楽に設定できます(rootはノンパス)。