Ansible | Docker で Ansible の動作環境を作る

# Docker側の用意

## Docker イメージの作成

この例では、次の条件でイメージを作る。

- pythonが使える ( Ansble の実行環境ため )
- sshで直接接続ができる
- ssh ユーザー: `root`
- ssh パスワード: `screencast`



```bash:Dockerfile
FROM ubuntu:16.04

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:screencast' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

# FOR Ansible
RUN apt-get update && apt-get -y install python

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
```

```
$ docker build -t eg_sshd .
```

( [Dockerize an SSH service | Docker Documentation](https://docs.docker.com/engine/examples/running_ssh_service/) を参考)

## Dockerコンテナを走らせる

```
$ docker run -d -p 30000:22 --name test_sshd eg_sshd
```

# Ansibleの実行

## ファイル作成

手元にインベントリファイルを作成する。
( 接続先のIPはDockerの構築環境による )

```:inventory
[example]
127.0.0.1

[example:vars]
ansible_ssh_user=root
ansible_ssh_port=30000
```

( Ansible 2.0 以降では `ansible_user` などの短い書き方が推奨されているので注意 => [Inventory — Ansible Documentation](http://docs.ansible.com/ansible/intro_inventory.html) )

## 環境変数の設定

初回アクセス時の質問 ( known_inventory にフィンガープリントを記録する処理 ) を無効化しておく。

```
$ export ANSIBLE_HOST_KEY_CHECKING=False
```

## コマンド実行

Dockerコンテナに適当なファイルを作成してみる。

```
$ ansible -i inventory example -m shell -a 'touch example.txt' --ask-pass
```

- `-i inventory`
  - インベントリファイルの指定
- `-m shell`
  - 「ansible の shell モジュールを実行する」という指定 (省略できる)
- ` -a 'touch example.txt'`
  - モジュールに渡す引数 ( この例の場合は、実行するコマンドの内容 )
- `--ask-pass`
  - パスワードを手入力するためのフラグ

コマンドを実行するとパスワードを聞かれるので、設定したもの ( `screencast` ) を入力する。

# 確認

docker コンテナにファイルが作成されているのが分かる。

```
$ docker exec -it test_sshd /bin/bash
```

```
root@91625cd5dda0:/# ls ~/
example.txt
```

# パスワードを聞かれないようにする場合

## ホスト側に sshpass をインストールする

(Macの場合)

```
brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb
```

( [Installing SSHPass](https://gist.github.com/arunoda/7790979) )

## 手元からコンテナにsshアクセスして FingerPrint を作っておく

```
ssh root@127.0.0.1 -p 30000
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/2ee0ea45-96e2-3d7b-4a78-d2fb683ad49e.png)

`yes` と答えて `exit` する。

## インベントリファイルにパスワードを書く

たぶん非推奨。
( ちゃんとやる場合は鍵交換とかしよう )

```diff:inventory
[example]
127.0.0.1

[example:vars]
ansible_ssh_user=root
ansible_ssh_port=30000
+ ansible_ssh_pass=screencast
```

## ansibleコマンドを実行する

```
ansible -i inventory example -m shell -a 'touch example.txt'
```


# 環境

- ansible 1.9.6
- Docker version 17.03.1-ce, build c6d412e
- Mac OS Sierra 10.12.4

# Docker hub

- [yumainaura/ansible-ssh - Docker Hub](https://hub.docker.com/r/yumainaura/ansible-ssh/)

# 関連

- [Ansible | ssh のキャッシュを無効にする - Qiita](http://qiita.com/YumaInaura/items/4342199cab26d6453985)

# 参考

- [ansible - to use the 'ssh' connection type with passwords, you must install the sshpass program" - Stack Overflow](https://stackoverflow.com/questions/42835626/to-use-the-ssh-connection-type-with-passwords-you-must-install-the-sshpass-pr)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->