Chef-ZeroでOpenStack Kiloデプロイ(オールインワン編)

こんにちは。@jedipunkz です。

久々に openstack-chef-repo を覗いてみたら ‘openstack/openstack-chef-repo’ とし て公開されていました。今まで stackforge 側で管理されていましたが ‘openstack’ の方に移動したようです。

https://github.com/openstack/openstack-chef-repo

結構安定してきているのかな?と想い、ちらっと試したのですが案の定、簡単に動作さ せることが出来ました。

今回はこのレポジトリを使ってオールインワン構成の OpenStack Kilo を作る方法をま とめていきます。

前提の構成

このレポジトリは Vagrant で OpenStack を作るための環境一式が最初から用意されて いますが、Vagrant では本番環境を作ることは出来ないため、Ubuntu ホストを前提と した記述に差し替えて説明していきます。前提にする構成は下記のとおりです。

  • Uuntu Linux 14.04 x 1 台
  • ネットワークインターフェース x 3 つ
  • eth0 : External ネットワーク用
  • eth1 : Internal (API, Manage) ネットワーク用
  • eth2 : Guest ネットワーク用

特徴としては上記なのですが、eth2 に関してはオールインワンなので必ずしも必要と いうわけではありません。複数台構成を考慮した設定になっています。

前提のIP アドレス

この記事では下記の IP アドレスを前提にします。お手持ちの環境の IP アドレスが違 い場合はそれに合わせて後に示す json ファイルを変更してください。

  • 10.0.1.10 (eth0) : external ネットワーク
  • 10.0.2.10 (eth1) : api/management ネットワーク
  • 10.0.3.10 (eth2) : Guest ネットワーク

事前の準備

事前に対象ホスト (OpenStack ホスト) に chef, berkshelf をインストールします。

sudo -i
curl -L https://www.opscode.com/chef/install.sh | bash

Berkshelf をインストールするのに必要なソフトウェアをインストールします。

apt-get -y install build-essential zlib1g-dev libssl-dev libreadline-dev ruby-dev libxml2-dev libxslt-dev g++

Berkshelf をインストールします。

/opt/chef/embedded/bin/gem install berkshelf --no-ri --no-rdoc

デプロイ作業

それでは openstack-chef-repo を取得してデプロイの準備を行います。 ブランチの指定は行わず master ブランチを取得します。Kilo は master ブランチで 管理されています。次のバージョンの開発が始まるタイミングで ‘stable/kilo’ ブラ ンチに管理が移されます。

sudo -i
cd ~/
git clone https://github.com/openstack/openstack-chef-repo.git

次に Berkshelf を使って必要な Cookbooks をダウンロードします。

cd ~/openstack-chef-repo
/opt/chef/embedded/bin/berks vendor ./cookbooks

Environment を作成します。これは各環境に合わせた設定ファイルのようなもので、各 Cookbooks の Attributes を上書きする仕組みになっています。下記の内容を

openstack-chef-repo/environments/aio-neutron-kilo.json

というファイル名で保存してください。

