ansibleをportを指定して、localで立てたamazonlinux2 dockerコンテナに対して実行する

## 紹介する内容
- ansibleをlocal(127.0.0.1)のport(55556)を指定して実行します
- sshログイン可能なdockerコンテナ(amazonlinux2)作成します


## 結論
### デプロイ試しに活用できます
- production環境のリソース(AWSなど)を使わずにansibleを試せます
- デプロイ（Deployer、Capistranoなど）試しにも応用できると思います
- dockerイメージをAWS公式のamazonlinux2を使用したから、AWSのEC2に近い試しになれると思います
   - https://hub.docker.com/_/amazonlinux


## 紹介始めます
### ディレクトリ構成
全体ソースコードは https://github.com/cheekykorkind/qiita-example/tree/master/ansible/to-docker で確認できます

- 全体図
![allD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/3a027ae3-753b-a0ac-4a49-8429eba3679d.png)


- ansible担当デレクトリー
![ansibleD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/c4f8c63d-b226-7066-253f-8dc43b9e1348.png)


- ssh鍵担当デレクトリー
![sshD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/2cc5261b-80b3-fa9f-21f1-9bb55e9f2236.png)



### ansibleのport指定、localに対して実行する実装周り説明
- playbookとinventoryによってport(55556)、local（127.0.0.1）指定されます
   - playbookは`ansible/local_docker_book.yml`ファイルです
      - playbookのhostsはinventoryファイルに書いた`local_docker`にします
   - inventoryは`ansible/local_hosts`ファイルです
      - inventoryでlocalを意味する`127.0.0.1`にします
      - inventoryで`ansible_port=55556`で使いたいpostを指定します


### sshログイン実装周り説明
- 公開鍵docker-ssh-key.pubを加えたauthorized_keysファイル持って待機しているdockerコンテナに対して、ansibleが秘密鍵docker-ssh-keyを使ってsshログインします
   - 公開鍵は`docker-ssh/docker-ssh-key.pub`ファイルです
   - 秘密鍵は`docker-ssh/docker-ssh-key`ファイルです
   - 公開鍵を加えたauthorized_keysは`docker-ssh/authorized_keys`ファイルです
   - `docker-compose.yml`ファイルで`./docker-ssh:/home/ec2-user/.ssh`にマウントしているから、ansible実行するマシンとdockerコンテナ両方でファイルが使用可能です
      - `entrypoint.sh`ファイルで公開鍵、秘密鍵、authorized_keysの所有者をansible実行するマシンのユーザーと同じく設定し、権限を調整しています
         - dockerコンテナ中のユーザーのUIDをansible実行するマシンのユーザーのUIDと同じくすることで両方ファイル所有権を気にせずに使えます
   - `docker-compose.yml`ファイルでansibleが使うportを用意します`ports: '55556:22'`
      - dockerコンテナに開いたportにsshログイン作業処理してくれる`sshd`をバックグラウンドで起動しておきます
         - `entrypoint.sh`で`/usr/sbin/sshd -D`部分です
      - `sshd`は指定された名前の秘密鍵`/etc/ssh/ssh_host_rsa_key`がないと怒りますから、使用しませんがssh秘密鍵を作っておきます
         - `Dockerfile`の`RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''`部分です
   - ansible実行コマンド`ansible-playbook local_docker_book.yml -i local_hosts -u ec2-user --private-key ../docker-ssh/docker-ssh-key`でsshに使う秘密鍵を指定してます
      - i： カスタムinventoryファイルパスを指定
      - u：sshログインするユーザー名
      - private-key：sshログインで使う秘密鍵
      - https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html


### 試し順番です
ansibleはファイル`nginx.repo`を2箇所（`/etc/yum.repos.d/nginx.repo`、`/home/ec2-user/nginx.repo`）にをコピーする内容です。
実行成功したら、dockerコンテナの`/etc/yum.repos.d/nginx.repo`、`/home/ec2-user/nginx.repo`にファイルが見えます。

1. docker composeがあるデレクトリー移動に移動します 
   - `cd qitta-example/ansible/to-docker`
2. dockerコンテナをバックグラウンドで起動します
   - `DOCKER_UID=$(id -u $USER) DOCKER_GID=$(id -g $USER) docker-compose up -d`
3. Ansibleのplaybookがあるデレクトリーに移動します
   - `cd qitta-example/ansible/to-docker/ansible`
4. Ansible実行します(両方同じです。どっちでも実行可能です)
   - `ansible-playbook local_docker_book.yml -i local_hosts -u ec2-user --private-key ../docker-ssh/docker-ssh-key`
   - `sh local_docker_book.sh`

### 試します
![ansible.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/a517974d-c06b-b26d-034d-9b0d57ffa65b.gif)