lycheejam's tech log

チラ裏のメモ帳 | プログラミングは苦手、インフラが得意なつもり。

Ansible ProvisionerでMySQLを対象としたansible roleのテストをする

概要

ansible roleのテストを行うときにVagrantのAnsible Provisionerを使ってるわけですが
MySQLとかのDBを対象としたタスクのテストをしようと思うと、MySQL環境を構築しなければならず面倒です。
なので、MySQL環境構築のスクリプトを書きました。
書きましたと言ってもネットに落ちてるやつ拝借しただけですが。

目次

参考サイト様

前提

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.4
BuildVersion:   19E287
$ python -V
Python 3.7.7
$ vagrant --version
Vagrant 2.2.7

想定シーン

  • ansible MySQL moduleを使ってよしなにしたい

成果物

ほぼ、参考サイト様のパクリです。

$script = <<-SCRIPT
lookFile=/home/vagrant/provisioner.lock
if [ ! -e $lookFile ]; then
  touch $lookFile
  yum -y remove mariadb-libs
  rm -rf /var/lib/mysql
  yum -y localinstall http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
  yum -y install mysql-community-server
  cat << __CONF__ >> /etc/my.cnf
character-set-server = utf8
default_password_lifetime = 0
__CONF__
  systemctl enable mysqld
  systemctl start mysqld
  password=`cat /var/log/mysqld.log | grep "A temporary password" | tr ' ' '\n' | tail -n1`
  mysql -u root -p${password} --connect-expired-password << EOT
SET password FOR root@localhost=password('uQvdquWj3=bW');
SET global validate_password_policy=LOW;
SET global validate_password_length=6;
SET password FOR root@localhost=password('vagrant');
EOT
fi
SCRIPT

Vagrant.configure("2") do |config|
  config.vm.box = "gbailey/amzn2"
  config.vm.provision "shell", inline: $script

  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "tests/test.yml"
    ansible.become = true
    ansible.limit = "all"
    ansible.compatibility_mode = "2.0"
  end
end

読んでそのまんまです。
$scriptMySQL構築用スクリプトを突っ込んで、vmがプロビジョニングされると実行されるようにしています。
ただ、ansibleのテストを複数回流す絡みでvagrant provisionを実行するたびスクリプトが流れると嫌なので下記で制御します。

lookFile=/home/vagrant/provisioner.lock
if [ ! -e $lookFile ]; then
  touch $lookFile
  # 省略
fi

よくある、空のファイル作って実行済みか判定するやつっすね。

以上

雑感

GitHubリポジトリをパブリックにしたいのだけれど...

あと、このVagrantファイルあまり安定してないかも?初回でうまくいくときと行かないときがある。
エラー的にはyumのプロセスがうんたらってなってるので、MySQL構築用に流してるスクリプトとansibleのtaskでバッティングしてるのかも?
よくわからんけど。