各システム上で同一のソフトウェア/コンポーネントを使用した分散インフラストラクチャの構成と管理

この記事では、各システム上で同一のソフトウェア/コンポーネントを使用して分散型インフラを構成し、管理する方法を説明しています。

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

[Alibaba Cloud Tech Share](https://www.alibabacloud.com/campaign/techshare?spm=a2c65.11461447.0.0.77fa1da95dT1Qh) 著者Ankit Mehta、[Tech Share](https://www.alibabacloud.com/campaign/techshare?spm=a2c65.11461447.0.0.77fa1da95dT1Qh)は、技術的な知識やベストプラクティスをクラウドコミュニティ内で共有することを奨励するAlibaba Cloudのインセンティブプログラムです。

IT管理者やDevOpsエンジニアにとって最大の課題は、すべての環境が常に同じコンポーネントを搭載していることを確認し、アジャイルな方法で環境を準備することです。

場合によっては、環境が地理的に分散しているため、既存のインフラに影響を与えないような方法で変更を展開し、SLO（Service Level Objectives）、SLI（Service Level Indicators）、SLA（Service Level Agreements）に間に合うように配信する必要があります。

このブログ記事は、IT管理の経験がある程度または中級者の読者を対象としています。

ここでは、以下の質問にお答えします。

- 構成管理とは？
- 構成管理を実装するには？
- Ansible とは何か？
- 構成管理で Ansible はどのように役立つか？
- Ansible Playbookとは何か？
- Ansible Playbookの書き方
- Ansible Playbook を使ったサーバの設定
- Ansible Galaxyとは？
- Ansible Galaxyを使ったサーバの設定

ウィキペディアで定義されているように、「構成管理とは、製品の性能、機能、物理的属性と、その製品の要件、設計、運用情報との整合性を生涯にわたって確立し、維持することである」とされています。

DevOpsの観点からは、開発環境が本番環境とUAT - User Acceptance Testサーバと全く同じであることを確認する必要があります。そうすることで、環境ごとに異なる結果が見えてくることを減らすことができます。

始めるための最初のステップは、すべての要件のインベントリを作成することです。以下は、インベントリのベースラインファイルのサンプルです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/1e0ec47c-8d67-0ba5-2fbb-b75f3403c222.png)

インベントリファイルの中で最も重要なコンポーネントのいくつかは

