LoginSignup
16
11

More than 3 years have passed since last update.

ansible in dockerお試しメモ

Last updated at Posted at 2019-01-22

目的

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
16
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
11