AWS EC2でAnsibleの実行コマンドが永遠に弾かれた時の備忘録③

::: note info
エンジニア2年目が書いた記事と認知して読んでね
:::

## ゴール設定
とどのつまりこういう事がしたい。前回は[こちら](https://qiita.com/inugasuki44/items/64de14aed9fea3af5baf)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4026542/5b3f3fa7-ffc4-4574-842c-49003cf1b026.png)
前回はEC2(Server)にSCPでEC2(Client)の鍵（.pem）を配置しましたので、SSH接続ができるようになったはずです。AnsibleはホストにSSH接続してPlaybookを実行するので、これで実行準備はできました。

### Server → Client へ疎通確認(ICMP)
![スクリーンショット (103).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4026542/5765c349-1dbf-4bd4-a09a-1ac000d67dd6.png)
pingを打つだけですが、一応Ansibleのオプションの利用もできます。

### Server → Client へSSH接続
![スクリーンショット (104).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4026542/646791d5-61a2-4cc9-8ebe-c6be9abc806e.png)
こちらも問題なく成功。ちなみに、host名とIPについては以下のように設定しております。
| 対象 | host名 | IP |
|:-:|:-:|:-:|
| EC2(Server) |  exp1mng001jmp001 | 10.0.100.43/28  |
| EC2(Client)  |  exp1int001svr001 |  10.0.0.12/28 |

### 補足：Nginxのインストールについて
詳しくはまた別記事で記載するが、Amazon-linux2ではデフォルトでyumでサービスのインストールができない。
代わりに標準のリポジトリとして、Amazon-linux-extraが公開されている。
（もしかしたら”無料版の”Amzon-linux2だけの話かもしれない）

なお、Amazon-linux-extraを利用するにはS3にアクセスが必要。今回のようにプライベートサブネット(Clientが配置されている方)からインターネット経由でS3にアクセスできない場合は、VPCゲートウェイをプライベートサブネットにアタッチする必要がある。今回は、これが完了した状態で話を進める。
※こちらもまた別日に記事にする。

### Ansible playbookの構成
今回は以下のようなディレクトリ構造となっている。
~~~
.
|--- hosts
|--- roles
|    |--- install_lb
|         |--- tasks
|              |--- main.yml
|--- site.yml
~~~

./site.yml
~~~~
---

- name: install nginx on Client
  hosts: Client
  become: true
  roles:
   - install_lb
~~~~

./hosts
~~~
[Client]
10.0.0.12
~~~

./roles/install_lb/tasks/main.yml
~~~
- name: Enable to install nginx
  shell: "amazon-linux-extras enable nginx1"
  changed_when: False

- name: Install nginx
  yum:
    name: nginx
    enablerepo: amzn2extra-nginx1
    state: present

- name: Start nginx service
  service:
    name: nginx
    state: started
    enabled: yes

- name: Reboot service
  service:
    name: nginx
    state: reloaded
~~~

name: Enable to install nginx について
これは深く考えないでください。先ほど記載したamazon-linux-extraを動かすためのAnsibleモジュールは用意されていない（多分こんなニッチなものにまでモジュール作成されない）ので、shellに直接「amazon-linux-extrasっていうリポジトリからnginxをenableしてね」と命令する箇所です。
changed_whenはIF文のようなものです。Disableのときだけこれを実行すれば良いよっていう条件分岐です。

name: Install nginx について
一度amazon-linux-extraからnginxを落としているので、その後はyumコマンドで操作ができる。
yumモジュールの中で、enablerepoを使うと、amazon-linux-extraから明示的にインストールができる。

name: Start nginx service　について
この後サービスの再起動をするので、一旦enableしておく必要があります。

name: Reboot service
ここは特段説明不要かとおもいます。

### 実行結果
以下コマンドで改めてPlaybookを実行します。
~~~
$ ansible-playbook -i hosts site.yml --private-key="<鍵配置先のpath>"
~~~

![スクリーンショット (101).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4026542/1f264ca9-3d9f-4658-ab36-24ff0066ec3a.png)
何度か実行した後のキャプチャなので、実際に実行した人の画面とはRECAPの値が異なる可能性があるが、FailedやUnreachableがカウントされていない限りはほぼ大丈夫だと思う。

![スクリーンショット (102).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4026542/3c2d331e-b847-4467-b462-5d3120ecc06c.png)
EC2(Client)にログインしてsystemdを確認すると無事nginxのインストールおよびenableが完了しています。

### 余談
EC2におけるhostnameの修正について。今回使用しているAmazon Linux2はhostnameを修正する方法については以下を参照。


https://qiita.com/phper_sugiyama/items/3251b9597ad2b15e66e2

hostnamectlを使えばリブート後もちゃんと変わっている。