[初心者]Ansibleの学習環境の構築2/3(AWSで環境構築)

# はじめに
こんにちは。Ansibleの学習環境構築の第2回です。
前回はAnsibleの概要について紹介しました。まだご覧になっていない場合はぜひ読んでいただけると幸いです。(読まなくても環境構築は問題なくできます)

第1回　Ansible概要

https://qiita.com/Yuya_Ikuta/items/e98ec44c6df39cd23632

第2回　学習環境構築(現在のページ)

第3回　Ansible実践
作成中

今回は、AWS環境に仮想マシンを構築し、Ansibleをインストールしてみましょう。

# 目次
・事前準備
・環境構築
・さいごに

# 事前準備
・AWSアカウント
・teraterm(サーバへのSSH接続に使用します)

# 環境構築
リソース構築はCloudformationで行います。
下記の環境を構築します。

| EC2 | Ansible-controller | ansible-target |
|:-----------:|:------------:|:------------:|
| OS          |Amazon Linux2 | Amazon Linux2|
| Ansible      | 2.11.12      | 不要     |

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748625/f70e8114-b395-e754-39ab-676debe00b71.jpeg">




## 構築手順

1.EC2のキーペアを作成する。
2.Cloudformationでスタックを作成する。
3.teratermでAnsible-Controllerに接続する。
4.Ansibleインストール
5.鍵の設定
6.疎通テストとその他設定


## 詳細な構築手順
<dl>
<dt>1.EC2のキーペアを作成する</dt>
<dd>EC2のキーペアはCloudformationでも作成可能ですが、スタックを削除した際にキーも消えてしまうため、今回は事前に作成します。キーペアはEC2のコンソール画面から作成可能です。</dd></dl>

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/EMRforDynamoDB.Tutorial.EC2KeyPair.html
<dl>
<dt>2.Cloudformationでスタックを作成する。</dt>
<dd>以下のテンプレートを使って上記の構成図の環境を構築します。そのままコピーして使用できますが、キーの名前は忘れずに変更してください。</dd></dl>

```yaml:yaml
  ---
AWSTemplateFormatVersion: "2010-09-09"

Resources:
  VPC:
    Type: "AWS::EC2::VPC"
    Properties:
      CidrBlock: "172.16.0.0/16"

  InternetGateway:
    Type: "AWS::EC2::InternetGateway"

  AttachGateway:
    Type: "AWS::EC2::VPCGatewayAttachment"
    Properties:
      VpcId: !Ref "VPC"
      InternetGatewayId: !Ref "InternetGateway"

  PublicRouteTable:
    Type: "AWS::EC2::RouteTable"
    Properties:
      VpcId: !Ref "VPC"

  PublicRoute:
    Type: "AWS::EC2::Route"
    DependsOn: "AttachGateway"
    Properties:
      RouteTableId: !Ref "PublicRouteTable"
      DestinationCidrBlock: "0.0.0.0/0"
      GatewayId: !Ref "InternetGateway"

  PublicSubnetARouteTableAssociation:
    Type: "AWS::EC2::SubnetRouteTableAssociation"
    Properties:
      SubnetId: !Ref "PublicSubnetA"
      RouteTableId: !Ref "PublicRouteTable"

  PublicSubnetBRouteTableAssociation:
    Type: "AWS::EC2::SubnetRouteTableAssociation"
    Properties:
      SubnetId: !Ref "PublicSubnetB"
      RouteTableId: !Ref "PublicRouteTable"

  PublicSubnetA:
    Type: "AWS::EC2::Subnet"
    Properties:
      VpcId: !Ref "VPC"
      CidrBlock: "172.16.0.0/24"
      AvailabilityZone: "ap-northeast-1a"

  PublicSubnetB:
    Type: "AWS::EC2::Subnet"
    Properties:
      VpcId: !Ref "VPC"
      CidrBlock: "172.16.1.0/24"
      AvailabilityZone: "ap-northeast-1c"

  SecurityGroup:
    Type: "AWS::EC2::SecurityGroup"
    Properties:
      GroupDescription: "Allow SSH access to EC2 instances"
      VpcId: !Ref "VPC"
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: "0.0.0.0/0"

  EC2Instance1:
    Type: "AWS::EC2::Instance"
    Properties:
      ImageId: "ami-0ffac3e16de16665e"
      InstanceType: "t2.micro"
      KeyName: "作成した鍵の名前"
      NetworkInterfaces:
        - AssociatePublicIpAddress: true
          DeviceIndex: 0
          GroupSet:
            - !Ref "SecurityGroup"
          SubnetId: !Ref "PublicSubnetA"
      Tags:
        - Key: "Name"
          Value: "Ansible-Controller"

  EC2Instance2:
    Type: "AWS::EC2::Instance"
    Properties:
      ImageId: "ami-0ffac3e16de16665e"
      InstanceType: "t2.micro"
      KeyName: "作成した鍵の名前"
      NetworkInterfaces:
        - AssociatePublicIpAddress: true
          DeviceIndex: 0
          GroupSet:
            - !Ref "SecurityGroup"
          SubnetId: !Ref "PublicSubnetB"
      Tags:
        - Key: "Name"
          Value: "Ansible-Target"
```

