以前はVagrantを使ってansibleのテスト環境は用意していたんだけど、 vagrantはsnapshotが取れる利点がありつつも、VMを使うのでちょっとというかそれなりに遅くて、 何度も実行するansibleのテスト環境にはちょっと不便だなーと思っていたのですが、 最近Dockerを使ってsshdを起動するだけの環境を用意すれば簡単にテスト環境が作れて便利だったので書いておきます。
Dockerfileを書く
ansibleを流す対象のイメージは Dockerfile
の FROM
に書いておけばよくて、
CentOSとかDebianとか好きなOSを選べばいいと思います。
Dockerfileを置いたディレクトリに id_rsa.pub
を置いておくと authorized_keys
にコピーされるというソリューションです。
FROM amazonlinux:latest MAINTAINER cyrill RUN yum install -y sudo shadow-utils RUN useradd -g wheel ec2-user && echo "ec2-user:ec2-user" | chpasswd ;\ mkdir /home/ec2-user/.ssh;\ sed -i -e 's/^\(%wheel\s\+.\+\)/#\1/gi' /etc/sudoers ;\ echo -e '\n%wheel ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers && \ echo -e '\nDefaults:root !requiretty' >> /etc/sudoers && \ echo -e '\nDefaults:%wheel !requiretty' >> /etc/sudoers ADD id_rsa.pub /home/ec2-user/.ssh/authorized_keys RUN yum install -y openssh-server openssh-clients && \ ssh-keygen -q -b 1024 -N '' -t rsa -f /etc/ssh/ssh_host_rsa_key && \ ssh-keygen -q -b 1024 -N '' -t dsa -f /etc/ssh/ssh_host_dsa_key && \ ssh-keygen -q -b 521 -N '' -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key && \ sed -i -r 's/.?UseDNS\syes/UseDNS no/' /etc/ssh/sshd_config && \ sed -i -r 's/.?ChallengeResponseAuthentication.+/ChallengeResponseAuthentication no/' /etc/ssh/sshd_config && \ sed -i -r 's/.?PermitRootLogin.+/PermitRootLogin yes/' /etc/ssh/sshd_config && \ echo "root:root" | chpasswd RUN rm -rf /var/cache/yum/* && yum clean all CMD ["/usr/sbin/sshd", "-D"]
最近気づいたんですが、AmazonLinuxのDocker Imageとか配布されてるんですね。 EC2環境のテストにも便利です。よいですね。
Makefileを書く
毎回 docker build
して docker run
してもいいんですが、
正直に言えばdockerのコマンドオプションは覚えやすい感じもないので、
シュッと実行できるようにMakefileを書きます。
シェルスクリプトでもいいのではというご意見もあるかなとは思いますが、
make
とか make clean
とかテスト環境を作ったり消したりするイメージには合ってる感じがして
割と気に入ってます。気にいらないタイプの方は他の好きなツールを使うといいと思います。
.DEFAULT: all all: container run container: docker build . -t ansible run: docker run -d --name ansible -p 30022:22 ansible attach: docker run -it --name ansible -p 30022:22 ansible /bin/bash clean: docker stop ansible && docker rm ansible
こんな感じのMakefileを置いておいて、make
するとsshができる環境が用意されます。
テスト環境を捨てたいときは make clean
して make
すると最初からやり直せます。便利ですね。
ansibleのinventoryファイルを書く
docker run
するとローカルでsshできる環境ができるので、
localhost:30022
にSSHするようにinventoryファイルを用意しておいてansibleではこれを指定して実行するようにします。
ansible-playbook -i inventory/local -K -k playbook.yml
終わりに
まあ便利なんですが、Docker環境に移行し切ったらansibleとかいらないのではとか思いつつ、まああってもいいやという感じで悩み中ですね。
お仕事ではMySQLのでかいDBをいい感じにやってるのであんまり関係ないんですが、シュッとかける話がこれくらいしかなかったので今回はこんなところで。
最近、ラ!関係の旅行で福岡と函館に行ってきたのですが、どちらも最の高という感想なので、みんなも行くといいと思います。
月末は沼津花火大会、来月はコミケ。あ、原稿やります。みんな来てくれ〜〜〜〜
現場からは以上です。