Ansibleの実行環境をDockerで構築する
環境構築
各種設定ファイルをかく
以下のファイル構成
txthosts/
prd # ただのインベントリファイルなので割愛
Dockerfile
entrypoint.sh
site.yml # ただの site.yml なので割愛
ansible.cfg
docker-compose.yml
ファイルの中身
Dockerfile
DockerfileFROM python:3.7
RUN pip3 install ansible==2.9.10
COPY entrypoint.sh /usr/local/bin/
WORKDIR /
RUN wget https://networkgenomics.com/try/mitogen-0.2.9.tar.gz && \
tar xzf mitogen-0.2.9.tar.gz
RUN mkdir -p /etc/ansible
説明
後述の起動スクリプトを追加
設定ファイルの配置先のディレクトリを作成
entrypoint.sh
entrypoint.sh#!/bin/sh
set -eu
cp -r ~/hostssh ~/.ssh
chown -R root:root ~/.ssh
chmod -R 0600 ~/.ssh
chmod 0700 ~/.ssh ~/.ssh/conf.d
ansible-playbook -i hosts/prd site.yml "$@"
説明
ホストの .ssh
ディレクトリをマウントするけれど、そのままマウントするとホストユーザとコンテナ内のユーザでユーザが違うため権限の不一致が発生する
コンテナ起動時に .ssh
の設定ファイルをコピーして ~/.ssh
に配置して権限を変更するようにした
あとはansible-playbookを起動するコマンドを設定して引数を渡せるようにするだけ
ansible.cfg
ansible.cfg[defaults]
strategy_plugins = /mitogen-0.2.9/ansible_mitogen/plugins/strategy
strategy = mitogen_linear
display_ok_hosts = no
display_skipped_hosts = no
説明
display_ok_hosts
は差分がなかったログを画面出力しない
display_skipped_hosts
はスキップされたタスクは画面出力しない
変更があったタスクだけが画面に出力されるようになる
docker-compose
docker-compose.ymlversion: '3.7'
services:
ansible:
build:
context: .
dockerfile: Dockerfile
volumes:
- ".:/work:ro"
- "./ansible.cfg:/etc/ansible/ansible.cfg:ro"
- "$HOME/.ssh:/root/hostssh:ro"
working_dir: /work
entrypoint: entrypoint.sh
ansible-galaxy:
build:
context: .
dockerfile: Dockerfile
volumes:
- ".:/work"
working_dir: /work
entrypoint: ansible-galaxy install --roles-path ./roles
説明
services.ansible
作業ディレクトリのマウント
ansible.cfgのマウント
ホストのsshディレクトリをマウント
services.ansible-galaxy
使い方
上記ファイル構成の状態で以下のコマンドを実行する
sh# dry run
docker-compose run ansible --diff --check
# 実際に実行する
docker-compose run ansible --diff
# ansible-galaxyでロールをインストールする
# ex: node_exporterをインストールする
docker-compose run ansible-galaxy cloudalchemy.node-exporter
以上