1、オペレーティングシステム名とバージョン
2、Web/アプリ/DBサーバ名とバージョン
ベストプラクティスとして、ファイルのすべてのリビジョンを保持する必要があります。あなたは、GitHub、Bitbucket、Google Driveまたは[Alibabaクラウドオブジェクトストレージサービス（OSS）](https://www.alibabacloud.com/product/oss?spm=a2c65.11461447.0.0.77fa1da95dT1Qh)を使用することができます。このブログ記事では、アリババクラウドのOSSを使用します。設定ファイルは5GB以下になり、データの転送量も少なくなるため、実質的には自由にファイルを管理することができます。以下はOSS上に保存されている設定ファイルの構成例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/6dfa60b0-b760-cb83-89cf-605eb46e0b97.png)


さて、要件ができたので、次は自動化するために[Ansible](https://www.ansible.com/?spm=a2c65.11461447.0.0.77fa1da95dT1Qh)を使用します。AnsibleはオープンソースのIT自動化ツールで、ITインフラの安定性、信頼性、一貫性を向上させることができます。

#なぜAnsibleなのか？
- Ansible はプッシュ技術で動作し、リモートサーバにインストールするための特別なクライアントは必要ありません。必要なのはSSH接続だけです。
- Ansibleには1300以上のモジュールとプラグインがあり、Webサーバ、データベースサーバ、ネットワーク、セキュリティ、docker、Kubernetes、ストレージ、ネットワーク、監視などをサポートしています。
- Ansibleは非常に大きなコミュニティのサポートを受けています。
- Ansibleは[YAML](https://en.wikipedia.org/wiki/YAML?spm=a2c65.11461447.0.0.77fa1da95dT1Qh)を使って入力を取得し、リモートシステムを設定しています。
- Ansibleには強力な[オーケストレーション機能](https://searchitoperations.techtarget.com/definition/cloud-orchestrator?spm=a2c65.11461447.0.0.77fa1da95dT1Qh)が搭載されています。VM のプロビジョニングからアプリケーションのデプロイまでをサポートしてくれます。
- Ansibleは適応が簡単です。スクリプトの作成と実行に特別なスキルは必要ありません。

#前提条件
まずはAnsibleを使ってみましょう。基本的な要件は以下の通りです。

1、Ansibleをインストールするためのホストシステムが1台
2、SSHアクセスが可能なサーバーが1台（このブログ記事の要件では、サーバーが2台あります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/9f38118f-3562-85db-c320-7908da3d7fbb.png)

デモ目的では、UbuntuベースのAlibaba Cloud [Elastic Compute Service](https://www.alibabacloud.com/product/ecs?spm=a2c65.11461447.0.0.77fa1da95dT1Qh) (ECS)サーバを使用します。

###その他のヒント
執筆時点では、Ubuntu 18.04はまだ一部地域のデフォルトイメージでは利用できない場合があります。Ubuntu 18.04を搭載したサーバーを2台用意するには、カスタムイメージオプションを利用することができます。これを実現するには

1.  1台のサーバーに16.04をインストールします。
2.  サーバーを18.04にアップグレード
3.  サーバーがアップグレードされたら、イメージを作成するために移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/e5336143-f18b-0c2c-3367-2e90f1465dcd.png)


4.  イメージを作成したら、このイメージをインストール用のカスタムイメージとして使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/52bbd2e3-f7e3-cba4-089f-cffb937bf457.png)

#Ansibleのインストール
###ステップ1：Ansibleのインストール（ホストシステム上/Ansibleシステム上
Ansibleは直接利用できるパッケージではないので、Ansibleのppaをインストールする必要があるかもしれません。以下のコマンドを実行します。

```
sudo apt-get update
sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible
```

###ステップ2: バージョンの検証(動作するかどうかテストしてください)
ansible --version

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/3ce2a975-27b3-a551-e729-2285c999e1ce.png)

###ステップ3: 設定ファイルの更新
Ansible の観点から見ると、主に 2 つの重要な設定ファイルがあります。

- ansible.cfg はその名の通り ansible に関連するすべての設定が含まれています。
- hosts ファイルには、すべてのホストファイルのリストが含まれています。
Ansible はリモートコンピュータに接続するために root ユーザを使用します。ベストプラクティスとして、ログインユーザとして root を使用するのは良くありません。

root ユーザの代わりに他のユーザをサーバ設定に使用する場合は、代替ユーザを使用するように設定ファイルを更新する必要があります。

リモートログインユーザを更新するには、ansible.cfg ファイルの remote_user セクションを更新します。私の場合、ユーザ名はalibabacloudなので、更新された設定は以下のようになります。

remote_user = alibabacloud

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/224cc61c-b276-3d6e-9233-8d88452531b7.png)

次のステップはホストファイルを更新することですが、論理グループの下にサーバーをグループ化することをお勧めします。これは、システム管理をスムーズにするだけでなく、高レベルのネットワークセグメンテーションを提供するのに役立ちます。あなたは、ドメイン名またはIPアドレスのいずれかでホストファイルのエントリを実装することができます。以下は、必要なエントリを含むホストファイルのサンプルです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/ec36b351-f2da-8fe9-7545-cf50f78b3e52.png)

###ステップ4：接続の確認
ping コマンドを実行して、接続が正常に動作しているかどうかを確認します。

```
ansible WebServer -m ping -e 'ansible_python_interpreter=/usr/bin/python3'
```

ホストを追加する前にpingを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/07436201-6e4d-3ddc-f6c5-f62576bda349.png)


ホストとユーザーの追加後にpingを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/1dad82a2-2dbf-85e4-d99b-ca9ea14e92e4.png)


Ansibleの最新バージョンでは、インタプリタとしてPython3を必要とするため、-e 'ansible_python_interpreter=/usr/bin/python3'を渡す必要があります。デフォルトの python バージョンは、ホストのインベントリファイルに python インタプリタ変数を追加することで上書きすることができます。

