はじめまして、エンジニアの小池です。 今回はAnsibleを使用してニフクラ(旧ニフティクラウド)のインスタンスを構築する方法を試してみようと思います。Ansibleは、PuppetやChefのようなクラウドインフラの構成管理ツールとして最近人気が高まっています。エージェントレスで利用できるため特別なソフトのインストールが不要なこと、YAML形式でプレイブック(設定ファイル)を記述するため、少ない手間でサーバーを管理できる点が特徴です。
概要
AnsibleのニフクラモジュールがGitHubで公開されているので、今回はそちらを利用します。
詳細はこちらになります。ニフクラモジュール
構成
一般的なウェブアプリケーションの構成で構築します。
使用するサービスは
- サーバー2台
- FW
- ロードバランサー
事前準備
credential情報
事前にニフクラのコントロールパネル(以下コンパネ)上でaccess_key, secret_access_key, endpointを確認しておきましょう。
ssh-keyの登録
起動したサーバーにアクセスするための鍵をコンパネから登録しておきましょう。
FWの作成
起動したサーバーに割り当てるためのファイアーウォールをコンパネから作成しておきましょう。
LBの作成
ロードバランサーをコンパネから作成しておきましょう。
ディレクトリの作成
最初に全体のディレクトリ構成を示します。
├── ansible.cfg
├── group_vars
│ └── all
├── hosts
├── library
│ │....
│
├── nginx.yml
└── provision.yml
プロジェクトディレクトリの作成 まずプロジェクトディレクトリの作成を行います。
mkdir project_name
必要なディレクトリの作成 続いて同じ要領で、group_vars,library ディレクトリを作成してください。
ニフクラモジュールのインストール
library以下にGitHubのニフクラモジュールのファイルをそのまますべて移してください。
モジュールをインストールする方法の詳細は別途ドキュメントを確認してください。
移した後のファイル構成はこのようになります。
├── ansible.cfg
├── group_vars
│ └── all
├── hosts
├── library
│ ├── README.md
│ ├── documents
│ │ ├── niftycloud.md
│ │ ├── niftycloud_fw.md
│ │ ├── niftycloud_lb.md
│ │ └── niftycloud_volume.md
│ ├── niftycloud.py
│ ├── niftycloud_fw.py
│ ├── niftycloud_lb.py
│ ├── niftycloud_volume.py
│ └── tests
│ ├── files
│ │ ├── calculate_signature_sample.sh
│ │ ├── startup_script
│ │ └── startup_script_blank
│ ├── test_niftycloud.py
│ ├── test_niftycloud_fw.py
│ ├── test_niftycloud_lb.py
│ └── test_niftycloud_volume.py
├── nginx.yml
└── provision.yml
これで事前準備は終了です。
次にAnsibleのコードを作成していきます。
Ansibleの環境設定
ansible.cfgファイルの編集
ansible.cfg
[defaults]
private_key_file=~/.ssh/id_rsa
host_key_checking = False
ここでは、ansible実行の際に使用する鍵の登録や、ssh接続する際にでてくるアラートを防ぐ設定をしています。
これにより、起動したインスタンスにアクセスする際にAnsibleがストップしなくなります。
詳細はドキュメントを参照してください。
hostsファイルの編集
hostsファイルにhostを登録します。
hosts
[localhost]
127.0.0.1 ansible_python_interpreter=python
ローカルで実行するため、localhostを登録してあります。
またansible_python_interpreterを設定します。pipで入れたモジュールを呼び出す事ができないといったエラーが起きるため、ここで固定してあります。
variableファイルの作成
group_vars/allファイルを編集します。
ここにプレイブック中で使う変数を定義していきます。
group_vars/all
# credential
access_key: xxxxxxxxxxxxx
secret_access_key: xxxxxxxxxxx
endpoint: west-1.cp.cloud.nifty.com
# FW
fw_group_name: ansibletest # 事前準備で作成したFWの名前
# Instance
image_id: 68 # serverのイメージID
key_name: west1ansibletest
instance_type: mini
availability_zone: west-11
accounting_type: 2 # 月額:1 従量課金: 2
ip_type: static
instance_id_prefix: ansible
instance_port: 80
loadbalancer_name: "ansibletest" # 事前準備で作成したロードバランサーの名前
loadbalancer_port: 80
- access_key, secret_access_key, endpointの設定
credential系の値の設定です。
今回は手順を簡略化するためにこのファイルにcredential系の情報を書いていますが、gitなどでプッシュしないように気をつけてください。
プレイブックの作成
プレイブックは大きく二つに分かれます。
一つ目はサーバーなどインフラの構築をするためのプレイブック。
二つ目は起動したサーバーにnginx(ソフトウェアを)をインストールするプレイブックです。
まずはインフラの構築のプレイブックから説明していきます。
インフラの構築
最初に全体のコードを示します。
provision.yml
---
- name: Provision instances in NiftyCloud
hosts: localhost
connection: local
gather_facts: False
vars_files:
- group_vars/all
tasks:
- name: pip install requests
pip:
name: "requests"
- name: launch server
niftycloud:
access_key: "{{ access_key }}"
secret_access_key: "{{ secret_access_key }}"
endpoint: "{{ endpoint }}"
instance_id: "{{ instance_id_prefix }}{{ item }}"
state: "running"
image_id: "{{ image_id }}"
key_name: "{{ key_name }}"
security_group: "{{ fw_group_name }}"
instance_type: "{{ instance_type }}"
availability_zone: "{{ availability_zone }}"
accounting_type: "{{ accounting_type }}"
ip_type: "{{ ip_type }}"
with_sequence: count=2
- name: Regist server to load balancer
niftycloud_lb:
access_key: "{{ access_key }}"
secret_access_key: "{{ secret_access_key }}"
endpoint: "{{ endpoint }}"
instance_id: "{{ instance_id_prefix }}{{ item }}"
instance_port: "{{ instance_port }}"
loadbalancer_name: "{{ loadbalancer_name }}"
loadbalancer_port: "{{ loadbalancer_port }}"
state: "present"
with_sequence: count=2
主要なポイントを一つ一つ説明していきます。
requestsのインストール
- name: pip install requests
pip:
name: "requests"
Ansibleのニフクラモジュールがrequestsモジュールを使用しているため、ここでローカルにインストールしています。
サーバーの起動
- name: launch server
niftycloud:
access_key: "{{ access_key }}"
secret_access_key: "{{ secret_access_key }}"
endpoint: "{{ endpoint }}"
instance_id: "{{ instance_id_prefix }}{{ item }}"
state: "running"
image_id: "{{ image_id }}"
key_name: "{{ key_name }}"
security_group: "{{ fw_group_name }}" # FWへの登録
instance_type: "{{ instance_type }}"
availability_zone: "{{ availability_zone }}"
accounting_type: "{{ accounting_type }}"
ip_type: "{{ ip_type }}"
with_sequence: count=2
with_sequence: count=2
これはこのタスクを2回ループさせるための記述です。instance_id: "{{ instance_id_prefix }}{{ item }}"
instance_idは一意にする必要があるため、プレフィックスに{{ item }}をつけてループ毎に被らないようにしています。
security_group: "{{ fw_group_name }}"
この設定を書くことによって、起動したサーバーと事前準備で作成しておいたFWとの連携が行えます。
今回はサーバーを2台を使用するのでこのような記述となっています。
現在、何回目のループかは
{{ item }}
に数字が格納されています。ロードバランサーへの登録
- name: Regist server to load balancer
niftycloud_lb:
access_key: "{{ access_key }}"
secret_access_key: "{{ secret_access_key }}"
endpoint: "{{ endpoint }}"
instance_id: "{{ instance_id_prefix }}{{ item }}"
instance_port: "{{ instance_port }}"
loadbalancer_name: "{{ loadbalancer_name }}"
loadbalancer_port: "{{ loadbalancer_port }}"
state: "present"
with_sequence: count=2
最後に事前準備の段階で作成しておいた、ロードバランサーへ起動したサーバーを登録します。
provision.ymlの実行
ではインフラの構築をするためのプレイブックができたので、実行してみたいと思います。
プロジェクトルートで、以下のようにコマンドを入力してください。
ansible-playbook -i hosts provision.yml
実行したらコンパネへ行きサーバーが作成されているか確認してみましょう。
nginxプレイブック
前章でインフラの構築が終わりました。
次に起動したサーバにnginxをインストールしていきます。
起動したサーバーのIPの確認
コンパネから起動したIPを確認して、メモしておいてください。
hostsの追加
次にhosts
ファイルの末尾に以下を追加します。
[nifcl_hosts]
xxx.xxx.xxx.xxx # 起動したサーバのip address
yyy.yyy.yyy.yyy # 起動したサーバのip address
nginx用のプレイブックファイルの作成
nginx用のプレイブックファイルは以下のようになります。
nginx.yml
---
- hosts: nifcl_hosts
name: set up server
user: root
gather_facts: true
tasks:
- name: install ntp
yum:
name: ntp
state: present
- name: Check NTP service
service: name=ntpd state=started
- name: install epel-release repository
yum:
name: epel-release
state: present
- name: install nginx
yum:
name: nginx
state: present
- name: start nginx
service:
name: nginx
state: started
実行
では作成したnginxのプレイブックを実行してみます。コマンドは以下のようになります。
ansible-playbook -I hosts nginx.yml
確認
実行後、しばらく待ってからロードバランサー経由でアクセスしてみましょう。
htmlのページが表示されれば成功です。
しばらく待つ理由としては、ロードバランサーがヘルスチェックを通すのに時間がかかる場合があるためです。
まとめ
いかがでしたでしょうか?
今回はAnsibleを使用してニフクラのインスタンスの構築を行いました。
今回はサーバを二台しか使用していないので、効果をあまり実感できないかもしれませんが台数が増えれば増えるほど効果が実感できると思います。
是非活用してみてください。