Ansibleのテスト環境をDockerで作成してみる（ローカル）

# やること

Ansible用コンテナとAnsibleでSSH接続して操作を行う用のコンテナ(AlmaLinux)を作成します。
Ansibleコマンドの動作確認と簡易なplaybookの動作確認をやります。

## ディレクトリ構成

こんな感じです。

```markdown
.
├── docker-compose.yml
├── ansible
│   └── Dockerfile
└── almalinux
    └── Dockerfile
```

### docker-compose.yml

docker-compose.ymlファイルで、ansibleとtargetの2つのサービスを定義します。

```yaml
services:
  ansible:
    build:
      context: ./ansible
    volumes:
      - .:/var/data

  target:
    build:
      context: ./almalinux
```

### AlmaLinux Dockerfile (almalinux/Dockerfile)

EPELリポジトリを有効にする必要はないかも？

パスワードはローカル試用のため空にしている。

```dockerfile
FROM almalinux:latest

# EPELリポジトリを有効にする
RUN dnf -y install epel-release

# Python 3.9とOpenSSHサーバーをインストール
RUN dnf -y install python39 openssh-server

# SSHホスト鍵を生成
RUN ssh-keygen -A

# 空のパスワードを許可する
RUN sed -ri 's/^#PermitEmptyPasswords no/PermitEmptyPasswords yes/' /etc/ssh/sshd_config
RUN echo "root:" | chpasswd  # rootのパスワードを設定

# SSHポートを公開
EXPOSE 22

# SSHデーモンを起動
CMD ["/usr/sbin/sshd", "-D"]
```

### Ubuntu Dockerfile (ansible/Dockerfile)

Ansible用。

```dockerfile
FROM ubuntu:latest

# パッケージリストを更新しAnsibleをインストール(vimもいれる)
RUN apt-get update && apt-get install -y software-properties-common && \
    apt-add-repository ppa:ansible/ansible && apt-get update && apt-get install -y ansible vim

# デフォルトコマンド（必要に応じて調整）
CMD ["/bin/bash"]
```



## 使用方法

サービスをビルドして実行するには、以下のコマンドを実行します

```bash
docker-compose up --build
```

コンテナを起動したら下記コマンドで、Ansibleコンテナに入る

```bash
docker-compose run ansible
```

targetコンテナへSSH接続する

```bash
ssh target
# はじめてのSSH接続の確認プロンプト、入力促されるのでyesを入力
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes    
# 入れた
[root@9d4a41c48c88 ~]# 
# 入るだけなので抜ける
[root@9d4a41c48c88 ~]# exit
logout
Connection to target closed.
```

つぎにAnsibleからコマンドを打つ

[参考ドキュメント](https://docs.ansible.com/ansible/2.9_ja/user_guide/intro_inventory.html)

host設定をするためrootからhostsファイルを編集

```bash
vim /var/data/hosts
```

下記内容を追加

```txt
cat hosts
[target]
target

[target:vars]
ansible_user=root
ansible_python_interpreter=/usr/bin/python3.9
```

コマンド実行、SUCCESSになってるので成功！

```bash
ansible -i hosts target -vvvv -m ping
# レスポンス
target | SUCCESS => {
    "changed": false,
    "invocation": {
        "module_args": {
            "data": "pong"
        }
    },
    "ping": "pong"
}
```

## playbookを使ってみる

playbook.ymlを用意する。ymlの形式（インデント合わせなど）を間違えないように！

```yml
- hosts: target
  tasks:
  - name: Install Vim
    yum: name=vim
```

実行、できた！

```bash
ansible-playbook -i hosts playbook.yml
# 出力
[WARNING]: Found both group and host with same name: target

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

TASK [Gathering Facts] ************************************************************************************ok: [target]

TASK [Install Vim] ****************************************************************************************changed: [target]

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



## 備考: CentOS&Ansibleでやる場合（断念）

最初はAlmaLinuxではなくCentOSで構築しようとしていた。

Ansibleからpingしようとしたがなんかうまくいかない

⇒[Ansible の実行にはターゲットマシンにも Python が必要だった](https://zenn.dev/kariya_mitsuru/articles/d95e28fc469dc0)らしい

ターゲットマシン側CentOSにPython3.8以上を入れる必要あり。

バージョン指定はAnsibleのバージョンに寄る。

[CentOS7.4でpython3.8を使えるようにした](https://zenn.dev/yamadatt/articles/install-python38-centos74)

恐らくpython3.8が載っているレポジトリがしんでるので、yumからインストール出来ない。

wgetから頑張ってインストールするなら出来るかもだけど、それをする必要が無くなったので断念。

## 参考サイト

[ローカル環境でAnsibleの動作をDockerを使って検証する](https://qiita.com/nijibox_tech/items/3cf6e9229d969e16e031#vim-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B
)

[Ansible の実行にはターゲットマシンにも Python が必要だった](https://zenn.dev/kariya_mitsuru/articles/d95e28fc469dc0)

[CentOS7.4でpython3.8を使えるようにした](https://zenn.dev/yamadatt/articles/install-python38-centos74)