こんにちは、技術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" }
さいごに
思った以上に簡単に環境を用意することが出来て、少し驚きました。
コンテナ、と聞くと今まで身構えてしまっていましたが、今後は触っていこうと思います。
同じように「コンテナは触ったことがない」という方のお助けになれますと幸いです。
城 航太 (記事一覧)
営業部カスタマーサクセス課・課長
AWSへの移行、AWSアカウントセキュリティ、ネットワーク広く浅くといった感じです。最近はAmazon WorkSpacesやAmazon AppStream2.0が好きです。APN Ambassador 2019,2020