Windows10 に ゼロから Ansible をインストールする(Ansible for Windows)

Windows10にAnsibleを設定する手順をまとめました。

## はじめに

オンプレミス環境のWindowsServerの構築・管理を自動化したいと思ったのがきっかけでAnsibleに興味を持ちました。
ところが、管理対象としてWindowsの事例はあってもAnsible本体をWindowsに置く方法がなかなかみつからず。試してみたことをまとめました。

次の記事：
　　[WindowsServerをAnsibleでリモート管理するための第一歩](https://qiita.com/Tkm_Kit/items/976587a086a08a0c613a)
　　[IISにWebサイトを追加するplaybookサンプル](https://qiita.com/Tkm_Kit/items/3d15656a337c3e497d85)

## Ansible稼働環境
- Windows 10 Pro (バージョン1803)
- PowerShell 5.1
- ActiveDirectory ドメインに属する

Windowsホスト上でAnsibleを設置するには、大きく２つの方法があります
1. Linux For Windows ＋ Ansible
2. Docker For Windows + LinuxOS Image + Ansible

今回は「2. Docker For Windows」の上にAnsibleを設定する方法を選択しました。
- Docker for Windows 18.06.1

こちらの記事が大変参考になりました。
「Docker for WindowsからAnsibleを使ってみました。」
http://blog.serverworks.co.jp/tech/2018/04/11/ansible-docker-for-windows/

上の記事ではamazonlinuxを使っていらっしゃいましたが、今回はCentOSイメージを使います。

## 設定手順
### Hyper-Vを有効にする
「コントロールパネル＞プログラムと機能＞Windowsの機能の有効化または無効化」からHyper-Vを有効にします。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/290708/a8b05788-6697-8be2-d860-4fd9fa5a29af.png)

### Docker for Windowsのインストール
https://store.docker.com/editions/community/docker-ce-desktop-windows
インストーラーのダウンロードにはユーザー登録が必要です。「Login」→「Create Account」でユーザー登録を済ませます。登録の際に決めたユーザー名が後ほど必要になります。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/290708/53876abd-a7dd-ad68-5d3a-96d0400a5d84.png)

インストーラ(Docker for Windows Installer.exe)サイズは512MBあります。

### Ansible用のDockerを立ち上げる
最初にテキストエディタで「DockerFile」という名前のファイルを作成します。
前述記事内のDockerFileを元にCentOS用にカスタマイズしています。

```yml:DockerFile

FROM centos
MAINTAINER xxxxx@xxxxxxxxxxx.xx.xx
RUN yum -y install epel-release && yum clean all
RUN yum -y install python-pip && yum clean all
RUN yum -y reinstall glibc-common && \
    pip install --upgrade pip && \
    pip install ansible==2.6.4 && \
    pip install pywinrm && \
    yum clean all && \
    mkdir /mydata
ENV LANG ja_JP.UTF-8
CMD ["/bin/bash"]
```

次にPowerShellを管理者モードで起動し、docker pullを通すために初回のみdocker loginを実行します。このときUsernameにメールアドレスではなく登録時に指定したユーザー名を入力するのがポイントです。

```
PS> docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username(xxxxx@xxxxx.xxx.xxx): 《メールアドレスではなく登録したUserNameを入力する》
Password:
Login Succeeded
```

先ほど作ったDockerFileの保存フォルダ(ここでは「D:\Projects\SRE\Ansible」)に移動しDockerイメージを構築します。

```
PS> cd D:\Projects\SRE\Ansible
PS> docker build -t my-ansible .
```

作成したDockerイメージを確認します。

```
PS> docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
my-ansible                 latest              ea11980ca160        14 minutes ago      378MB
centos                     latest              5182e96772bf        5 weeks ago         200MB
docker4w/nsenter-dockerd   latest              cae870735e91        10 months ago       187kB
```

Dockerコンテナーを起動します。このときDocker内からアクセス可能なWindowsのフォルダをマウントします。
ここでは「D:\Projects\SRE\Ansible\MyData」というフォルダ作り、Docker内の「/mydata」にマウントします。

```
PS> docker run -dit -v D:\Projects\SRE\Ansible\MyData:/mydata my-ansible
```

初回の実行時のみ、ファイル共有許可を求めるダイアログウィンドウが表示されるので「ShareIt」をクリックします。
![12.png](https://qiita-image-store.s3.amazonaws.com/0/290708/ec0c9b18-bf37-8d0f-6fcc-a0eade5bf7a7.png)

Dockerコンテナを確認します。

```
PS> docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
899225e6b593        my-ansible          "/bin/bash"         About a minute ago   Up About a minute                       sad_shannon
```

Dockerコンテナへ接続します。CONTAINER IDを引数に指定します。

```
PS> docker exec -it 899225e6b593 /bin/bash
```

接続に成功すると、PowerShellのコマンドプロンプトがLinuxのシェルターミナルに変わります。

```
[root@899225e6b593 /]# ls
anaconda-post.log  dev  home  lib64  mnt     opt   root  sbin  sys  usr
bin                etc  lib   media  mydata  proc  run   srv   tmp  var
```

マウントした/mydataに移動してファイルを作成します。

```
[root@899225e6b593 /]# cd mydata/
[root@899225e6b593 mydata]# ls > test.txt
[root@899225e6b593 mydata]# ls
test.txt
```
Windows側でもtest.txtファイルが作成されていることが確認できます。
Dockerシェルターミナルから抜けるには

```
[root@899225e6b593 mydata]# exit
PS>
```

## Dockerコンテナ・イメージの停止と削除

最初からやり直したいときなど、コンテナとイメージを削除する手順です。
1. コンテナの一覧からCONTAINER IDを取得
2. コンテナを停止
3. コンテナを削除
4. イメージを一覧
5. イメージを削除

```
PS> docker ps -a  ←コンテナの一覧からCONTAINER IDを取得
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
fc68aff37f7d        my-ansible          "/bin/bash"         3 days ago          Up 3 days                               zen_meitner
PS> docker stop fc68aff37f7d　　←コンテナを停止
fc68aff37f7d
PS> docker rm fc68aff37f7d　　←コンテナを削除
fc68aff37f7d
PS> docker images　　←イメージを一覧
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
my-ansible                 latest              e9d3b75df4d3        3 days ago          378MB
centos                     latest              5182e96772bf        5 weeks ago         200MB
docker4w/nsenter-dockerd   latest              cae870735e91        10 months ago       187kB
PS> docker rmi e9d3b75df4d3 5182e96772bf cae870735e91　　←イメージを削除
Untagged: my-ansible:latest
Deleted: 《略》
Untagged: centos:latest
Deleted: 《略》
Untagged: docker4w/nsenter-dockerd:latest
Deleted: 《略》

```