AnsibleとJenkinsを使用してTomcat、Java、MySQLからなるイメージをデプロイ

このチュートリアルでは、**Ansible**と**Jenkins**を使用して、Tomcat、**Java**、MySQLで構成されたイメージを**Alibaba Cloud**上にデプロイします。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/deploy-an-image-using-ansible-and-jenkins_595440)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

#前提条件
1.  最低でも1台の[Jenkinsサーバ](https://www.alibabacloud.com/blog/ci%2Fcd-with-jenkins---part-1%3A-install-jenkins-on-ubuntu_593717?spm=a2c65.11461447.0.0.53a46c64aNElRK)が必要です(マスターのみまたはマスター/スレーブ設定の場合)。

そして、Jenkinsサーバのマスター/スレーブ(エージェント)環境を設定したら、サーバの状態を確認してエージェントが正常に稼働していることを確認します。特に私のセットアップでは、マスターノードをJenkinsサーバとして、エージェントマシンをAnsible用に使用しています。ご希望であれば、マスター自体にAnsibleをインストールすることで、1台だけのマシンを持つことも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/9eace525-22fe-b5ad-40c3-4e3da7e9d4e1.png)


2.  その後、マスターマシンとエージェントマシンにAnsible Toolをインストールします。

2.Ansibleを導入します。Ansibleは、ITオートメーションのための強力なツールであり、ターゲット環境をプロビジョニングし、その上でアプリケーションをデプロイするためにCI/CDプロセスで使用することができます。しかし、Ansibleはメンテナンスが面倒で、長期的にはスクリプトを再利用してしまうことを知っておいてください。
Ansible がインストールされている集中管理された場所から、異なるサーバ/環境にまたがって同じタスクを実行する場合に役立ちます。Ansible は完全にエージェントレスであるため、[Chef](https://www.chef.io/?spm=a2c65.11461447.0.0.53a46c64aNElRK)や [Puppet](https://puppet.com/?spm=a2c65.11461447.0.0.53a46c64aNElRK) のような他の IaC (Infrastructure-as-Code) ツールと比較して優位性があります。Ansible を使用すると、クライアントシステムにエージェントをインストールする必要がなく、クライアントとサーバ間の SSH 通信によって自動化が行われます。指定した地域に何百ものインスタンスがあれば、すべての自動化が容易になります。AnsibleのプレイブックはYAML/YML言語で書かれています。

Ansibleになると、以下のような知識も必要になってきます。

- Control node：Ansible がインストールされており、管理しているサーバーを担当するマシン
- Inventory：プレイブック内のコマンド、モジュール、タスクが動作するホストとホストグループを定義するファイル。このファイルは、Ansible 環境とプラグインに応じて多くの形式のいずれかになります。プロジェクト固有のインベントリファイルを別の場所に作成するために使用します。
- Playbook：Ansible の設定、デプロイメント、オーケストレーション言語の一部。リモートシステムに適用させたいポリシーや、一連のステップを記述することができます。


#Ansible と Ansible Alicloud モジュールのインストール
まず、JenkinsにAnsibleプラグインをインストールします。そのためには、以下の手順に従います。

1.  ダッシュボードのManage Jenkinsをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/4e1d7c0a-08e7-e864-11ae-ea032bc81f24.png)


2.  プラグインの管理をクリックして、ページの右上にある検索バーで Ansible プラグインを探します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/7ea482f9-4c0c-edf6-bef3-feeb8c2ecdd4.png)


3.  Ansible を選択して、Download now をクリックし、再起動後にインストールします。

注意: このチュートリアルで行っている現在のセットアップには必要のない Ansible Tower はインストールしないでください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/488f33f5-9eed-5a4f-3e1d-05e745de76ce.png)

Jenkins に Ansible プラグインをインストールしたら、次は Client/Agent マシンに Ansible をインストールする手順に進みます。

