Jenkins+Ansible+CloudFormationでインフラ構築の自動化やってみた

JenkinsとAnsibleを使ったインフラ構築の自動化についてメモしたものをまとめました。

スタックの構成図は以下となります。RDSとEC2はミニマム構成にしており、スタックを追加することで以下の冗長構成となります。

![Untitled (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/1a12bc41-9ff3-3941-5b1d-abb2e4fe4d47.png)


###PC環境
- Windows10
- Tera Term

###準備
- 紐づいてないElasticIP1個
- VPCとサブネット作ってIGWを通しておく

##Jenkins用のEC2セットアップ

①Linux2AMIを選択します。
![jenkins1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/d6af660c-e2f4-a027-fff4-9c4d2e2aff3d.png)

②t2.microで一通り試してみた所、動いたのでお金が気になる方は無料枠を使ってください。途中で止まる可能性も十分にありえるので、推奨はt2.small以上が良いかと思います。
![jenkins2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/5547c9ed-5036-8298-328a-e1689d563535.png)

③作成しておいたVPCとサブネットを選んで、自動割り当てパブリックIPは有効にしておいてください。キャパシティー予約はなしでOKです。他はそのままで、次に行きましょう。
![Inkedjenkins3_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/a2943a6e-d3c2-ff7d-087f-45bce35eb238.jpeg)

④セキュリティグループはJenkins用にポートの8080をあらかじめ開けておきましょう。Tera Term用にもsshを開けます。
![jenkins4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/6ddb83e4-b146-a47f-673b-8e1ba2238230.png)

⑤キーペアは既存の物か、なければ新しく作りましょう。それでは作成をクリックしてセットアップに移っていきます。
![jenkins5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/464556c9-569a-02a3-554a-00b2808e31ee.png)

⑥パブリックIPv4をコピーします。
![Inkedjenkins6_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/292257fa-209b-2c5a-047b-f0562b56b567.jpeg)


⑦Tera Termを起動させIPを貼り付けます。
![Inkedjenkins7_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/05bbf52a-ff42-c04d-11bf-02f1ace1f008.jpeg)


⑧ユーザー名とpemを指定し、EC2と接続させます。
![Inkedjenkins8_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/d79932e1-3c1e-f11a-3a54-156021e22cc5.jpeg)


⑨EC2に入ってupdateがある場合は、sudo yum update -yをあらかじめ行ってください。その後、以下をインストールし、Ansibleのディレクトリも同時に作っていきます。

```
$ sudo -s
$ yum install git -y
$ amazon-linux-extras install -y ansible2
$ yum install java-1.8.0-openjdk-devel.x86_64 -y
$ rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
$ wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
```

⑩↓baseurlをhttpsに変更↓

```
$ vim /etc/yum.repos.d/jenkins.repo

[jenkins]
name=Jenkins
baseurl=https://pkg.jenkins.io/redhat
gpgcheck=1
```

⑪Jenkinsインストールし、確認します。

```
$ yum install jenkins -y
$ rpm -qa | grep jenkins
```

⑫以下はベストプラクティスではありません。省きます。EC2とJenkinsuのベストプラクティスについては別記事にて紹介します。

※アクセスキーはIAM等で確認、もしくは設定しておきましょう！

```
$ exit
$ aws configure

AWS Access Key ID [None]: 
AWS Secret Access Key [None]:
Dfault region name [None]: 
Dfault output format [None]: json
```

⑬※Defaults visiblepwの下に↓の2行を追加します。

```
$ sudo visudo

root    ALL=(ALL:ALL) ALL
jenkins ALL=(ALL) NOPASSWD:ALL
```

⑭秘密鍵を~/.ssh配下に置きます。（Tera Termの場合はドラッグ＆ドロップで送信先を指定すればOK。
![Inkedjenkins9_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/50b56e41-0e46-e2c9-056b-31439cd7ffaa.jpeg)


⑮管理者から一旦exitして、以下実行しておきましょう。

```
$ chmod 600 ~/.ssh/秘密鍵名.pem
```

⑯Jenkinsを立ち上げます。

```
$ sudo service jenkins start
```

##Jenkinsの初期設定

①パスワードを求められるので、以下コンソール画面よりコピーして貼り付けます。
![jenkins11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/3b6d57ac-1e47-2f1c-e676-69acf307d6d0.png)

```
$ sudo cat /var/lib/jenkins/secrets/initialAdminPassword
$　パスワード表示
```

②初期設定を済ませます。メールアドレスはなんでもOK。
![jenkins12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/2774a321-e967-8815-af66-d6d81fe9e59b.png)

③左側の新規ジョブ作成を選びます。
![jenkins13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/d59fb8a5-5e7d-c545-adaf-432fdf5a17fe.png)

④CloudFormation用のビルド名を入力し、フリースタイルを選択します。
![jenkins14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/9d580295-0790-83fa-e839-b10249c5a47e.png)

⑤手順に沿って、ソースコード管理はgitリポジトリを選択し、YAML等で作成したスタックが置いてあるリポジトリURLを貼り付け、後はそのままビルド実行を選択します。すると勝手にcloneしてくれます。
![Inkedjenkins15_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/c1596bf5-da0e-f45b-c32a-eb768420b9ac.jpeg)

⑥設定から下にある「ビルド」「シェルの実行」を選び、各々のスタック設定を書き込んでいきます。
![jenkins16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/6b669591-ec0b-8227-9cfc-0c9f085cb245.png)

私の場合、IAMロールを使用しているので、--capabilities CAPABILITY_NAMED_IAMを忘れずに！

```
sudo -u ec2-user aws cloudformation create-stack --stack-name vpc --template-body file://$WORKSPACE/vpc.yml --parameters ParameterKey=PJPrefix,ParameterValue="hoge"
sudo -u ec2-user aws cloudformation wait stack-create-complete --stack-name vpc

sudo -u ec2-user aws cloudformation create-stack --stack-name ec2elb --template-body file://$WORKSPACE/ec2elb-1.yml --parameters ParameterKey=PJPrefix,ParameterValue="hoge" ParameterKey=InternetALBName,ParameterValue="web" ParameterKey=EC2InstanceName,ParameterValue="web" ParameterKey=SSHAccessSourceIP,ParameterValue="0.0.0.0/0" --capabilities CAPABILITY_NAMED_IAM
sudo -u ec2-user aws cloudformation wait stack-create-complete --stack-name ec2elb

sudo -u ec2-user aws cloudformation create-stack --stack-name rds --template-body file://$WORKSPACE/rds.yml --parameters ParameterKey=PJPrefix,ParameterValue="hoge" ParameterKey=DBInstanceName,ParameterValue="rds" ParameterKey=DBName,ParameterValue="sample_production"
sudo -u ec2-user aws cloudformation wait stack-create-complete --stack-name rds
```

⑦設定を保存し、Tera Termに戻ります。

##Ansibleの設定

①jenkinsで一度ビルド実行するとworkspaceというディレクトリが作られるのでそこに移動し、ansibleディレクトリを作ります。

```
$ sudo -s
$ cd /var/lib/jenkins/workspace
$ mkdir ansible
```

②ansible配下にhostsを作成し、事前に用意しておいたターゲットノード用のEIPを貼り付けます。

```
$ cd ansible
$ vim hosts
xxx.xxx.xxx.xxx
```

③続いてansible配下にansible.cfgを作成し、ユーザー名や秘密鍵を入力します。

```
$ vim ansible.cfg

[defaults]
host_key_checking = False
gathering = smart
remote_user: ec2-user
private_key_file: ~/.ssh/hoge.pem
```

④同じくansible配下にplaybook.ymlを作成します。

```
$ yum playbook.yml

---

- hosts: ターゲットノードIP　設定済みEIP
  become: yes
  roles:
    - { role: git, tags: git }
```

⑤roles等を作成し、main.ymlにgitをインストールしたい！と書いておきます。

```
$ mkdir -p roles
$ mkdir -p roles/git/tasks
$ touch roles/git/tasks/main.yml
$ cd roles/git/tasks
$ vim main.yml

---

- name: Install Git
  yum:
    name: git
    state: present
```

```
$ exit
```

Ansibleの設定は以上です。

##連続実行してみる

①Ansibleのビルド名を記入し、フリースタイルを選択します。
![jenkins17.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/388c2f21-f267-ef9f-dba3-55c2195fb3b2.png)

②下にあるシェルの実行を選択し、スクリプトを記入します。

![jenkins18.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/e76683b8-c8c0-2ae1-141d-2358e2f137f6.png)

③cloudformationのジョブへ移動し、設定から一番下にある「ビルド後の処理」で、対象プロジェクトからansibleと入力し、そのまま保存します。
![jenkins19.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/14a4b9cb-9116-fb02-32e5-3061efb191c7.png)

④cloudformationのジョブへ戻り、「ビルドの実行」を選択！しばらく時間がかかるので、全てのジョブが実行されると、画像のように青っぽいマークになります。失敗すると赤くなります。
![jenkins21.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/2b36fcc6-0e8b-3bb3-aa24-88704339200d.png)

⑤最後に自動構築されたEC2サーバーへログインし、gitがインストールされているかチェック！
![jenkins20.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/1f859be2-4973-7ff6-da60-2cf4324f79b2.png)

以上！