2015年12月1日火曜日

AnsibleだけでIDCFクラウドの仮想マシン立ち上げから、HAProxyを使ったSSLオフローダーを構築する #idcfrontier


ども!なのまるです!
IDCF Cloud Advent Calendar 2015 - Qiita」の一日目です!

軽いネタにしようと思ったんですが、やっているうちに結構重たくなってきました~

Ansibleを使って、
  • 仮想マシンの立ち上げ
  • HAProxyのインストール
  • SSLオフロード
を実現してみます!


もくじ



前提条件

  • IDCFクラウドアカウント作成済み
  • IDCFクラウドのAPIキー取得済み
  • 実行クライアントは Ubuntu 14.04
  • 立ち上げるサーバーも Ubuntu 14.04
  • Python 2.7(3はAnsible未対応のため)
  • Ansible
  • cs(Pythonのcs)
  • cloudmonkey
  • HAProxy v1.5

構築手順

いろいろ説明があった方がいいと思うのですが、先に構築手順を書いておきます!
後ろの方に、各説明を入れておきます!

IDCFにサインアップして、東日本リージョンを有効化 と APIキー取得

ここは細かい手順を割愛します!

IDCFさんが提供している手順書で、
  • 「東日本リージョン」を有効化
  • APIキーの取得
しておいてくださいー

手順書


Ansibleが動く環境を構築する

すでにAnsibleの動く環境がある方は読み飛ばしてください

これがちょっと面倒なんですが。最初しかやらないので、さらっと終わらせましょう!
現在最新のAnsibleバージョンが「1.9.4」でした。


可能な限りできるだけ新しいバージョンを使ってください。

ではまず、Linuxのマシンを作ります!
IDCFクラウドのポータルから「Ubuntu Server 14.04 LTS」を立ち上げます。

  • ゾーン: tesla
  • マシンタイプ: light.S1
  • イメージ: Ubuntu Server 14.04 LTS 64-bit
  • ボリューム: ルートディスク 15GB
  • SSH Keyは、作成するか「なし」

最低限Ansibleに必要なパッケージのインストール

立ち上げたUbuntu Serverにログインします!

セットアップしていきます!
sudo apt-get update
sudo apt-get install python-pip
sudo pip install ansible
sudo pip install sshpubkeys


Ansibleでその他のパッケージのインストール

さらなる環境構築をAnsibleのPlaybookにしましたので、こちらを使ってみると「この後」早いです!
Ansibleの動作確認にもなりますしね!


snickerjp/ansible_env_playbook
snickerjp/ansible_env_playbook
実際のコマンド
sudo apt-get install git
git clone https://github.com/snickerjp/ansible_env_playbook.git
cd ansible_env_playbook
cp hosts.template hosts


main.ymlの編集
  • vars:
  • tasks:
ここを自分の環境に合わせて編集してください!
  vars:
    key_name: snickerjp@tk2
    #zone_name: augusta
    zone_name: tesla
  tasks:
    - name: sshのキーをクラウドに送信する
      authorized_key:
          user=snickerjp
          key="{{ lookup('file', '~snickerjp/.ssh/id_rsa.pub') }}"
          state=present

Ansible実行
ansible-playbook main.yml -i hosts -c local --ask-sudo-pass

これで、環境構築が終わるはずです~!

Ansibleを使わないでやる方法

Ansibleを使わないと、そこそこ面倒ですw
sudo apt-get install python-dev
sudo apt-get install python-markupsafe
sudo apt-get install vim
sudo pip install cs
sudo pip install cloudmonkey
sudo git clone https://github.com/snickerjp/idcf_ansible_playbook.git /opt/idcf_ansible_playbook

Ansibleを使って、IDCFクラウドの仮想マシン(Ubuntu)を立ち上げる