#クライアント/エージェントマシンにAnsibleをインストール
Alibaba Ansibleモジュールは頻繁に更新されているので、最新版はGitHubの[リンク](https://github.com/alibaba/alibaba.alicloud?spm=a2c65.11461447.0.0.53a46c64aNElRK)を参照することをお勧めします。

1.  エージェントマシンでターミナルウィンドウを開き、以下のコマンドを実行します。

- CentOS 7.4を使用している場合は、このコマンドを使用すると良いでしょう。

```
sudo yum check-update; sudo yum install -y gcc libffi-devel python-devel openssl-devel epel-release
sudo yum install -y python-pip python-wheel
```

- Ubuntu 16.04 LTSを使用している場合は、このコマンドを使用します。

```
sudo apt-get update && sudo apt-get install -y libssl-dev libffi-dev python-dev python-pip
```

2.  次のコマンドを入力して、必要なパッケージAnsible for Alibabaをインストールします。

```
sudo pip install ansible

sudo pip install ansible_alicloud

sudo pip install ansible_alicloud_module_utils
```

#Ansibleプレイブックを設定
アリババECSをプロビジョニングするためのAnsibleのプレイブックスクリプトを[こちらに](https://github.com/nadaraj15/alibaba_ansible/?spm=a2c65.11461447.0.0.53a46c64aNElRK)作成してみました。ソースコードをフォークして、環境に合わせてパラメータの値を変更することができます。

```
    alicloud_access_key: <Alibaba Access Key>
    alicloud_secret_key: <Alibaba Secret Key>
    alicloud_region: <Alibaba Region for your resource> e.g. - ap-south-1
    alicloud_zone: <Alibaba Zone for your resource> e.g. ap-south-1a
    password: <New VM Password>
    image: "m-a2d4qmk8v2w9s5wmh0rw"  
```

注：私はZhuyunが提供するAlibaba Application Stacksからイメージをインポートしています。[こちらでご確認ください](https://marketplace.alibabacloud.com/error500?code=10010#product-details)。Linux、Nginx、MySQL、Jdk-Tomcat（Nginx1.6-jdk1.7-tomcat7-mysql5.5-vsFTPd2.2.2）で構成されています。

#アクセスキーとシークレットの生成
さて、アクセスキーとシークレットを生成する時が来ました。これを行うには、以下の手順に従ってください。

1. `アクセスキー`と`シークレットキー`を取得するには、[Alibaba Cloudコンソール](https://account.alibabacloud.com/login/login.htm?spm=a2c65.11461447.0.0.53a46c64aNElRK)にアクセスして、製品メニューからリソースアクセス管理(RAM)を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/8586c93b-ddb8-def8-6afe-91ef0baf2620.png)


2.  左側のナビゲーションペインで［ユーザー］オプションをクリックし、［ユーザーの作成］を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/8f418413-2fcd-e20f-f8f1-f398f59d69e2.png)


3.  新しいユーザーを作成し、ログイン名と表示名を入力します。次に、[アクセスモード]で、[プログラムアクセス]にチェックを入れます。このユーザーに Console Password Logon アクセスを提供する必要はありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/5064be3d-9aad-eea3-a10b-e727a4960624.png)


4.  プレイブックの`alicloud_access_key`と`alicloud_secret_key`の値となる`AccessKeyId`と`AccessKeySecret`をコピーします。

注意：ダイアログボックスを閉じると、AccessKey情報は再び利用できなくなります。したがって、ダイアログボックスを閉じる前にこの情報をコピーして保存しておくことが重要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/49778f84-b56d-f603-8bb5-5beabb30f42d.png)

5.  VPC、V-Switchs、セキュリティグループ、またはECSインスタンスのようなリソースをプロビジョニングするための適切な権限を提供します。私はAdministratorAccessを提供していますが、これはAlibaba Cloudのサービスやリソースへのフルアクセスを提供するために起こることです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/d9b274b3-bbb8-bf53-2e4f-56d3092f5ad3.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/69aabfae-9306-4c6d-1aa2-bc539a02e9e5.png)


