【Windows10】Ansible動作確認用にssh接続可能なコンテナを建てたい

 ## やりたかったこと 業務でAnsibleを使うようになったため、connection: locallocalhost向きにplaybookを実行することで、実行役と検証を1つの仮想ホスト内でやっていたが、環境変数読み込み等が原因でいざリモート作業環境にplaybookを移行した時にエラーが大量に出ていた。

HyperVが使えるWindows10PCが手に入ったので、Docker for WindowsでAnsible実行用コンテナ、作業対象のSSH接続先コンテナの2つを作り、疑似リモートAnsible構築検証をしたい。

参考サイト様

サーバサイド知識、Docker知識が底辺レベルのためとても助かりました。 というか、CentOSのバージョン以外、ほぼ丸パクリになってしまい申し訳ありません。。

構成(雑)

Dockerコンテナ構成はこんな感じ。

Windows10 Docker for Windows (HyperV)
├ansibleコンテナ (ubuntu) 
└targetコンテナ (centos7) 

※HyperVの有効化やDocker for Windowsの起動確認は予め確認すべし。

複数コンテナはdocker-compose.ymlを使うのが楽って聞いた!
servicesの直下に書いたサービス名をホスト名として使えて、docker-composeで構築したコンテナ内部ではDockerコンテナのIP(172.xxx.xxx.xxx)を指定しなくても良いらしい!
どうなってるのかよくわからんが、動くからヨシ!

 ## やったこと

ディレクトリパス

任意のディレクトリ
├docker-compose.yml *1
├ansible/
│ ├Dockerfile *2
│ └playbooks
│    ├extra-vars.yml *3
│    ├hosts *4
│    └test/
│       └playbook.yml *5
└target/
   └Dockerfile *6

6個もファイルがが・・


各ファイルの記述内容

先程のファイル群の内容を記述します。

docker-comopose.yml *1

version: '3'
services:
    ansible:
        build: ./ansible
        image: check_ansible
        volumes:
            - ./ansible/playbooks:/playbooks            
    target:
        build: ./target
        image: check_target
  • buildでDockerfileのディレクトリを記述した。
  • imageで docker-compose build で作成されるイメージ名を記述した。
  • volumesでホストの ansible/playbooks を ansibleコンテナ /playbooks にマウントした。

ansible/Dockerfile *2

FROM ubuntu

WORKDIR /playbooks

# ansible client install
RUN apt update && \
    apt install -y software-properties-common && \
    apt-add-repository ppa:ansible/ansible && \
    apt update && \
    apt install -y ansible
  • 参考サイトよりubuntuにansibleをインストールするansibleコンテナのビルド設定を記述
  • ディレクトリ構成の都合でWORKDIRを/playbooksに指定

ansible/playbooks/extra-vars.yml *3

playbookで使いたい変数値を好きに書いておきましょう。後でplaybook実行時に読み込ませてみます。

# 実行時に変数値記述ファイルとして読み込ませます

ansible/playbooks/hosts *4

ホスト情報を記載します。通常はIPやdomainを記述するところだが、 最初に記述したとおり、docker-compose.ymlで指定したservice名で記述できる。

[web]
target

ansible/playbooks/test/playbook.yml *5

実際に実行するplaybookです。 内容を書き換えて色々なmoduleを記述してみましょう。 配置パスは自分がわかる場所であれば適時変更して構いません。

- hosts: target
  tasks:
  - name: Install Vim
    yum: name=vim
  • vimをインストールする記述

target/Dockerfile *6

FROM centos:7

RUN yum -y install openssh-server
RUN ssh-keygen -A
RUN sed -ri 's/^#PermitEmptyPasswords no/PermitEmptyPasswords yes/' /etc/ssh/sshd_config
RUN echo "root:" | chpasswd

EXPOSE 22

CMD ["/usr/sbin/sshd", "-D"]
  • 参考サイトよりansibleコンテナからssh接続可能なtargetコンテナビルド設定を記述
  • イメージにcentos:7を指定

playbook実行手順

targetが起動していないといけないので、コンテナ起動→ansibleコンテナ内でbash起動→playbook実行という流れになります。

  • コンテナ起動&bash起動
docker-compose up -d
docker-compose run ansible bash
  • playbook実行
cd /playbooks
ansible-playbook test/playbook.yml -e @/playbooks/extra-vars.yml -i /playbooks/hosts
  • ansible-playbookコマンドで作成済みのplaybook.ymlファイルを実行できる。
    • -eで@付きのファイルパスを書くと変数ファイルを読み込んでくれる。
    • -iでインベントリファイルを読み込んでくれる。

できなかったこと

本来動作確認したかったplaybookを丸々testディレクトリに配置して、ansible-playbook実行してみたがエラーが解消できなかった。
ミドルウェアとかが不足していたんだろうけど。。 (本番では成功したので助かった。)

複雑なことを検証しようとすると設定が全然足りないっぽいですが module数個単位での動作確認では使えたのでとりあえず良いということにします!