先ほどの処理で、AnsibleのPlaybookをgithubから持ってきています。
権限を自分の環境に合ったものに変更してください!
sudo chown snickerjp:snickerjp -R /opt/idcf_ansible_playbook
cd /opt/idcf_ansible_playbook
sh init.sh # これで、templateが展開されます
snickerjp/idcf_ansible_playbook
snickerjp/idcf_ansible_playbook

IDCFクラウドのAPI設定をする

cloudstack.iniを編集
  [cloudstack]
  # IDCF WEST endpoint
  #endpoint = idcf_end_point
  # IDCF EAST endpoint
  endpoint = idcf_end_point
  key = API Key
  secret = Secret Key


仮想マシンを立ち上げるPlaybookを編集

  • ゾーン: tesla
  • イメージ: Ubuntu Server 14.04 LTS 64-bit
を想定しています。

infra.ymlを編集
  vars:
    vm_name: haproxy-vm-1
    firewall_ip: [idcf public ip]
    key_name: [idcf collect pubkey]
    #zone_name: augusta
    zone_name: tesla


以下の部分を環境に合わせて、書き換えてください。
  • template:(イメージID)
  • service_offering:(マシンタイプ)

    - name: 仮想マシンを作成する
      local_action:
        module: cs_instance
        name: "{{ vm_name }}"
        hypervisor: VMware
        #template: c1387e4f-4a72-4d8b-ba6b-5276361aaa6b #west
        # EAST [Ubuntu Server 14.04 LTS 64-bit]
        template: 90fec2e6-4fdf-4df6-bdad-c3eb5d57a6f6
        service_offering: light.S1
        ssh_key: "{{ key_name }}"
        zone: "{{ zone_name }}"

Ansibleを実行して仮想マシンが立ち上がるのを確認

ansible-playbook infra.yml -i hosts -c local
こんな感じで、エラーがなければ大丈夫!
 PLAY [localhost] **************************************************************
  
 GATHERING FACTS ***************************************************************
 ok: [localhost]
  
 TASK: [sshのキーをクラウドに送信する] ****************************
 ok: [localhost -> 127.0.0.1]
  
 TASK: [仮想マシンを作成する] ****************************************
 changed: [localhost -> 127.0.0.1]
 
 TASK: [httpを通過させるようファイヤーウォールの設定を修正] ***
 changed: [localhost -> 127.0.0.1]
 
 TASK: [sshを通過させるようファイヤーウォールの設定を修正] ***
 changed: [localhost -> 127.0.0.1]
 
 TASK: [ポートフォワーディング80-> haproxy-vm-1:80] *****************
 changed: [localhost -> 127.0.0.1]
 
 TASK: [ポートフォワーディング22-> haproxy-vm-1:22] *****************
 changed: [localhost -> 127.0.0.1]
 
 PLAY RECAP ********************************************************************
 localhost                  : ok=7    changed=5    unreachable=0    failed=0
立ち上がりました!

2回目の実行だとこんな感じ・・・
何も起こりませーん(冪等性が担保されていました!)
 PLAY [localhost] **************************************************************
 
 GATHERING FACTS ***************************************************************
 ok: [localhost]
 
 TASK: [sshのキーをクラウドに送信する] ****************************
 ok: [localhost -> 127.0.0.1]
 
 TASK: [仮想マシンを作成する] ****************************************
 ok: [localhost -> 127.0.0.1]
 
 TASK: [httpを通過させるようファイヤーウォールの設定を修正] ***
 ok: [localhost -> 127.0.0.1]
 
 TASK: [sshを通過させるようファイヤーウォールの設定を修正] ***
 ok: [localhost -> 127.0.0.1]
 
 TASK: [ポートフォワーディング80-> haproxy-vm-1:80] *****************
 ok: [localhost -> 127.0.0.1]
 
 TASK: [ポートフォワーディング22-> haproxy-vm-1:22] *****************
 ok: [localhost -> 127.0.0.1]
 
 PLAY RECAP ********************************************************************
 localhost                  : ok=7    changed=0    unreachable=0    failed=0

補足: イメージIDの取得方法

