なんかかきたい

プログラミングなどの個人的なメモやサークル「ゆきいろパラソル」の情報を載せてます

Ansibleのテスト環境をDockerで作ると楽

以前はVagrantを使ってansibleのテスト環境は用意していたんだけど、 vagrantはsnapshotが取れる利点がありつつも、VMを使うのでちょっとというかそれなりに遅くて、 何度も実行するansibleのテスト環境にはちょっと不便だなーと思っていたのですが、 最近Dockerを使ってsshdを起動するだけの環境を用意すれば簡単にテスト環境が作れて便利だったので書いておきます。

Dockerfileを書く

ansibleを流す対象のイメージは DockerfileFROM に書いておけばよくて、 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:30022SSHするようにinventoryファイルを用意しておいてansibleではこれを指定して実行するようにします。

ansible-playbook -i inventory/local -K -k playbook.yml

終わりに

まあ便利なんですが、Docker環境に移行し切ったらansibleとかいらないのではとか思いつつ、まああってもいいやという感じで悩み中ですね。

お仕事ではMySQLのでかいDBをいい感じにやってるのであんまり関係ないんですが、シュッとかける話がこれくらいしかなかったので今回はこんなところで。

最近、ラ!関係の旅行で福岡と函館に行ってきたのですが、どちらも最の高という感想なので、みんなも行くといいと思います。

月末は沼津花火大会、来月はコミケ。あ、原稿やります。みんな来てくれ〜〜〜〜

現場からは以上です。