2016年1月13日水曜日

OpenStackとChef Server、Vagrantを使って完全自動化を図る

用意するもの

Chef Workstationを導入するPCもしくはインスタンス
私はUbuntuの仮想インスタンスを用意しました。

Chef Workstationを導入する

下記URL先にあるChef Tutorialの案内に従います。
https://learn.chef.io/manage-a-node/ubuntu/
Chef DKをインストールします。

Chef Serverを利用可能にする

引き続き同じURLの案内に従ってChef Server(ホステット版)を利用可能にします。
サインナップが必要ですが無料です。
Chef ServerでOrganizationを1つ作成します。
Organizationを作成するとStarter Kitをダウンロードできるようになります。
Starter Kitをダウンロードして指定のディレクトリでUnzipします。
Starter KitにはChef Server (Hosted)にアクセスするための認証キーや組織名などが含まれています。


Vagrantを導入する

下記のサイトからVagrantをダウンロードして導入します。
https://www.vagrantup.com/downloads.html

Vagrantfileを作成する


Starter Kitで作成した~/chef-repoディレクトリに移動します。
vagrant initコマンドを実行します。
Vagrantfileを編集します。

VagrantのProvisionerとしてChef Clientを指定するガイドは下記のURLにあります。

https://docs.vagrantup.com/v2/provisioning/chef_client.html





ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
require 'vagrant-openstack-provider'

Vagrant.configure('2') do |config|

  config.vm.provision :chef_client do |chef|
    # ~/chef-repo/.chef/knife.rbに以下の3つのパラメータの内容が記述されています
    chef.chef_server_url = 'https://api.chef.io/organizations/matsuos'
    chef.validation_key_path = '~/chef-repo/.chef/matsuos-validator.pem'
    chef.validation_client_name = 'matsuos-validator'
    chef.add_recipe 'recipe[learn_chef_apache2]'
  end

  config.vm.define "primary-node" do |primary|
    primary.vm.provider :openstack do |os|
      os.networks           = [ {
                                name: 'internal',
                                address: '10.230.41.185'
                              } ]
      os.server_name        = 'matsuos-primary-node'
      os.user_data          = '
                              #cloud-config
                              password: zaq12wsx
                              chpasswd: { expire: False }
                              ssh_pwauth: True
                              hostname: matsuos-primary-node
                              manage_etc_hosts: true
                              '
    end
  end

  config.vm.define "backup-node" do |backup|
    backup.vm.provider :openstack do |os|
      os.networks           = [ {
                                name: 'internal',
                                address: '10.230.41.186'
                              } ]
      os.server_name        = 'matsuos-backup-node'
      os.user_data          = '
                              #cloud-config
                              password: zaq12wsx
                              chpasswd: { expire: False }
                              ssh_pwauth: True
                              hostname: matsuos-backup-node
                              manage_etc_hosts: true
                              '
    end
  end

  config.vm.box = 'openstack'
  config.ssh.username = 'ubuntu'
  # OpenStack上でキーペアを作成し、ダウンロードした秘密鍵を指定します
  config.ssh.private_key_path = '~/chef-repo/matsuos-vagrant-key.pem'
  config.omnibus.chef_version = :latest

  config.vm.provider :openstack do |os|
    os.openstack_auth_url = 'https://icos-sea.openstack.blueboxgrid.com:5001/v2.0'
    os.openstack_network_url = 'https://icos-sea.openstack.blueboxgrid.com:9797/v2.0'
    os.username           = 'matsuos'
    os.password           = 'xxxxxxxx'
    os.tenant_name        = 'demo project'
    os.flavor             = 'm1.tiny'
    os.image              = 'ubuntu-14.04'
    os.floating_ip_pool   = 'external'
    os.keypair_name       = 'matsuos-vagrant-key'
    os.security_groups    = ['matsuos-sg-ssh']
  end
end
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

OpenStackへアクセスするあたりの設定はこちらのリンクを参照ください。

Vagrantを使ってOpenStackを操作してみる


実行する

~/chef-repoに移動し(Vagrantfileがあるディレクトリ)、vagrant upを実行します。
もしインスタンスの作成には成功したものの、Chefの実行で失敗するような場合は、vagrant upを実行してもすでに作成済みといわれて何も動きません。
そのような場合はvagrant provisionを実行します。


Chef Server (hosted)のサイトでNodeを見ると、下図のように今プロビジョニングしたインスタンスが見えるようになります。


実行結果をブラウザで見ると、確かにChef Tutorialにあるような画面が出てきます。













2016年1月2日土曜日

Vagrant OpenStack Providerを使って複数のインスタンスを起動する

この記事が参考になりました。