#アリババクラウドの地域とゾーン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/edf57240-7b78-fb18-bd58-4119f31395e8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/7452d983-0464-e1cc-ceb3-dfa0a0c60d6a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/43cbabae-2835-586f-9f33-403200e54fc5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/8031696c-5f9c-a619-ab26-eaff92609f59.png)

注）1.

1.  完全なリストを取得するには、Alibaba CloudのCLIツールを使用することができます。JSONの壁を吐き出してくれるので、*nix上にいてjqツールが利用できるのも便利です。以上のことを考えると、必要なのはこの短いシェルスクリプトだけです。

```
#!/usr/bin/env bash

for region in $( aliyun ecs DescribeRegions | jq '.Regions.Region[].RegionId' )
do
    echo $region
    reg=$( echo $region | sed s/\"//g )
    echo '---'
    for zone in $( aliyun ecs DescribeZones --RegionId $reg | jq '.Zones.Zone[].ZoneId' | sort )
    do
        echo $zone
    done
    echo ''
done
```

2.  以下の地域・ゾーンにリソースを提供したい場合は、こちらの[リンク](https://www.alibabacloud.com/help/ja/doc-detail/52595.htm)から実名登録を行ってください。

```
alicloud_region: cn-beijing
alicloud_zone: cn-beijing-a
```

以下に各リージョンのイメージIDを示します（Linux, Nginx, MySQL, Jdk-Tomcatイメージの場合）。もちろん、地域に応じてイメージIDを変更する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/be67d013-ab5b-1e2f-8402-60dce8717107.png)

#Jenkinsジョブを使用してAlibaba VMを作成してデプロイする
Jenkinsジョブを使用してAlibaba VMを作成してデプロイするには、以下の手順に従います。

1.  Jenkinsダッシュボードから、New Itemを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/60eb0ddf-1378-bac8-72ce-40b940e157eb.png)

2.  名前を入力し、「Freestyle project」を選択し、「OK」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/1976f880-603d-db0b-08bf-2976dda6776d.png)

3.  (オプション) 一般の下に、参考のために簡単な説明を記載してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/0ecf0940-04f5-199a-51fc-5acb3f30eb4f.png)

4.  上部のソースコード管理（SCM）タブを選択するか、スクロールダウンして以下の情報を入力します。

SCM: - Git
リポジトリのURL：- GitHubのリンクにパラメータを変更したもの
例：[https://github.com/nadaraj15/alibaba_ansible/]()
資格情報：- なし (パブリックリポジトリなので、プライベートの場合は Jenkins に資格情報を保存)
ブランチ指定子 ( 'any' の場合は空白): - */master

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/838876b9-f442-f4ab-a253-0f41f0f1f931.png)


5.  次に、ビルドトリガーはとりあえずスキップして、ビルド環境に移動します。新しいプロジェクトを作成する際には、いくつかの設定が用意されています。この設定ページでは、スクリプトを実行するなどの余分なアクションを実行するためのビルドステップを追加するオプションもあります。というよりも、シェルスクリプトを実行して、GitHubからAnsible Playbookファイルをダウンロードします。以下のコマンドを使用します。