{
  "name": "aio-neutron-kilo",
  "description": "test",
  "cookbook_versions": {
  },
  "json_class": "Chef::Environment",
  "chef_type": "environment",
  "default_attributes": {
  },
  "override_attributes": {
    "mysql": {
      "bind_address": "0.0.0.0",
      "server_root_password": "mysqlroot",
      "server_debian_password": "mysqlroot",
      "server_repl_password": "mysqlroot",
      "allow_remote_root": true,
      "root_network_acl": ["10.0.0.0/8"]
    },
    "rabbitmq": {
      "address": "0.0.0.0",
      "port": "5672",
      "loopback_users": []
    },
    "openstack": {
      "auth": {
        "validate_certs": false
      },
      "dashboard": {
        "session_backend": "file"
      },
      "block-storage": {
        "syslog": {
          "use": false
        },
        "api": {
          "ratelimit": "False"
        },
        "debug": true,
        "image_api_chef_role": "os-image",
        "identity_service_chef_role": "os-identity",
        "rabbit_server_chef_role": "os-ops-messaging"
      },
      "compute": {
        "rabbit": {
          "host": "10.0.2.10"
        },
        "novnc_proxy": {
          "bind_interface": "eth1"
        },
        "libvirt": {
          "virt_type": "qemu",
          "bind_interface": "eth1"
        },
        "novnc_proxy": {
          "bind_interface": "eth1"
        },
        "xvpvnc_proxy": {
          "bind_interface": "eth1"
        },
        "image_api_chef_role": "os-image",
        "identity_service_chef_role": "os-identity",
        "nova_setup_chef_role": "os-compute-api",
        "rabbit_server_chef_role": "os-ops-messaging",
        "network": {
          "public_interface": "eth1",
          "service_type": "neutron"
        }
      },
      "network": {
        "debug": "True",
        "dhcp": {
          "enable_isolated_metadata": "True"
        },
        "metadata": {
          "nova_metadata_ip": "10.0.2.10"
        },
        "openvswitch": {
          "tunnel_id_ranges": "1:1000",
          "enable_tunneling": "True",
          "tenant_network_type": "gre",
          "local_ip_interface": "eth2"
        },
        "api": {
          "bind_interface": "eth1"
        },
        "l3": {
          "external_network_bridge_interface": "eth0"
        },
        "service_plugins": ["neutron.services.l3_router.l3_router_plugin.L3RouterPlugin"]
      },
      "db": {
        "bind_interface": "eth1",
        "compute": {
          "host": "10.0.2.10"
        },
        "identity": {
          "host": "10.0.2.10"
        },
        "image": {
          "host": "10.0.2.10"
        },
        "network": {
          "host": "10.0.2.10"
        },
        "volume": {
          "host": "10.0.2.10"
        },
        "dashboard": {
          "host": "10.0.2.10"
        },
        "telemetry": {
          "host": "10.0.2.10"
        },
        "orchestration": {
          "host": "10.0.2.10"
        }
      },
      "developer_mode": true,
      "endpoints": {
        "compute-api-bind": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "8774"
        },
        "compute-api": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "8774"
        },
        "compute-ec2-admin-bind": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "8773"
        },
        "compute-ec2-admin": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "8773"
        },
       "compute-ec2-api-bind": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "8773"
        },
        "compute-ec2-api": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "8773"
        },
        "compute-xvpvnc": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "6081"
        },
        "compute-novnc-bind": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "6080"
        },
        "compute-novnc": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "6080"
        },
        "compute-vnc": {
          "host": "0.0.0.0",
          "scheme": "http",
          "port": "6080"
        },
        "image-api": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "9292"
        },
        "image-api-bind": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "9292"
        },
        "image-registry": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "9191"
        },
        "image-registry-bind": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "9191"
        },
        "identity-api": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "5000"
        },
        "identity-bind": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "5000"
        },
        "identity-admin": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "35357"
        },
        "identity-internal": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "35357"
        },
        "volume-api-bind": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "8776"
        },
        "volume-api": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "8776"
        },
        "telemetry-api": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "8777"
        },
        "network-api-bind": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "9696"
        },
        "network-api": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "9696"
        },
        "orchestration-api": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "8004"
        },
        "orchestration-api-cfn": {
          "host": "10.0.2.10",
          "scheme": "http",
          "port": "8000"
        },
        "db": {
          "host": "0.0.0.0",
          "port": "3306"
        },
        "bind-host": "0.0.0.0"
      },
      "identity": {
        "admin_user": "admin",
        "bind_interface": "eth1",
        "debug": true
      },
      "image": {
        "api": {
          "bind_interface": "eth1"
        },
        "debug": true,
        "identity_service_chef_role": "os-identity",
        "rabbit_server_chef_role": "os-ops-messaging",
        "registry": {
          "bind_interface": "eth1"
        },
        "syslog": {
          "use": false
        }
      },
      "mq": {
        "bind_interface": "eth1",
        "host": "10.0.2.10",
        "user": "guest",
        "vhost": "/nova",
        "network": {
          "rabbit": {
             "host": "10.0.2.10",
             "port": "5672"
          }
        },
        "compute": {
           "service_type": "rabbitmq",
          "rabbit": {
            "host": "10.0.2.10",
            "port": "5672"
          }
        },
        "block-storage": {
          "service_type": "rabbitmq",
          "rabbit": {
            "host": "10.0.2.10",
            "port": "5672"
          }
        }
      }
    },
    "queue": {
      "host": "10.0.2.10",
      "user": "guest",
      "vhost": "/nova"
    }
  }
}

上記ファイルは KVM が使えない環境用に virt_type : qemu にしていますが、KVM が 利用できる環境をご利用であれば該当行を削除してください。デフォルト値の ‘kvm’ が入るはずです。

次にデプロイ前に databag 関連の事前操作を行います。Vagrant 用に作成されたファ イルを除くと…

machine 'controller' do
  add_machine_options vagrant_config: controller_config
  role 'allinone-compute'
  role 'os-image-upload'
  chef_environment env
  file('/etc/chef/openstack_data_bag_secret',
       "#{File.dirname(__FILE__)}/.chef/encrypted_data_bag_secret")
  converge true
end

となっていて /etc/chef/openstack_data_bag_secret というファイルを事前にコピー する必要がありそうです。下記のように操作します。

cp .chef/encrypted_data_bag_secret /etc/chef/openstack_data_bag_secret

デプロイを実行します。

この openstack-chef-repo には .chef ディレクトリが存在していてノード名が記され ています。’nodienode’ というノード名です。これを利用してそのままデプロイを実行 します。

chef-client -z
knife node -z run_list add nodienode 'role[allinone-compute]'
chef-client -z -E aio-neutron-kilo

上記の説明を行います。 1行目 chef-client -z で Chef-Zero サーバをメモリ上に起動し、2行目で自ノードへ run_list を追加しています。最後、3行目でデプロイ実行、となります。

数分待つと OpenStack Kilo が構成されているはずです。

まとめ

Chef-Zero を用いることで Chef サーバを利用せずに楽に構築が行えました。ですが、 OpenStack の複数台構成となるとそれぞれのノードのパラメータを連携させる必要が出 てくるので Chef サーバを用いたほうが良さそうです。今度、時間を見つけて Kilo の 複数台構成についても調べておきます。

また、master ブランチを使用していますので、まだ openstack-chef-repo 自体が流動 的な状態とも言えます。が launchpad で管理されている Bug リストを見ると、ステー タス Critical, High の Bug が見つからなかったので Kilo に関しては、大きな問題 無く安定してきている感があります。

https://bugs.launchpad.net/openstack-chef