目的
dockerコンテナでansibleコマンドを実行し、EC2をプロビジョニングしたい。
ちょっと調べても「dockerコンテナにansibleコマンドを実行し、イメージをプロビジョニングする。」の方しか見つからなかった...
dockerhubに用意されている↓も普段使いを想定していないようなので、自分で探り探り用意してみました。
https://hub.docker.com/r/ansible/ansible
ローカル環境
macです
# docker -v
Docker version 18.09.1, build 4c52b90
# docker-compose version
docker-compose version 1.23.2, build 1110ad01
docker-py version: 3.6.0
CPython version: 3.6.6
OpenSSL version: OpenSSL 1.1.0h 27 Mar 2018
ファイル構成
お試し版なのでシンプル
# tree
.
├── Dockerfile
├── docker-compose.yaml
├── hosts
└── operation.yaml
Dockerfile
FROM alpine:latest
RUN apk --update add --no-cache \
ansible py3-pip \
openssh
RUN pip3 install --upgrade pip botocore boto3
RUN mkdir /root/.ssh
WORKDIR /home
ENTRYPOINT ["ansible"]
python:3.7-alpine3.8 のバージョン固定にあまり深い意味はないです
apkから入れたansibleがpython3.6.6を利用していたことなどから、上記バージョン固定を使った場合に(後述のお試しタスクではひっかからないタイプの)不具合がみつかりました。
少しDockerfileの内容を更新しています。深い意味のない決定はよくなかった。
docker-compose.yaml
version: '3'
services:
ansible:
build: .
volumes:
- ./:/home
- ~/.ssh/:/root/.ssh/
ansible-playbook:
build: .
entrypoint:
- ansible-playbook
volumes:
- ./:/home
- ~/.ssh/:/root/.ssh/
hosts
[targets]
t3-test
今回はローカルの ~/.ssh/config
に設定されているホスト名を利用します。
volumeマウント設定の都合で、./
あるいは~/.ssh/
配下に秘密鍵を置く必要があります。
operation.yaml
- hosts: targets
user: ec2-user
become: yes
tasks:
- file: path=/home/ec2-user/test state=directory owner=ec2-user group=ec2-user mode=0755
テストファイルを作成するだけ
Usage
上記4ファイルを設置後、以下コマンドを実行
docker-compose run --rm ansible 何某
docker-compose run --rm ansible-playbook 何某
ファイルの置いてあるディレクトリ上で、 docker-compose run --rm
の後にいつものansible/ansible-playbookコマンドを引数付きで叩けばうごく
# docker-compose run --rm ansible --version
ansible 2.5.5
config file = None
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.6.6 (default, Aug 24 2018, 05:04:18) [GCC 6.4.0]
こんなかんじですね
というわけで、
# docker-compose run --rm ansible-playbook -i hosts operation.yaml -D
PLAY [targets] ******************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************
ok: [t3-test]
TASK [file] *********************************************************************************************************************************
--- before
+++ after
@@ -1,6 +1,6 @@
{
- "group": 0,
- "owner": 0,
+ "group": 500,
+ "owner": 500,
"path": "/home/ec2-user/test",
- "state": "absent"
+ "state": "directory"
}
changed: [t3-test]
PLAY RECAP **********************************************************************************************************************************
t3-test : ok=2 changed=1 unreachable=0 failed=0
できた
まとめ
・docker-composeで単発コマンド実行するのたのしい!
・もう少し丁寧な記事を書いた方がいい気がする
Tips
docker-composeのオプション--rm
は、「コマンド終了したコンテナは削除して」の意味。忘れても動くが、あとにstop状態のコンテナが残ってしまう。
つけ忘れてコンテナが残ってしまった場合は以下でお掃除
docker-compose down