generated at
Ansibleの実行環境をDockerで構築する
Ansibleの実行環境をdockerで構築する設定
virtualenvとかでpythonのバージョンを固定したりもできるけれど、それよりはdockerのほうが環境構築が楽だと思ったので

環境構築
dockerをインストールする
各種設定ファイルをかく
以下のファイル構成
txt
hosts/ prd # ただのインベントリファイルなので割愛 Dockerfile entrypoint.sh site.yml # ただの site.yml なので割愛 ansible.cfg docker-compose.yml
ファイルの中身
Dockerfile
Dockerfile
FROM 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
説明
pythonAnsibleのバージョンを指定
後述の起動スクリプトを追加
高速化のためにAnsibleMitogenをインストール
設定ファイルの配置先のディレクトリを作成
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
説明
AnsibleMitogenを有効にする設定2つ
display_ok_hosts は差分がなかったログを画面出力しない
display_skipped_hosts はスキップされたタスクは画面出力しない
変更があったタスクだけが画面に出力されるようになる
docker-compose
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を実行するためのサービス
作業ディレクトリのマウント
ansible.cfgのマウント
ホストのsshディレクトリをマウント
services.ansible-galaxy
AnsibleGalaxyでロールをダウンロードしてくるためだけのサービス
AnsibleGalaxyを使わないなら不要

使い方
上記ファイル構成の状態で以下のコマンドを実行する
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

以上