CloudStackの構築に色々とハマった

## 1.経緯
今まで自宅サーバではwebvirtmgrを用いて、ゲストOSを管理していた。でもそれだと、ゲストOSの構築は出来ても、スイッチやらバランサーやらの自動構築が出来ない。そのため、apache CloudStackを構築することにした。それに伴いCentOSも再インストールを行った。

## 2.環境について

### 2.1.自宅サーバの環境は以下の通り

```
ブランド:自作PC
CPU:AMD Ryzen 7 1700 (8コア、16スレッド(
メモリ:64GB
ディスク:M2.SSD 256GB(root用)
       SATA SSD 512GB×2(NFS用でLVM組んでます)
NIC:マザーボード内蔵×1(enp35s0)
　　 拡張NIC×1(enp37s0)
```

ネットワーク環境

```
ネットワーク 192.168.0.0/24
ゲートウェイ:192.168.0.1
DNS:192.168.0.1
enp35s0:192.168.0.16
enp37s0:192.168.0.15
```

### 2.2.ブリッジの設定
nmcliで行った。

```
libvirt用
# nmcli con add type bridge ifname br0
# nmcli con modify bridge-br0 bridge.stp no
# nmcli con modify bridge-br0 ipv4.method manual ipv4.address "192.168.0.15/24" ipv4.gateway "192.168.0.1"  ipv4.dns 192.168.0.1
# nmcli con add type bridge-slave ifname enp35s0 master bridge-br0
# nmcli con del enp35s0 ; systemctl restart NetworkManager

CloudStack用
# nmcli con add type bridge ifname cloudbr0
# nmcli con modify bridge-cloudbr0 bridge.stp no
# nmcli con modify bridge-cloudbr0 ipv4.method manual ipv4.address "192.168.0.17/24" ipv4.gateway "192.168.0.1"  ipv4.dns 192.168.0.1
# nmcli con add type bridge-slave ifname br0 master bridge-cloudbr0
# systemctl restart NetworkManager
```

### 2.3.ここでハマった！
当初、オンボードNICであるenp35s0に192.168.0.15を割り当て、拡張NICであるenp37s0に192.168.0.16を割り当て、拡張NIC側にブリッジの設定を行った。
すると/var/log/agent/agent.logに以下のメッセージが表示された。

```
2019-04-28 14:59:24,728 ERROR [kvm.resource.LibvirtConnection] (Agent-Handler-1:null) (logid:) Connection with libvirtd is broken: virConnectGetVersion で無効な接続ポイ
ンターです
```
どうやらマザーボード内蔵NICの方とlibvirtのvirbr0-nicが紐ついているようなので、マザーボード内蔵NICのenp35s0にブリッジの設定を行った。

