vagrant で postgresql+jdk の環境を準備する

## Vagrantfile

```
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "centos/stream8"
  config.vm.network "private_network", ip: "192.168.56.10"
  config.vm.synced_folder ".", "/vagrant", type:"virtualbox"
  config.vm.provider "virtualbox" do |vb|
    #   vb.gui = true
    vb.memory = "1024"
  end
  #if Vagrant.has_plugin?("vagrant-vbguest")
  #  config.vbguest.auto_update = false  
  #end  
  config.omnibus.chef_version = :latest
  config.vm.provision "chef_zero" do |chef|
    chef.install = false
    chef.cookbooks_path = ["chef-repo/cookbooks", "chef-repo/site-cookbooks"]
    chef.nodes_path = ["chef-repo/nodes"]
    chef.node_name = "server"
    chef.arguments = "--chef-license accept"
  end

end
```

ポートフォワーディングはフォワード先を考えるのが面倒くさいのでやらない。プライベートネットワークは hostonlyアダプターに設定されたネットワークアドレス内のアドレスを設定する

最近のchef がライセンス許諾必要らしいので `chef.arguments = "--chef-license accept"` を追加する。

## レシピ postgresql

chef-repo/Berksfile

```
cookbook 'postgresql', '~> 10.0.1', :supermarket
```

Berksfile に書いたレシピを取り込む

```
> cd chef-repo
>  berks vendor cookbooks
```

### インストール用レシピを作成する

```
> mkdir site-cookbooks
> cd site-cookbooks
> chef generate cookbook pgsql
```

### berkshelf の postgresql を参照する

chef-repo/site-cookbooks/pgsql/metadata.rm

```
name 'pgsql'
maintainer 'The Authors'
maintainer_email 'you@example.com'
license 'All Rights Reserved'
description 'Installs/Configures pgsql'
long_description 'Installs/Configures pgsql'
version '0.1.0'
chef_version '>= 14.0'

depends 'postgresql'
```

### レシピ編集

chef-repo/site-cookbooks/pgsql/recipes/default.rb

```
#
# Cookbook:: pgsql
# Recipe:: default
#
# Copyright:: 2022, The Authors, All Rights Reserved.

postgresql_client_install 'My PostgreSQL Client install' do
    version '10'
    action :install
end

postgresql_server_install 'My PostgreSQL Server install' do
    version '10'
    initdb_locale 'ja_JP.UTF-8'
    initdb_encoding 'UTF8'
    action [:install, :create]
end

postgresql_server_conf 'PostgreSQL Config' do
    additional_config({
        :listen_addresses => '*'
    }) 
    notifies :reload, 'service[postgresql]'
end
postgresql_access 'postgresql access' do
    access_type       'host'
    access_db         'all'
    access_user       'all'
    access_addr       '192.168.56.0/24'
    access_method     'password'
    notifies :reload, 'service[postgresql]'
end

postgresql_database 'postgresql database' do
    database          'testdb2'
    encoding          'UTF8'
    template          'template0'
    locale            'ja_JP.UTF-8'
end

postgresql_user 'postgresql user' do
    create_user       'testuser'
    password          'password'
end

service 'postgresql' do
    service_name 'postgresql-10'
    supports restart: true, status: true, reload: true, enable: true
    action [:enable, :reload]
end
```

## レシピ jdk

デフォルトのパッケージリポジトリに openjdk があるので使う

### インストール用レシピを作成する

```
> mkdir site-cookbooks
> cd site-cookbooks
> chef generate cookbook jdk
```

### レシピ編集

chef-repo/site-cookbooks/jdk/recipes/default.rb

```
package "java-1.8.0-openjdk" do
    action [ :install, :upgrade ]
end
package "java-1.8.0-openjdk-devel" do
    action [ :install, :upgrade ]
end
```

*-devel がないと javac できない

## レシピ その他一般

centos/stream8 とか、日本語ロケールがインストールされてないので追加する

### インストール用レシピを作成する

```
> mkdir site-cookbooks
> cd site-cookbooks
> chef generate cookbook init
```

### レシピ編集

chef-repo/site-cookbooks/init/recipes/default.rb

```
execute "install-locale-ja" do
    command "yum -y install glibc-langpack-ja"
end
execute "set-locale-ja" do
    command "localectl set-locale LANG=ja_JP.utf8"
end
```

## run list

chef-repo/nodes/server.json

```
{
  "name": "server",
  "normal": {
    "tags": [

    ]
  },
 "run_list": [
    "recipe[init]",
    "recipe[pgsql]",
    "recipe[jdk]"
  ]
}
```

## 起動

```
vagrant up --provider virtualbox
```

vagrant のバージョンと vitualbox のバージョンによっては vboxguestadditions がインストールに失敗する場合があるので、その場合 kernel をアップデートしてからリロードする

```
> vagrant ssh
... ここから VM内
$ sudo dnf install -y wget
$ sudo dnf install -y epel-release
$ sudo dnf -y update
$ exit
... ここからホスト側
> vagrant reload --provision
```

## その他

postgresql を使うだけ(のこりは Windowsにインストールしたものでまかなうとか) なら docker の方が簡単。springとかでも同じ。

今回は jdkでなにかビルドして動かすコンソールアプリを意図しているのでvagrantでやる。