Dockerコンテナ上でAnsibleを実行してみた

#はじめに
現場でAnsibleを使う機会ができたので、勉強のためにDockerコンテナ上でAnsibleを動かしてみました。

#対象
Ansibleを実際に動かしてみたい人

#Ansibleとは？
Ansibleとは、システム構成、ソフトウェアの展開等、様々な設定作業を自動するツールである。
PlaybookというYAML形式のテキストファイルにタスクを記述し、それをAnsibleで実行させることで多様な処理を実現する。
メリットとして、下記２点が挙げられる。

* 設定ファイルがyamlでの記述になっておりシンプル
* 冪等性（何度同じ操作しても、同じ状態にする）を担保

# 試したこと

* Ansibleコンテナと、環境を適用したいターゲットコンテナを立ち上げる
* Ansibleコンテナからplaybookを実行して、ターゲットコンテナにgitをインストールする


#ファイルの構成

```
.
├── ansible
│   └── install_git.yml
├── docker
│   ├── ansible
│   │   └── Dockerfile
│   └── target
│       └── Dockerfile
└── docker-compose.yml

```

#ファイルの説明

###docker/ansible/Dockerfile
Ansibleとsshの設定

```Docker
FROM centos:8

RUN yum update -y \
 && yum install -y epel-release \
 && yum install -y ansible \
 && yum -y install openssh-clients \
 && echo "target" >> /etc/ansible/hosts
```

###docker/target/Dockerfile
Ansibleサーバーからsshできるように、sshの設定、sshdを起動

```Docker
FROM centos:8

RUN yum -y update \
  && yum -y install openssh-server \
  && sed -ri 's/^#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config \
  && sed -ri 's/^UsePAM yes/UsePAM no/' /etc/ssh/sshd_config \
  && ssh-keygen -f /etc/ssh/ssh_host_rsa_key -N '' -t rsa \
  && ssh-keygen -f /etc/ssh/ssh_host_ecdsa_key -N '' -t ecdsa \
  && sed -ri 's/^#PermitEmptyPasswords no/PermitEmptyPasswords yes/' /etc/ssh/sshd_config \
  && echo "root:" | chpasswd

# sshdを起動
CMD ["/usr/sbin/sshd", "-D"]
```

###docker-compose.yml

Ansibleコンテナと、ターゲットコンテナを起動させる

```yaml
version: "3"
services:
  ansible:
    tty: true
    working_dir: 
      /opt/ansible
    build:
      context: .
      dockerfile: ./docker/ansible/Dockerfile
    volumes:
      - ./ansible:/opt/ansible
  target:
    tty: true
    build:
      context: .
      dockerfile: ./docker/target/Dockerfile
```

###ansible/install_git.yml
Playbookファイル、gitをインストールさせている

```yaml
- hosts: target
  tasks:
    - name: install git
      yum: name=git state=latest
```

#実行

1. コンテナ起動
2. ansibleサーバーにログインして、playbookを実行
3. ターゲットコンテナにgitがインストールされているか確認

## 1. コンテナ起動

```shell
# コンテナ起動
~ % docker-compose up -d
Starting ansible_ansible_1 ... done
Starting ansible_target_1  ... done
```

##2. ansibleサーバーにログインして、playbookを実行

```shell
# コンテナを表示
~ % docker ps
CONTAINER ID   IMAGE             COMMAND               CREATED             STATUS          PORTS     NAMES
28f39d3e82f0   ansible_ansible   "/bin/bash"           About an hour ago   Up 13 seconds             ansible_ansible_1
362d7471778f   ansible_target    "/usr/sbin/sshd -D"   About an hour ago   Up 13 seconds             ansible_target_1

# Ansbleコンテナにログイン
~ % docker exec -it ansible_ansible_1 bash

# playbook実行
[root@28f39d3e82f0 ansible]# ansible-playbook install_git.yml

PLAY [target] ********************************************************************************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************************************************************************
The authenticity of host 'target (172.22.0.2)' can't be established.
ECDSA key fingerprint is SHA256:YJSVW2y2ryrRuU0rn3I8onXAPMwS/k03uj+MNd5JqP0.
Are you sure you want to continue connecting (yes/no/[fingerprint])? y
Please type 'yes', 'no' or the fingerprint: yes
ok: [target]

TASK [install git] ***************************************************************************************************************************************************************************************
changed: [target]

PLAY RECAP ***********************************************************************************************************************************************************************************************
target                     : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
```

## 3. ターゲットコンテナにgitがインストールされているか確認

```shell
# ターゲットコンテナにログイン
~ % docker exec -it ansible_target_1 bash

# gitがインストールされているか確認
[root@362d7471778f /]# git --version
git version 2.27.0

```

# 参考

https://tech-mmmm.blogspot.com/2018/08/ansible-ansibleplaybook.html