### 2.4.参考にしたサイト
[CentOS7.2でブリッジインタフェースを作る](https://hosii.net/?p=446 CentOS7.2でブリッジインタフェースを作る)

## 3.CloudStackのインストールのための準備

### 3.1.MariaDBとかlibvirtの設定
[CentOS7にCloudStack4.9を入れた](http://monslab.iobb.net/BLOG/?p=3165 CentOS7にCloudStack4.9を入れた)
を参考にインストールを行った。

## 4.CloudStackのインストール

### 4.1.基本的なインストールの流れ
[CentOS7にCloudStack4.9を入れた](http://monslab.iobb.net/BLOG/?p=3165 CentOS7にCloudStack4.9を入れた)
を参考にインストールを行った。
(手抜きでごめんなさいｗ)

なお、この記事を書いている2019/04/28時点で、CloudStackは4.12が最新だったので、以下のように設定を変更した。

#### 4.1.1./etc/yum.repos.d/cloudstack.repoの作成

```/etc/yum.repos.d/cloudstack.repo
[cloudstack]
name=cloudstack
baseurl=http://cloudstack.apt-get.eu/centos/7/4.12/
enabled=1
gpgcheck=0
```

#### 4.1.2.ハマったところ①
ホストの作成に失敗した。そのため、/var/log/cloud/management/management-server.logを見たところ、以下のエラーが出力されていた。

```
2019-04-25 23:12:23,734 DEBUG [c.c.u.s.SSHCmdHelper] (catalina-exec-10:ctx-58a0e0ee ctx-0917e978) (logid:1fad8646) Executing cmd: cloudstack-setup-agent  -m 192.168.0.15
 -z 1 -p 1 -c 1 -g 21f1e5ab-ea6a-39b3-87f8-bae66d685595 -a --pubNic=cloudbr0 --prvNic=cloudbr0 --guestNic=cloudbr0 --hypervisor=kvm
2019-04-25 23:12:24,882 DEBUG [c.c.u.s.SSHCmdHelper] (catalina-exec-10:ctx-58a0e0ee ctx-0917e978) (logid:1fad8646) cloudstack-setup-agent  -m 192.168.0.15 -z 1 -p 1 -c 1
 -g 21f1e5ab-ea6a-39b3-87f8-bae66d685595 -a --pubNic=cloudbr0 --prvNic=cloudbr0 --guestNic=cloudbr0 --hypervisor=kvm output:Starting to configure your system:
Checking KVM...[Failed]
Please enable KVM on this machine

Try to restore your system:
```
えええ？kvmインストールしてありますよ...
よく見たら、sshでコマンドを流している。cloudstack-setup-agent ←　これね

cloudstack-setup-agentが何者なのか調べる。

```
[root@sun ~]# which /bin/cloudstack-setup-agent
/bin/cloudstack-setup-agent
[root@sun ~]# file /bin/cloudstack-setup-agent
/bin/cloudstack-setup-agent: Python script, ASCII text executable
[root@sun ~]#
```
なんだ。pythonスクリプトか。
エラーで落ちている箇所を調べる。

```
152     print "Starting to configure your system:"
153     syscfg = sysConfigFactory.getSysConfigFactory(glbEnv)
154     try:
155         syscfg.config()
156         print "CloudStack Agent setup is done!"
157     except (CloudRuntimeException,CloudInternalException), e:
158         print "Try to restore your system:"
159         try:
160             syscfg.restore()
161         except:
162             pass
```
どうやら155行目で落ちているようだ。
(ちなみに、viのコマンドモードで「:set number」ってやると行番号が表示されます)

このsysクラスを見てみる。

```/usr/lib64/python2.7/site-packages/cloudutils/syscfg.py
133         kvmEnabled = self.svo.isKVMEnabled()
134         if not kvmEnabled:
135             raise CloudInternalException("Checking KVM...[Failed]\nPlease enable KVM on this machine\n")
136
```
ふむ。133行目でfalseが戻ってきて、エラーになっている。
呼び出している箇所はここだった。

```
185 #it covers RHEL7
186 class sysConfigRedhat7(sysConfigAgentRedhat7Base):
187     def __init__(self, glbEnv):
188         super(sysConfigRedhat7, self).__init__(glbEnv)
189         self.services = [securityPolicyConfigRedhat(self),
190                          networkConfigRedhat(self),
191                          libvirtConfigRedhat(self),
192                          firewallConfigAgent(self),
193                          nfsConfig(self),
194                          cloudAgentConfig(self)]
```
pythonは触った事がないので、ここで行き詰まったwww
なので、

```
# cd /usr/lib64/python2.7/site-packages/cloudutils
# grep kvm *
globalEnv.py:        self.hypervisor = "kvm"
バイナリファイル globalEnv.pyc に一致しました
serviceConfig.py:                cfo.addEntry("resource", "com.cloud.hypervisor.kvm.resource.LibvirtComputingResource")
バイナリファイル serviceConfig.pyc に一致しました
serviceConfigServer.py:                db.execute(statement%('https://rightscale-cloudstack.s3.amazonaws.com/kvm/RightImage_CentOS_5.4_x64_v5.6.28.qcow2.bz2', '90fcd2fa4d3177e31ff296cecb9933b7', '4'))
バイナリファイル serviceConfigServer.pyc に一致しました
syscfg.py:        kvmEnabled = self.svo.isKVMEnabled()
syscfg.py:        if not kvmEnabled:
バイナリファイル syscfg.pyc に一致しました
utilities.py:        if os.path.exists("/dev/kvm"):
utilities.py:        return bash("kvm-ok").isSuccess()
utilities.py:        if os.path.exists("/dev/kvm"):
バイナリファイル utilities.pyc に一致しました
```
としたら、何やら怪しげなものが...
「utilities.py:        if os.path.exists("/dev/kvm"):」
↑
これです。これ。
/dev/kvmが存在するか調べたら、存在しなかった。何故！？

で、ぐぐったら「virt-host-validate」というコマンドがある事がわかったので、叩いて見た。

```
QEMU: 確認中 for hardware virtualization                                 : 成功
  QEMU: 確認中 if device /dev/kvm exists                                   : 失敗 ('kvm-intel' または 'kvm-amd' モジュールが読み込まれ、かつ BIOS で仮想化を有効にしていることを確認してください)
  QEMU: 確認中 if device /dev/vhost-net exists                             : 成功
  QEMU: 確認中 if device /dev/net/tun exists                         
      : 成功
  QEMU: 確認中 for cgroup 'memory' controller support                      : 成功
  QEMU: 確認中 for cgroup 'memory' controller mount-point                  : 成功
  QEMU: 確認中 for cgroup 'cpu' controller support                         : 成功
  QEMU: 確認中 for cgroup 'cpu' controller mount-point                     : 成功
  QEMU: 確認中 for cgroup 'cpuacct' controller support                     : 成功
  QEMU: 確認中 for cgroup 'cpuacct' controller mount-point                 : 成功
  QEMU: 確認中 for cgroup 'cpuset' controller support                      : 成功
  QEMU: 確認中 for cgroup 'cpuset' controller mount-point                  : 成功
  QEMU: 確認中 for cgroup 'devices' controller support                     : 成功
  QEMU: 確認中 for cgroup 'devices' controller mount-point                 : 成功
  QEMU: 確認中 for cgroup 'blkio' controller support                       : 成功
  QEMU: 確認中 for cgroup 'blkio' controller mount-point                   : 成功
  QEMU: 確認中 for device assignment IOMMU support                         : 成功
  QEMU: 確認中 if IOMMU is enabled by kernel                               : 成功
   LXC: 確認中 Linux >= 2.6.26 向けです                                : 成功
   LXC: 確認中 for namespace ipc                                           : 成功
   LXC: 確認中 for namespace mnt                                           : 成功
   LXC: 確認中 for namespace pid                                           : 成功
   LXC: 確認中 for namespace uts                                           : 成功
   LXC: 確認中 for namespace net                                           : 成功
   LXC: 確認中 for namespace user                                          : 成功
   LXC: 確認中 for cgroup 'memory' controller support                      : 成功
   LXC: 確認中 for cgroup 'memory' controller mount-point                  : 成功
   LXC: 確認中 for cgroup 'cpu' controller support                         : 成功
   LXC: 確認中 for cgroup 'cpu' controller mount-point                     : 成功
   LXC: 確認中 for cgroup 'cpuacct' controller support                     : 成功
   LXC: 確認中 for cgroup 'cpuacct' controller mount-point                 : 成功
   LXC: 確認中 for cgroup 'cpuset' controller support                      : 成功
   LXC: 確認中 for cgroup 'cpuset' controller mount-point                  : 成功
   LXC: 確認中 for cgroup 'devices' controller support                     : 成功
   LXC: 確認中 for cgroup 'devices' controller mount-point                 : 成功
   LXC: 確認中 for cgroup 'blkio' controller support                       : 成功
   LXC: 確認中 for cgroup 'blkio' controller mount-point                   : 成功
   LXC: 確認中 if device /sys/fs/fuse/connections exists                   : 成功
```
しっかりと2行目にエラーが出ていますねｗ
そういえば最近、マザーボードを買い直したのでBIOSを見てみたら、仮想化が有効になっていませんでしたwww

BIOSの画面で仮想化を有効にしたら、/dev/kvmが存在し、上記のエラーが出なくなりましたｗ

約2週間くらいかかってやっと構築できました。