仮想環境上にVagrant・Ansible・Packstackを使ってOpenStackを自動構築してみた

# はじめに
賽の河原のようにOpenStackを作っては壊し、作っては壊し、というのを繰り返すことが趣味でした。
手動でやるのにいい加減疲れたので、自動化してみました。
ここに記録を残します。

使ったものはGithubで公開しています。
https://github.com/bonboyaju19/openstack

# 使用したもの
この記事では下記のツールやパッケージを使用します。
- [Vagrant](https://www.vagrantup.com/)・・・仮想環境の構築・管理に一元的なワークフローを提供してくれます。VMを簡単に作っては壊しができるので使用します。
- [Hyper-V](https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/about/)・・・仮想環境を構築する実行基盤です。本記事ではHyper-Vを使用しますが、他にも[Virtualbox](https://www.virtualbox.org/)を使用することもできます。
- [Packstack](https://www.rdoproject.org/install/packstack/)・・・OpenStackの自動デプロイツールです。OpenStackのディストリビューションの評価目的として、簡単に構築するために作成されたものです。
- [Ansible](https://www.ansible.com/)・・・Redhatが開発しているOSSの構成管理ツールです。

# 実行環境
今回は下記の環境で実行しました。
- Windows10 1903 OSビルド18362.295 64bit Professional (Hyper-Vインストール)
- Vagrant 2.2.5

# 説明
自動構築の全体の流れの説明をします。

## Vagrantfile
Vagrantfileは仮想環境上に構築する仮想マシンの設計図です。
VagrantはこのVagrantfileの宣言通りに仮想マシンを構築します。
Providerは今回はHyper-Vにしていますが、Virtualboxを利用している場合は、`config.vm.provider "virtualbox" `に変更することで使用可能です。
`setup.sh`をプロビジョニング用のシェルスクリプトとして使用しています。仮想マシンを構築した初回起動時に自動で実行してくれます。
`ansible`フォルダを共有させ、その中にある`playbook.yml`を実行することで、自動構築を実行していきます。フォルダの共有はホストの管理者ユーザの認証情報を途中で要求されるので入力してあげてください。

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.network "public_network", bridge: "Default Switch"

  config.vm.provider "hyperv" do |vb|
    vb.memory = "32768" # VMに割り当てるメモリ量です。最低でも8GBは必要です。
    vb.cpus = "8" # VMに割り当てるCPUコア数です。できれば2コア以上割り当てます。
  end
  config.vm.synced_folder "./ansible", "/ansible"
  config.vm.provision :shell, path: "setup.sh", privileged: true
end
```
## setup.sh
Vagrantが仮想マシンを構築したときに自動実行してくれるスクリプトファイルです。
Ansibleをインストールして、playbookを実行するだけなので省略。


## playbook.yml
Ansibleで自動構築をする定義が書かれたファイルです。
Vagrantfileが仮想マシンそのものの定義が書かれたものに対して、Ansible playbookはOS上の構成やアプリの構成の定義が書かれたものになります。
Packstackを正常に実行するために、`firewalld`や`NetworkManager`を停止させ、`network`を起動させます。
その後、Packstackをインストールして実行します。

```yaml:playbook.yml
- hosts: all
  become: yes
  tasks:
    - name: stop firewalld
      systemd:
        name: firewalld.service
        state: stopped
        enabled: no
    - name: stop NetworkManager
      systemd:
        name: NetworkManager
        state: stopped
        enabled: no
    - name: start network
      systemd:
        name: network
        state: started
        enabled: yes

    - name: install packstack repository
      yum:
        name: centos-release-openstack-stein
        state: latest

    - name: install packstack
      yum:
        name: openstack-packstack
        state: latest

    - name: generate answer file
      shell: packstack --gen-answer-file=~/answer.cfg

    - name: install packstack
      shell: packstack --answer-file=~/answer.cfg

```

# 実行してみる
では自動構築してみましょう。
[必要なツール](#実行環境)をインストールすればすぐ開始できます。

```bash
git clone https://github.com/bonboyaju19/openstack.git
cd openstack
vagrant up
```

仮想マシンの構築～playbookの実行までは数分で行われますが、Packstackの実行に少々時間がかかります。
メモリ32GB, CPU8コア割り当てても、15分近くかかりました。

自動構築が完了したら、IPアドレスとadminユーザの初期パスワードを確認しましょう。
Vagrantfileがあるフォルダ上で`vagrant ssh`コマンドを実施すると、仮想マシンにSSH接続することができます。
`/root`フォルダにある`keystonerc_admin`ファイルの中に、OpenStackのadminユーザの初期パスワードが記載されています。
また、デモ用のユーザの情報も`keystonerc_demo`に記載されています。

```bash
C:\openstack> vagrant ssh
[vagrant@localhost ~]$ sudo su -
[root@localhost ~]# ll
total 76
-rw-------. 1 root root  5570 Jun  1 17:18 anaconda-ks.cfg
-rw-------. 1 root root 51804 Aug 19 13:58 answer.cfg
-rw-------. 1 root root   338 Aug 19 14:00 keystonerc_admin # adminユーザのパスワード
-rw-------. 1 root root   319 Aug 19 14:00 keystonerc_demo #demoユーザのパスワード
-rw-------. 1 root root  5300 Jun  1 17:18 original-ks.cfg
```

```bash:eth0
[root@localhost ~]# ip a                                                                                                1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:38:01:2f brd ff:ff:ff:ff:ff:ff
    inet 192.168.219.20/28 brd 192.168.219.31 scope global noprefixroute dynamic eth0
       valid_lft 85491sec preferred_lft 85491sec
    inet6 fe80::215:5dff:fe38:12f/64 scope link
       valid_lft forever preferred_lft forever
```

仮想マシンのeth0のIPアドレスをブラウザに入れることで、OpenStackのログイン画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266454/d1f0d229-62f1-3ac0-560b-c54b52d4d652.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266454/0cc4d6c0-ad8b-d636-e2d4-242ae78049ee.png)

# おわりに
特に真新しい技術を使ってはいません。
Ansibleを使ってみたかっただけです。
時間があれば、HTTPS対応なども取り組んでみたいです。
間違っていればご指摘お待ちしております～。