CentOS 6.5環境でAnsibleを使って最新のMySQLのセットアップをしようと思った際にハマったことをまとめた。
本質的にはAnsibleというよりLinux RPMパッケージのはなし。
非常に簡単なサンプルコードも載せて解説します。
(1) 背景
まずは、本記事を書くに至った経緯から少し整理していきます。
- Ansibleでmysqlを使ったサーバを構築(CentOS6.5)することになった
- MySQLのバージョンは5.6を採用
- MySQLの公式rpmをダウンロードしインストール
- インストールしたもの
- MySQL-client
- MySQL-devel
- MySQL-server
- MySQL-shared
- インストールしたもの
- MySQL-sharedをインストールする際にデフォルトの
mysql-libs
と競合しインストール失敗 - mysql-libsをアンインストールしインストールに再挑戦
- AnsibleでMySQLの操作をするにはMySQL-pythonが必要なのでインストール
- MySQL-pythonをインストールするにはさっきアンインストールしたmysql-libsが必要…
- MySQL-shared-compatというパッケージの役割を知る
(2) MySQL-shared-compatというパッケージ
上で起きたことを一言でまとめると、mysql-libsというパッケージは多くの他のパッケージの依存関係となっており、公式のMySQL5.6をインストールすることで、他のパッケージがいれられない状況となっていた。
そんな状況を解決するためにMySQL-shared-compatというパッケージが用意されている。
MySQL-shared-compatは「過去のMySQLバージョン向けの共有クライアントライブラリが納められているもの」だ。
このパッケージをインストールすることで、mysql-libsの代わりになり、mysql-libsをインストールしなくても他のソフトウエアをインスーツできるようになる。
パッケージの詳細を知りたい方は下記参照をおすすめ。
MySQL-5.5.6から仕様が変わった「MySQL-shared-compat」の中身を徹底解剖 - Y-Ken Studio<
ちなみに豆知識だが、この業界で"compat"という単語がよく使われるが、これは"compatibility"の略で「互換性」とかそういう意味。
(3) サンプルコード
内容は非常に簡単なものだが、MySQLをインストールするansibleをGithubにあげた。playbookを書く参考になればと。 mosuke5/mysql-ansible · GitHub特徴としては、インターネット上からRPMをダウンロードしてインストールする際に、
Ansibleでも「ダウンロード」→「インストール」の流れを踏む人が多いが、以下のようにするとシンプルになる。
varsでインストールしたいrpmやその取得先を記述しておいて、task側ではyumでnameにvarsで定義した変数を読むだけでできる。
role/mysql/vars/main.yml
mysql_url: http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6
mysql_ver: "5.6.24-1"
mysql_rpms:
- MySQL-client-{{ mysql_ver }}.el6.x86_64.rpm
- MySQL-shared-compat-{{ mysql_ver }}.el6.x86_64.rpm
- MySQL-shared-{{ mysql_ver }}.el6.x86_64.rpm
- MySQL-devel-{{ mysql_ver }}.el6.x86_64.rpm
- MySQL-server-{{ mysql_ver }}.el6.x86_64.rpm
role/mysql/tasks/main.yml
- name: Install MySQL without MySQL-shared
yum: name={{ mysql_url}}/{{ item }}
with_items: mysql_rpms
(4) まとめ
パッケージ管理のデッドロックにハマってしまい、どうしようかと悩んでいたが、 よくしらべると解決策をきちんと用意してくれていた。 こうやってみていくと1つ1つのパッケージがどんな役割を果たしているのか少しずつ興味もわいてきた。 いい勉強になったハマりだったかなと思う。