15 Apr 2015, 17:11

Ansibleで最新のMySQLをインストールする。MySQL-shared-compatの役割。

CentOS 6.5環境でAnsibleを使って最新のMySQLのセットアップをしようと思った際にハマったことをまとめた。
本質的にはAnsibleというよりLinux RPMパッケージのはなし。 非常に簡単なサンプルコードも載せて解説します。

(1) 背景

まずは、本記事を書くに至った経緯から少し整理していきます。

  1. Ansibleでmysqlを使ったサーバを構築(CentOS6.5)することになった
    • MySQLのバージョンは5.6を採用
  2. MySQLの公式rpmをダウンロードしインストール
    • インストールしたもの
      • MySQL-client
      • MySQL-devel
      • MySQL-server
      • MySQL-shared
  3. MySQL-sharedをインストールする際にデフォルトのmysql-libsと競合しインストール失敗
  4. mysql-libsをアンインストールしインストールに再挑戦
  5. AnsibleでMySQLの操作をするにはMySQL-pythonが必要なのでインストール
  6. MySQL-pythonをインストールするにはさっきアンインストールしたmysql-libsが必要…
  7. 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つのパッケージがどんな役割を果たしているのか少しずつ興味もわいてきた。 いい勉強になったハマりだったかなと思う。

関連する記事はこちら
  • Kubernetes上のリソースをAnsibleで管理する (2019/08/21)
  • AnsibleのTerraform moduleを考察してみる (2019/03/25)
  • Vagrant×Ansible環境の3つのスタイルとそのメリット・デメリットについて (2016/01/25)
  • インフラのデプロイとテストを同時実行できるようにする (2015/12/17)
  • Ansible、実行速度高速化の実験。ControlMasterとPipeliningについて (2015/12/01)
  • comments powered by Disqus
    このエントリーをはてなブックマークに追加