Docker for WindowsからAnsibleを使ってみました。

記事タイトルとURLをコピーする

こんにちは、技術4課の城です。

先日Ansibleの記事を書いたのですが、実行環境が違うと同じコマンドを投入しても、様々な原因でErrorとなってしまうことがあります。
特に当社はBYOD(BringYourOwnDevice)制度によりメンバーの端末がMACだったり、Windowsだったりしますので、対応が必要です。
簡単に実行環境をそろえるにはコンテナじゃないですか!ということで、Docker for WindowsでAnsibleを使ってみました。

実施した環境

実施した環境は下記となります。

  • OS:Windows 10 Pro
  • バージョン:1709

Docker for Windowsのインストール

Docker for WindowsにはHyper-Vの有効化が必要です。
[コントロールパネル] > [プログラムと機能] > [Windowsの機能の有効化または無効化]からHyper-Vを有効化しましょう。
有効化した後に再起動が必要です。

公式インストールガイドからインストーラーをダウンロードし、インストールします。

Dockerfileの用意

Dockerfileは次のものを用意しました。
必要なパッケージ、モジュールのインストール、マウント用ディレクトリの作成を実行させてます。

FROM amazonlinux
MAINTAINER ****@serverworks.co.jp
RUN yum install python27-pip.noarch -y && \
    yum -y reinstall glibc-common && \
    yum remove -y python27-chardet.noarch && \
    pip install --upgrade pip && \
    pip install ansible==2.5.0 && \
    pip install pywinrm && \
    yum clean all && \
    mkdir /prj-data
ENV LANG ja_JP.UTF-8
CMD ["/bin/bash"]

Dockerイメージの構築

Docker for WindowsではPowershellからコマンドを実行しますので、Powershellを開きます。
※何も読まずにデスクトップのアイコンをクリックしまくった人がいるのは秘密です(笑)
Dockerfileを配置しているディレクトリに移動します。

cd [Dockerfileの配置しているディレクトリ]

Dockerイメージを構築します。タグを指定してます。

docker build -t ansible-test .

Dockerコンテナの実行

Dockerコンテナを実行します。
-vオプションでローカルディレクトリをコンテナの/prj-dataにマウントします。
このローカルディレクトリにはAnsibleのplaybook、role、inventory等のファイルを配置しています。

docker run -itd -v [マウントするローカルディレクトリ]:/prj-data ansible-test

その他のオプションについては下記リファレンスをご参照ください。
docker runのコマンドリファレンス

コンテナIDの確認

docker ps

【結果】
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
8b89e857e189        ansible-test        "/bin/bash"         27 hours ago        Up 6 seconds                            angry_montalcini

Dockerコンテナへの接続

今回はdocker execコマンドを利用しました。

docker exec -it 8b89e857e189 /bin/bash

オプションについては下記リファレンスをご参照ください。
docker execのコマンドリファレンス

【豆知識】execとattachの違い

コンテナのシェルに接続するにはexecとattachというコマンドが利用できます。
今回execを利用した理由はexit後もコンテナを起動したままにしておきたかったからです。
attachですとコンテナ実行時に起動したbashプロセスを利用するため、exitするとコンテナ自体が停止します。
ログイン後のプロセスを見てみると、execの方はPID:1のbash以外にもう一つbashプロセスが起動しているのが確認できます。

> docker attach d1a6ccb5ee86
bash-4.2# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 05:59 pts/0    00:00:00 /bin/bash
root         27      1  0 06:00 pts/0    00:00:00 ps -ef

> docker exec -it d1a6ccb5ee86 /bin/bash
bash-4.2# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 06:06 pts/0    00:00:00 /bin/bash
root          6      0  0 06:06 pts/1    00:00:00 /bin/bash
root         10      6  0 06:07 pts/1    00:00:00 ps -ef

Ansible実行

マウントしたディレクトリに移動し、Ansibleを実行してみます。

cd /prj-data

ansible test-windows2016 -i hosts -m win_ping
 
13.231.178.197 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

さいごに

思った以上に簡単に環境を用意することが出来て、少し驚きました。
コンテナ、と聞くと今まで身構えてしまっていましたが、今後は触っていこうと思います。
同じように「コンテナは触ったことがない」という方のお助けになれますと幸いです。

城 航太 (記事一覧)

サイトリライアビリティエンジニアリング部・CSM課・課長

AWSへの移行、AWSアカウントセキュリティ、ネットワーク広く浅くといった感じです。最近はAmazon WorkSpacesやAmazon AppStream2.0が好きです。APN Ambassador 2019,2020