Ansibleの実行環境をDockerで構築する
環境構築
各種設定ファイルをかく
以下のファイル構成
code:txt
hosts/
prd # ただのインベントリファイルなので割愛
Dockerfile
entrypoint.sh
site.yml # ただの site.yml なので割愛
ansible.cfg
docker-compose.yml
ファイルの中身
Dockerfile
code:Dockerfile
FROM python:3.7
RUN pip3 install ansible==2.9.10
COPY entrypoint.sh /usr/local/bin/
WORKDIR /
tar xzf mitogen-0.2.9.tar.gz
RUN mkdir -p /etc/ansible
説明
後述の起動スクリプトを追加
設定ファイルの配置先のディレクトリを作成
entrypoint.sh
code:entrypoint.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
code:ansible.cfg
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
code:docker-compose.yml
version: '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
使い方
上記ファイル構成の状態で以下のコマンドを実行する
code: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
以上