https://groups.google.com/forum/#!topic/vagrant-up/x8NB3-Wilt4

次の例のように、config.vm.defineを使ってノード固有の情報を設定します。
認証などの共通部分はconfig.vm.defineの外側に記述すればよいのです。


  config.vm.define "primary-node" do |primary|
    primary.vm.provider :openstack do |os|
      os.networks           = [ {
                                name: 'internal',
                                address: '10.230.41.185'
                              } ]
      os.server_name        = 'matsuos-primary-node'
    end
  end

  config.vm.define "backup-node" do |backup|
    backup.vm.provider :openstack do |os|
      os.networks           = [ {
                                name: 'internal',
                                address: '10.230.41.186'
                              } ]
      os.server_name        = 'matsuos-backup-node'
    end
  end

  config.vm.provider :openstack do |os|
    os.openstack_auth_url = 'https://icos-sea.openstack.blueboxgrid.com:5001/v2.0'
    os.openstack_network_url = 'https://icos-sea.openstack.blueboxgrid.com:9797/v2.0'
    os.username           = 'matsuos'
    os.password           = 'xxxxxxxx'
    os.tenant_name        = 'demo project'
    os.flavor             = 'm1.tiny'
    os.image              = 'ubuntu-14.04'
    os.floating_ip_pool   = 'external'
    os.keypair_name       = 'matsuos-vagrant-key'
    os.security_groups    = ['matsuos-sg-ssh']
  end

VagrantとChef SoloによるOpenStack環境の自動構成

VagrantはVirtual Boxなどの仮想環境を制御するための便利なツールですが、OpenStackにも対応しています。
Chefはインスタンスの設定やミドルウェアの導入、設定を自動的に行うツールです。
VagrantとChefを組み合わせると、インスタンスを作成後に自動的にインスタンスに必要な導入設定を実施することができるので、コマンド一発で本番環境を作動させることも可能です。


準備


Vagrantの導入とOpenStack対応用のプラグイン導入は次の記事を参考にしてください。


Vagrantを使ってOpenStackを操作してみる

Chef Workstationの導入と設定は次の記事を参考にしてください。

Chef Workstationを構築する

なお、Chef Serverに関する設定は不要です(秘密鍵などの操作)。

次のコマンドを実行してテスト用のレシピをダウンロードします。

$ cd ~/chef-repo
$ mkdir cookbooks
$ cd cookbooks
$ chef generate cookbook learn_chef_apache2



設定


Vagrantfileは次のように設定します。赤字箇所が今回新たに追加した部分です。


require 'vagrant-openstack-provider'

Vagrant.configure('2') do |config|

  config.vm.box       = 'openstack'
  config.ssh.username = 'ubuntu'
  config.ssh.private_key_path = '~/.ssh/matsuos-vagrant-key.pem'

  config.omnibus.chef_version = :latest

  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = '~/chef-repo/cookbooks'
    chef.run_list     = 'learn_chef_apache2'
  end

  config.vm.provider :openstack do |os|

    # OpenStack Authentication
    os.openstack_auth_url = 'https://icos-sea.openstack.blueboxgrid.com:5001/v2.0'
    os.openstack_network_url = 'https://icos-sea.openstack.blueboxgrid.com:9797/v2.0'
    os.username           = 'matsuos'
    os.password           = 'xxxxxxxx'
    os.tenant_name        = 'demo project'

    # Instance definition
    os.flavor             = 'm1.tiny'
    os.image              = 'ubuntu-14.04'
    os.networks           = [
                            {
                              name: 'internal',
                              address: '10.230.41.184'
                            }
                            ]
    os.floating_ip_pool   = 'external'
    os.keypair_name       = 'matsuos-vagrant-key'
    os.security_groups    = ['matsuos-sg-ssh']
    os.server_name        = 'matsuos-01'
    os.user_data          = '
                            #cloud-config
                            password: zaq12wsx
                            chpasswd: { expire: False }
                            ssh_pwauth: True
                            hostname: matsuos-01
                            manage_etc_hosts: true
  end
end






それでは実行してみましょう。
Vagrantfileを置いたディレクトリから次のコマンドを実行します。

$ vagrant up



インスタンスが起動してsshをリスンするまでConnection refusedメッセージが数回表示されます。



インスタンスが起動すると、cookbooksディレクトリをrsyncしているようです。
Chef Clientをインストールするのに少し時間がかかります。
Chefを起動し、run_listに指定したレシピを読み込みます。



apache2を導入し、index.htmlを構成します。



apacheを起動して完成です。

出来上がったインスタンスのパブリックIPアドレスを確認します。




ブラウザでこのアドレスにアクセスします。



”hello world”という文字が表示されました。