スタックの作成方法

1.画面右上のオレンジ色のスタックを作成を選択する。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748625/a9ba3eab-c6d4-f242-5ddc-9d32cf0caf63.jpeg">
2.画像のように選択し、作成したテンプレートをアップロードする。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748625/3956131d-0416-09f4-1d67-b82ef75e66f6.jpeg">
3.任意のスタック名を登録する。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748625/2fad586d-aa78-35c6-6fc6-54a5d613c649.jpeg">
4.画面右下の「次へ」を選択する。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748625/004f98bc-e14f-025e-76c9-598facfd6337.jpeg">
5.画面右下の「送信」を選択する
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748625/3a5a3cec-da06-bbe0-507d-25d20fbea5a0.jpeg">
これでリソースが自動で構築されます。リソースを削除したい場合は画面右上の「削除」を選択することで、スタックの作成によって構築された環境を全て削除することができます。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748625/2ffef3e7-36f7-2bd0-fc50-66a5b52f97e5.jpeg">

<dl>
<dt> 3.teratermでAnsible-Controllerに接続する。</dt>
<dd>作成したEC2(Ansible-Controller)にteratermでSSH接続をします。ホストにControllerのパブリックIPを入力し、
作成したキーを使ってサーバに接続します。この後公開鍵の設定を行うため、この時点でTarget側にも接続しておくと楽です。</dd>
　
<dt>4.Ansibleインストール</dt>
<dd>下記コマンドに沿ってAnsibleをインストールします</dd>

```
#rootでログイン
[ec2-user@ansible-controller ~]$ sudo su -

#pip3を使用してAnsibleをインストール
[root@ansible-controller ~]# pip3 install ansible

#Ansibleのバージョン確認
[root@ansible-controller ~]# ansible --version
```

<dt>5.鍵の設定</dt>
ここから、ControllerからTargetにSSH接続するために鍵の設定を行います。

```
#SSH鍵ペアの作成
[root@ansible-controller ~]$ ssh-keygen -t rsa
※対話形式で3回問われるので、3回ともEnterを入力

#作成した公開鍵をauthorized_keysファイルに追加
[root@ansible-controller ~]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

#authorized_keysの権限変更
[root@ansible-controller ~]# chmod 600 ~/.ssh/authorized_keys

#ここで表示されたキーをコピー
[root@ansible-controller ~]# cat .ssh/id_rsa.pub
```
</dl>
ここでコピーしたキーをTargetのauthorized_keysに貼り付けます。
以下はTarget側での操作になります。

```
#rootでログイン
[ec2-user@ansible-target ~]$ sudo su -

#authorized_keysにコピーしたキーを張り付ける
[root@ansible-target ~]# vi .ssh/authorized_keys
```

<dt>6.疎通テスト</dt>
試しにpingを送信してみましょう。
ここからはControllerの操作に戻ります。

```
#/etcにansibleのディレクトリ作成
[root@ansible-controller ~]$ mkdir /etc/ansible

#作成した/ansible直下にhostsファイルを作成し、TargetサーバのプライベートIPを追加
[root@ansible-controller ~]# vi /etc/ansible/hosts
[target]
172.16.1.73(TargetサーバのプライベートIP)

#targetに対してpingを送信
[root@ansible-controller ~]# ansible target -m ping
Are you sure you want to continue connecting (yes/no)?　yes
172.16.1.73 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
```
このように表示されれば問題ありません。同時に下記のような警告文が2つ表示されていると思います。
```
[DEPRECATION WARNING]: Ansible will require Python 3.8 or newer on the
controller starting with Ansible 2.12. Current version: 3.7.16 (default, Dec 15
 2022, 23:24:54) [GCC 7.3.1 20180712 (Red Hat 7.3.1-15)]. This feature will be
removed from ansible-core in version 2.12. Deprecation warnings can be disabled
 by setting deprecation_warnings=False in ansible.cfg.

[WARNING]: Platform linux on host 172.16.1.73 is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change the meaning of that path. See
https://docs.ansible.com/ansible-
core/2.11/reference_appendices/interpreter_discovery.html for more information.

```

最後にこの警告文の対処をします。

```
#configファイルの作成し、以下を追加
[root@ansible-controller ~]# vi /etc/ansible/ansible.cfg
[defaults]
deprecation_warnings=False
interpreter_python = /usr/bin/python
```

これでエラーは出なくなります。
この警告文が出る原因については以下を参考にしてください。

https://docs.ansible.com/ansible/latest/reference_appendices/config.html

https://docs.ansible.com/ansible/latest/reference_appendices/interpreter_discovery.html

# さいごに
お疲れさまでした。
無事にインストールできたでしょうか。
記事が長くなってしまったので、Azureでの環境構築はまた別の記事にします。
次回はAnsibleを使ってユーザの作成等を行う実践編になります。
ここまでご覧いただきありがとうございました。

←第1回

https://qiita.com/Yuya_Ikuta/items/e98ec44c6df39cd23632

→第3回
作成中