イメージIDはIDCFのクラウドポータルからはわかりません!
cloudstackのAPIを使うツール「cloudmokey」を使います!
cloudmonkey
 > (プロンプトになる)
 > set url 「idcf_end_point」を入れる
 > set apikey 「API Key」を入れる
 > set secretkey 「Secret Key」を入れる
 # 動作確認
 > sync
500 APIs discovered and cached
  • イメージのID取得例
cloudmonkey list templates templatefilter=all filter=id,name |grep -1 Ubuntu
こんな感じで出てきました!
~ 略 ~
id = 782a845c-24bc-4538-a4c9-4821290200b3
name = Ubuntu-1GB-2
================================================================================
--
id = f3fbd637-8e42-4506-a114-e3f1e3a00924
name = Ubuntu Server 10.04 LTS 64-bit
================================================================================
--
id = 90fec2e6-4fdf-4df6-bdad-c3eb5d57a6f6
name = Ubuntu Server 14.04 LTS 64-bit
================================================================================


HAProxy を入れて SSLオフロードを設定する


hosts を書き換える

ここをさっきの[idcf public ip]と同じにしてください
[haproxy-vm]
XXX.XXX.XXX.XXX


HAProxyの設定

idcf_ansible_playbook/roles/ansible-haproxy-ssl/
  • defaults/main.yml
  • vars/main.yml
  • (必要あれば)templates/haproxy.cfg.j2
上記を編集します。

defaults/main.yml
は、以下の部分を直せばいいかなー
  • haproxy_backend_httpchk
  • haproxy_backend_servers
  # Backend settings.
  haproxy_backend_name: 'habackend'
  haproxy_backend_mode: 'http'
  haproxy_backend_balance_method: 'roundrobin'
  haproxy_backend_httpchk: 'HEAD / HTTP/1.1\r\nHost:localhost'
  
  # List of backend servers.
  #haproxy_backend_servers: []
  haproxy_backend_servers: 
    - name: web01
      address: 10.3.0.170:80
    - name: web02
      address: 10.3.0.150:80


サーバー証明書の準備

HAProxyでは、「秘密鍵と証明書をまとめた、一つのファイル」を使います!
cat server.key server.crt >> roles/ansible-haproxy-ssl/files/hogehoge.pem

vars/main.yml
は、(ファイル名を変えた場合)以下の部分編集

  • haproxy_pem
 ---
 # vars file for ansible-haproxy-ssl
 haproxy_pem: hogehoge.pem


Ansible で HAProxy 構築

以下のコマンドを実行!
ansible-playbook main.yml -i hosts -c ssh --ask-sudo-pass
--ask-sudo-passはsudoするときパスワードが必要な場合

以上で、完了です!

まとめ

どうでしょうか!?
CloudStackベースのIDCFでAPIを使って「仮想マシンの立ち上げ」
Ansibleで「HAProxy SSLオフローダー」構築簡単にできることを確認してもらえたかと思いますー

長くなっちゃってすみませんでしたー!m(__)m
2日目よろしくですー!

各コンポーネントの説明


Ansibleについて

AnsibleはPythonとSSHさえ使えれば動く『構成管理ツール』です!
最近は国内でも、利用事例が多くなってきている注目のツールです!

Ansible is Simple IT Automation
Ansible is Simple IT Automation

これからやってみようという方は、こちらの入門書がお勧めです!


HAProxyについて

HAProxy はオープンソースとして開発されているLVS 負荷分散ソフトウェアです!
1.5から、『SSL』に対応しました!

HAProxy - The Reliable, High Performance TCP/HTTP Load Balancer

IDCFクラウドについて

IDCFクラウドは言わずと知れた、国内クラウド一つです!
Cloudstackをベースにしているため、CloudstackのAPIを使うことができます!(全てではないですが。)

クラウドサービスならIDCFクラウド -使いやすく、パワフル
IDCFクラウド -使いやすく、よりパワフルに|IDCフロンティア

Zenback