```
[WebServer:vars]
'ansible_python_interpreter=/usr/bin/python3'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/9b4517f3-29e3-7daf-6e55-eabe41af7d8a.png)


###ステップ5: リモートサーバーを更新する
接続テストが成功したら、最初の基本コマンドを適用してリモートサーバを更新します。

```
ansible WebServer -m apt -a "upgrade=yes update_cache=yes" -b
```

ここで、-mはモジュールを定義します。デモのために、すべてのサーバはUbuntuベースのサーバで、システムがDebianベースの場合は "apt "を使用し、"apt "を "deb "に置き換えます。システムがCentOSをベースにしている場合は "yum "に、Fedoraの場合は "dnf "に置き換えてください。

-a はモジュールの引数、-b はスーパーユーザとしてコマンドを実行することを示します。

upgrade=yes はシステムのアップグレードを示します。ディストリビューションのアップグレードが必要な場合は、 upgrade=dist のコマンドが必要です。

update_cache=yes は apt-get update と同等のコマンドです。

Ansible の全モジュールの一覧は [Ansible Modules](https://docs.ansible.com/ansible/latest/modules/modules_by_category.html?spm=a2c65.11461447.0.0.77fa1da95dT1Qh) から参照できます。

###ステップ5：Ansibleのプレイブック
コマンドを 1 つずつ実行しても、定義済みのシェルスクリプトや Ansible スクリプトを実行しても違いはありません。Ansibleのプレイブックは、必要なステップ（タスク）をすべて1つのファイルにまとめてリモートサーバー上で実行することで、この問題を解決することができます。

スクリプトはYAMLファイルで書かれており、前のステップで実行したのと同じコマンドを使用します。

#ECSサーバにWebサーバをインストールする
Webサーバーの設置には複数のステップがあります。より便利でわかりやすくするために、一歩一歩進めていきましょう。

サーバーをインストールするためのYAMLファイルを作成し、サービスが稼働していることを確認します。

```
---
- hosts: WebServer
  tasks:
    - name: Install NginX
      apt: name=nginx state=latest
    - name: Start NginX Service
      service:
          name: nginx
          state: started
```

上記のスクリプトでは、WebServer の下に定義されている全てのホストに以下のタスクが実行されます。

Task 1: 最新の NginX サーバーのインストール

Task 2: Nginxの起動

#デフォルトのWebサイトページの展開
さて、Webサーバーをインストールしたので、いよいよデフォルトのWebサイトを展開していきます。このブログ記事の範囲では、既存のプレイブックを修正してサーバー上に静的なWebページを展開していきます。

```
      - name: "HTML Test Deploy"
        become: true
         syncronize:    
           dest: /var/www/html
           src: ../default-site/
```

上記の場合、Ansible のプレイブックは /default-site フォルダを宛先 /var/www/html に同期させます。

スクリプトの全文は [https://github.com/ankyit/ansible-demo/blob/master/install-nginx.yml](https://github.com/ankyit/ansible-demo/blob/master/install-nginx.yml?spm=a2c65.11461447.0.0.77fa1da95dT1Qh&file=install-nginx.yml) からアクセスできます。

複数のサーバがあり、両方のサーバを同時に設定する必要があるとします。これを実現するには、インベントリファイルに新しいサーバエントリを追加し、ansible-playbookを実行すると、すぐに両方のサーバの準備が整います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/d3073e2e-6e04-6305-d24a-740636abe3cc.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/47cadc69-0d1d-b653-5f19-4c22ee1aab1b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/d9193011-39ef-c9c7-a70a-20fd47c672a0.png)


プレイブックで適用される変更を常にチェックすることをお勧めします。これを実現するには、プレイブックを --check パラメータで実行します。これにより、サーバ上でのスクリプト実行のドライランが行われます。

プレイブックの実行中に意図した通りに実行されなかったり、期待した結果が得られなかったりする場合は、スクリプトのデバッグが必要になるかもしれません。スクリプトを -vvvv で実行すると、実行の詳細な出力が得られます。これは問題を見つけるのに役立ちます。

#Ansible の動作

下記動画を参照ください。

https://video-intl.alicdn.com/Blog/Ansible_in_Action.mp4

注: ここで説明するすべてのスクリプトは [https://github.com/ankyit/ansible-demo](https://github.com/ankyit/ansible-demo?spm=a2c65.11461447.0.0.77fa1da95dT1Qh) からアクセスできます。

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