```
sudo apt-get update  (Optional)
sudo apt-get install -y libssl-dev libffi-dev python-dev python-pip (Optional)
sudo pip install ansible[azure]==2.7.0rc2 (Optional)
sudo apt-get install -y maven (Optional)
cd /usr/bin
sudo wget https://raw.githubusercontent.com/nadaraj15/alibaba_ansible/master/AliVM.yml
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/0db84a57-5117-d320-d641-e17dbed6ac0d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/7229987f-fb8e-5e66-7393-f65fdb8e527d.png)

6.  ビルドステップを追加して ansible playbook を起動したいと思います。このステップは ansible playbook を実行します。以下の情報を入力します。

- Playbook path: - AliVM.yml (プレイブック名)
- Inventory： - 「Inventoryを指定しない」を選択
- Credentials:- 「なし」を選択します(デプロイメントファイルに資格情報を埋め込んでいるので、環境変数として資格情報を渡すことができます)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/20f73991-163f-06f8-0bcc-f1555f46a607.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/32a54a99-2e09-df2b-d350-9e258d74e0b1.png)

7. デプロイ後のワークスペースをクリーンアップし、以下のコマンドでシェルスクリプトの実行ステップを追加します。

注意: `jenkins_home`があなたの場所である場合、デフォルトのパスは`/var/jenkins_home`に設定されています。しかし、カスタムの場所がある場合は、その代わりにその場所を使用することができます。

```
sudo rm -rf /var/jenkins_home/workspaces/<workspace_name>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/d76c1af9-f47d-ab9b-fff9-bc37f935c838.png)


8.  必要に応じてポストビルトアクションを追加します。最後に、すべてのステップが設定されたら、保存をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/3c881e23-eb2a-9f38-8197-099acd086dd5.png)

9. Jenkinsプロジェクトダッシュボードに移動し、「Build now」をクリックして手動でビルドをトリガーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/bbcb16c7-cd43-7ab2-bd56-37e81c063038.png)

10.  コンソール出力に移動して、トリガーされたビルドステータスを確認します。すべてのリソースが正常にプロビジョニングされると、出力に成功ステータスが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/4822dc16-0e22-da0e-bb82-5c7c0f7c98ad.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/60686544-e5ec-496e-681b-d40922e45e2f.png)


11.  Alibaba Consoleに移動して、プロビジョニングされたAlibaba ECSと構成を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/eaf0a364-28fe-620d-6bdf-baa2aee1d27a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/3a1c3436-e2a2-0ea2-d87d-0a59c500c980.png)

これで、Tomcat、Java、MySQLがインストールされたインスタンスをデプロイしました。ブラウザに対応するパブリックIPアドレスを入力すると、VMのパブリックIPの80番ポートを通してウェブサーバが公開されているので、Apache Tomcatのページが動作しているのが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/1d27b63e-9ef4-f389-8bb9-ede28b81d3bd.png)


#参考文献
1、[https://www.alibabacloud.com/blog/ci%2Fcd-with-jenkins---part-1%3A-install-jenkins-on-ubuntu_593717](https://www.alibabacloud.com/blog/ci%2Fcd-with-jenkins---part-1%3A-install-jenkins-on-ubuntu_593717?spm=a2c65.11461447.0.0.53a46c64aNElRK)
2、[https://www.alibabacloud.com/blog/continuous-integration-with-jenkins-on-alibaba-cloud_594512](https://www.alibabacloud.com/blog/continuous-integration-with-jenkins-on-alibaba-cloud_594512?spm=a2c65.11461447.0.0.53a46c64aNElRK)
3、[https://www.alibabacloud.com/blog/594449](https://www.alibabacloud.com/blog/594449?spm=a2c65.11461447.0.0.53a46c64aNElRK)
4、[https://github.com/alibaba/ansible-provider](https://github.com/alibaba/alibaba.alicloud?spm=a2c65.11461447.0.0.53a46c64aNElRK)
5、[https://mohitgoyal.co/2017/02/14/add-linux-slave-node-in-the-jenkins/](https://mohitgoyal.co/2017/02/14/add-linux-slave-node-in-the-jenkins/?spm=a2c65.11461447.0.0.53a46c64aNElRK)
6、[https://marketplace.alibabacloud.com/products/56728001/Tomcat_Nginx_My_SQL_Stack_Package_on_Ubuntu-cmjj011399.html?innerSource=search#product-details](https://marketplace.alibabacloud.com/error500?code=10010#product-details)

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*