ansible in dockerお試しメモ

#目的
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
```