LoginSignup
0
0

More than 1 year has passed since last update.

dockerfileとdocker-composeでAnsible実行環境構築

Last updated at Posted at 2022-10-23

はじめに

色んな方が公開してくださっているdocker-compose.ymlの内容を修正して使用させてもらっているが、自分でDockerfile、docker-compose.ymlの内容を最初から作成したことがありませんでした。そのためDockerの勉強として試行錯誤してAnsibleの実行環境を用意したので備忘として記載します。

目標

  • Dockerfile, docker-compose.ymlを自分で最初から作成する。勉強目的なので、そこまで内容は凝らない
  • Dockerで作成するのはAnsible実行環境とする(自分の知識の中でちょうどいいのがこれだった)
  • 実行時の手間を削減するためAnsible実行時はコンテナ内に入らずdocker execで実行できるようにする

ディレクトリ構成

.
`-- ansible
    |-- Dockerfile
    |-- ansible_dir
    |   |-- conf
    |   |   |-- ansible.cfg
    |   |   |-- ansible.cfg.org
    |   |   `-- hosts
    |   `-- playbook
    |       `-- ping.yml
    `-- docker-compose.yml

Dockerfile

Dockerfile
FROM alpine
RUN apk --update-cache --no-cache add py3-pip openssh sshpass \
 && pip3 install ansible

OSは軽量コンテナイメージのAlpine Linux。
Ansibleはpipでインストールする。そのためpipのインストール、Ansible実行時に表示されたエラーメッセージを元にopensshsshpassをインストール。
ちなみに--no-cacheオプション付与の有無で2MB程度の差が出た。
--update-cacheapk updateを行うオプションらしい。裏取りしてないので本当か不明。

docker-compose.yml

docker-compose.yml
version: '3'

services:
  ansible:
    build:
      context: .
      dockerfile: Dockerfile
    image: ansible:latest
    container_name: ansible
    environment:
      - ANSIBLE_CONFIG=/opt/conf/ansible.cfg
    volumes:
      - ./ansible_dir:/opt/
    working_dir: /opt/playbook
    command: tail -f /dev/null

環境変数ANSIBLE_CONFIGでansible.cfgのパスを指定し、ansible.cfgを編集することでパラメータを設定。
ansible.cfgやインベントリファイル(hosts)、playbookを都度コンテナに入って編集するのは面倒なので、ホストのansible_dir配下に格納して置き、バインドマウントでコンテナに入らず修正できるようにしておく。
working_dirをplaybook格納先にしておくことで、./ansible_dir/playbook/配下でansible-playbookを実行しようとした際に、playbook指定が楽になる。
commandはコンテナが停止してしまうことの抑止。Dockerfileに記載してもいいかも。

Ansible実行例

テストファイル

インベントリファイル

hosts
[test]
192.168.1.8

[all:vars]
ansible_user=<user name>
ansible_password=<password>

Ansible設定

ansible.cfg
[defaults]
inventory      = /opt/conf/hosts
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null

毎回インベントリファイル指定は面倒なので指定しておく。
初回アクセス時やサーバ作り直ししたとき、フィンガープリント関係でエラーになるのが面倒なので以下を参考にsshのオプション設定。

ControlMasterControlPersistは有効にしておくとAnsibleの処理速度が速くなるらしいので参考にしたオプションをそのまま流用。

テスト用playbook

あくまでテスト用なのでpingモジュールだけ。

ping.yml
- hosts: all
  gather_facts: true

  tasks:
    - name: ping test
      ping:

テスト

ansibleansible-playbookコマンド両方を実行。どちらもピンポンできること確認できました。


[root@docker ansible]# docker exec -it ansible ansible 192.168.1.8 -m ping
192.168.1.8 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

[root@docker playbook]# docker exec -it ansible ansible-playbook -l 192.168.1.8 ping.yml

PLAY [all] **************************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************************
ok: [192.168.1.8]

TASK [ping test] ********************************************************************************************************************************************
ok: [192.168.1.8]

PLAY RECAP **************************************************************************************************************************************************
192.168.1.8                : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

おわりに

簡単なものですが、Dockerfileとdocker-compose.ymlファイルの作成が出来ました。
今回Alpine LinuxでAnsibleのコンテナイメージを作成してサイズは457MBだったのですが、以下のリポジトリを見ると367MBまで縮小できるようですね。pipでインストールしたので、pip周りのオプションの見直しやコンパイルしてインストールする方法などをすれば小さくできるのでしょうか。

そこまでコンテナイメージのダイエットに今興味があるわけではないので、いったん今回はこれで終了にします。

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