ぶるーすくりーん

ぽんこつプログラマ日記

Dockerでansibleを実行してEC2インスタンスをプロビジョニング

ansibleでDockerコンテナをプロビジョニングする例は割りとあるのですが、ansibleをDockerで実行してリモートホストをプロビジョニングするって方法があまり見当たらなかったのでメモ。

ついでに、EC2インスタンスをプロビジョニングにするためには、pemファイルどうしよっかなみたいなとこも触れています。

Dockerfile

ansible / ubuntu14.04-ansible を利用しています。

関連ファイル類

ansible用のリソース

とりあえず、とってもシンプルに以下のファイルを準備。

ansible/
├── hosts             # インベントリファイル
└── site.yml          # メインのプレイブック
  • ansible/hosts
[test-hosts]
{EC2インスタンスのパブリックDNSを指定}
  • ansible/site.yml
- hosts: test-hosts
  remote_user: ubuntu
  sudo: yes
  tasks:
  - name: update apt cache
    apt: update_cache=yes

EC2インスタンス接続用のpemファイル

ansible関連の資材はgithubとかbitbucketとかにのせたいので、公開鍵ファイルはansible関連の資材とは別のディレクトリに置いておく。

{path to pem file dir}/mid0111-tokyo-test.pem

実行コマンド

docker コマンド実行時に、ansible関連の資材のディレクトリと公開鍵を格納したディレクトリをそれぞれマウントしてあげればOK。

疎通確認

docker run -it --rm --name ansible \
-v `pwd`/ansible:/tmp/ansible \
-v {path to pem file dir}:/root/pem \
ansible/ubuntu14.04-ansible:stable \
ansible --private-key="/root/pem/mid0111-tokyo-test.pem" -i /tmp/ansible/hosts all -m ping -u ubuntu

プレイブック実行

docker run -it --rm --name ansible \
-v `pwd`/ansible:/tmp/ansible \
-v {path to pem file dir}:/root/pem \
ansible/ubuntu14.04-ansible:stable \
ansible-playbook /tmp/ansible/site.yml --private-key="/root/pem/mid0111-tokyo-test.pem" -i /tmp/ansible/hosts