【Windows10】Ansible動作確認用にssh接続可能なコンテナを建てたい
## やりたかったこと
業務でAnsibleを使うようになったため、connection: local
でlocalhost向きにplaybookを実行することで、実行役と検証を1つの仮想ホスト内でやっていたが、環境変数読み込み等が原因でいざリモート作業環境にplaybookを移行した時にエラーが大量に出ていた。
HyperVが使えるWindows10PCが手に入ったので、Docker for WindowsでAnsible実行用コンテナ、作業対象のSSH接続先コンテナの2つを作り、疑似リモートAnsible構築検証をしたい。
参考サイト様
サーバサイド知識、Docker知識が底辺レベルのためとても助かりました。 というか、CentOSのバージョン以外、ほぼ丸パクリになってしまい申し訳ありません。。
- https://qiita.com/nijibox_tech/items/3cf6e9229d969e16e031
- https://qiita.com/xeres/items/6a32729916b07b37ea68
構成(雑)
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
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"]
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数個単位での動作確認では使えたのでとりあえず良いということにします!