Ansible で MySQL の yum リポジトリを登録するタスクで考えたこと（どっちかっていうとroopの使い方？）

# はじめに

MySQL を yum でインストールしようと思って、コミュニティ版のrpmを持ってきて、enabled=0 にしようと思った時に、Ansible タスクにして考えたことをメモっておいて、後からやる人たちが同じことで迷わないでいいように。

MySQL の rpm って、デフォルトで enabled=1 にするやつが rpm ごとに違う。（指定バージョンが1になるようになってる）
ダメじゃないんだけど、個人的に指定時以外は止めておきたい派。特に開発メンバーに配布する vagrant 用とかは止めてあげないと、不用意に yum update とかされても困るし。そもそも本番機も止めるし。

というわけで、Ansible で構成する時に、どうやって enabled=1 を 0 にするかで、いろいろ考えたことをメモとして残している。

## ちょっと考えてから作ったけど問題がある版

* そもそも、ini_file: で一個ずつ書くの面倒。。。ｗ
* 一括で書き直す方式だと sed が出てくるわけですよ。。。
* 正直、enabled=1 を enabled=0 にするだけなのに sed とかマジ勘弁して欲しい。
 * 実コマンドを指定するのは最後の最後の手段だと思う。楽だろうけど、逃げだろ、それ。
* templates や files で送り付けるのは、rpm の内容が変更された時に追従できないからそもそもアウト。
 * httpdやnginxのvconf送るとかはそれでいいけど、rpmのリポジトリファイルはダメだろ。
* というわけで、lineinfile: でループさせて消すことにした。

<pre>
- name: repo | mysql
  # see. http://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html
  yum: name=https://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm state=present
- name: repo | mysql | disabled
  lineinfile: dest=/etc/yum.repos.d/mysql-community.repo regexp='^enabled=1' line='enabled=0' state=present
  with_items: [1,2,3] # これな。 item 使わなくてもループする。この場合３回。
- name: repo | mysql | disabled (-source) | check it if changed.
  lineinfile: dest=/etc/yum.repos.d/mysql-community-source.repo regexp='^enabled=1' line='enabled=0' state=present
</pre>

## 問題点

空ループは我ながら悪くない案だと思ったんだけど、、、

* 実行回数を with_items の配列で表現するの、まずダサいｗ
* コードとしては問題なくても、やりたいことを伝えるのにイマイチ感強い
 * これだと sed で書くほうが見た目マシになっちゃうｗｗ
* じつはこれで複数回回すと、ファイルの末尾に enabled=0 が追加されてしまうｗ
 * lineinfile の state を present にしてると、regexpが見つからなかった時にファイル末尾に追加してくれてしまう仕様みたい？
 * だからって state を absent にすると、今度は見つけた enabled=1 を削除してくれちゃうってゆうね。。。
* つまりべきとうせいってやつが担保できないワケですよ。。。

## 改善したかった点

* 実コマンドは使いたくない（逃げちゃダメだ逃げちゃダメだ逃げ（ｒｙ
* やりたいことを適切に伝えるコードにしたい
* 変更があった時にきちんとログに残るようにしたい
* できればrpm側の変更に気が付きたい
* べきとうせいの担保は絶対

## 出来上がったコード

<pre>
- name: repo | mysql
  # see. http://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html
  yum: name=https://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm state=present
- name: repo | mysql | disabled
  ini_file: dest=/etc/yum.repos.d/mysql-community.repo
            section={{ item }}
            option=enabled
            value=0
  with_items:
    - mysql-connectors-community
    - mysql-tools-community
    - mysql55-community
    - mysql56-community
    - mysql57-community-dmr
- name: repo | mysql | disabled (-source)
  ini_file: dest=/etc/yum.repos.d/mysql-community-source.repo
            section={{ item }}
            option=enabled
            value=0
  with_items:
    - mysql-connectors-community-source
    - mysql-tools-community-source
    - mysql55-community-source
    - mysql56-community-source
    - mysql57-community-dmr-source
</pre>

## うまく改善できた点

* インプット
 * dest が ini ファイルだと伝わる（はず）
 * 指定セクションの enabled を 0 にしようとしていると伝わる（はず）
* アウトプット
 * 実行してみるとわかるけど、ログが見やすい
 * どのセクションで変更があったかもわかる
* もしかしてだけど
 * 57の dmr が外されたら、気が付くはず

## おまけのメモ

* yum で 使う時は、enablerepo=mysql-\*,mysql55\* とかするといいよ！
* 小出しにしてあれだけど、whenを使うともうちょっといい感じにもなるよ！
* 世間のAnsiblerさんたちって、べきとうせいと手作業と作業時間のバランスをどうしてるのかな。
 * コメントで議論するつもりはないので、さくっとコメント残していってくれるとうれしいよ。
* MySQL から MariaDB への移行ってどうなの？俺今コード書いてないからその辺りがすげぇおろそかになってる。
 * CentOSも6.5で使ってるから気にしてないけど、急に7にしろとか言われたら困る。。。
 * この辺りのこともコメント残していってくれたらうれしいよ！