踏み台を利用したEC2へ向けてAnsible実行する環境構築

# はじめに
どうも見習いエンジニアです。
度々EC2にミドルウェアをインストールする依頼が多いので、
勉強も兼ねてAnsibleを利用した自動化構成をコッソリ作りたいと思います。

# 構成
簡易的ですがこんな感じ
オーソドックスで一般的な構成だと思います。
リモートPC側からAnsibleのプレイブックを実行、踏み台を経由して対象のサーバに接続する形です。

![スクリーンショット 2024-11-19 19.46.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3878757/3b548b49-c25a-ff17-91f1-5c13bf02df9e.png)

# 環境構築
## 1.Ansible

* 今回はMacなのでpipを利用してインストールした。

```
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ sudo python get-pip.py
$ sudo pip install ansible
```

https://docs.ansible.com/ansible/2.9_ja/installation_guide/intro_installation.html

https://docs.ansible.com/ansible/2.9_ja/installation_guide/intro_installation.html#from-pip

## 2.コード編集
* VScodeを使用、前職ではPHPStormを使用してました。

## フォルダ構成
* 詰まりポイント、プレイブックを編集したり、新規作ったことはあるのですが仕組みを理解しておらず苦戦しました。

```
ansible/
  |
  |--inventories/--local/--***_hosts.yml
  |             |
  |             |-staging/--***_hosts.yml
  |             |
  |             |-production/--***_hosts.yml
  |--hosts
  |--ssh_config
  |--playbook.yml
```

## hosts
* ここには***_hosts.ymlで呼び出すhostを定義します
* childrenを使用する場合はここで[]で括る必要があるみたいです。
* EC2のhostnameで既に使用されてる場合はしょうがないですが基本的には-を使わず_を使う模様。実行した時に警告が出ます

```
hosts

[front]
***-stag-front
[back]
***-stag-back
***-stag-db
***-stag-admin
```

## ***_hosts.yml
* ここにもhost名を記述する必要があります。
* 今回はchildrenを使用していますが、実行する際にfrontとbackでインストールする中身が変わったりするので、将来的にはここで指定実行するのがいいでしょうか。

```
***_hosts.yml

all:
  children:
    front:
      hosts:
        ***-stag-front:
        
```

## ssh_config
* 今回の要です、ansibleフォルダにEC2へSSH接続するファイルを作成します。
* 理由は膨大な量のEC2へのSSH接続情報を追加するので管理しやすくするためです。
* ポイントとしては秘密鍵でしょうか、***-stag-frontに接続する際に踏み台の秘密鍵を指定しています。
* ProxyCommandではHost名のbasを指定しています。

```
# Bastion
Host bas
    HostName XX.XXX.XXX.XXX
    User ubuntu
    IdentityFile ~/.ssh/id_rsa 
Host ***-stag-front
    HostName XXX.XX.XX.XX
    User ubuntu
    IdentityFile ~/.ssh/id_rsa_bastion
    ProxyCommand ssh -W %h:%p bas
```

* 上記の設定が終わったら実際に接続しできるかテストしましょう。

```
ssh -F ssh_config ***-stag-front
```

## playbook
* hostnameを返してくれるプレイブックを用意します。
* 今自分が置いてるプレイブックの場所はベストプラクティスなフォルダ構成ではないので、この配置は参考にしないでください。

```
playbook.yml

---
- hosts: all
  tasks:
    - name: hostname test
      shell: hostname
      register: return_hostname
    - name: debug
      debug:
        msg: "{{ return_hostname.stdout }}"
```


# テスト実行

```
% ansible-playbook -i inventories/staging/***_hosts.yml -l front playbook.yml

PLAY [all] *****************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************
ok: [***-stag-front]

TASK [hostname test] *******************************************************************************************
changed: [***-stag-front]

TASK [debug] ***************************************************************************************************
ok: [***-stag-front] => {
    "msg": "***-stag-front"
}

PLAY RECAP *****************************************************************************************************
***-stag-front            : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
```

# 最後に

* とりあえず環境を構築することができました。これを元に今後はモジュールをインストールするコードを書いていきたいと思います。
* 前職では既に環境があったため構築するのは初でした、構築してくれた方に感謝しかありません。。
* 詰まりポイントとしてはフォルダ構成でhostとhost.ymlの記述でしょうか、あとはお決まりのssh接続ですね。
* 自分の鍵と踏み台の鍵が違くてpermission deniedになったり、踏み台の秘密鍵を持ってきた時にパーミッションが644になってたりと初歩的なことも多いので勉強になりました。
* 構成管理ツールは楽になるので何か一つはマスターしておきたいところ‥！