chef-zero+knife-zeroでCentOS7上にGlassFish4環境構築を自動化

実行環境

インストー

Chef DKとchef-zero、knife-zeroをインストールする。

>curl -L https://www.opscode.com/chef/install.sh | sudo bash -s -- -P chefdk
>chef gem install knife-zero chef-zero json --no-ri --no-rdoc

chef-clientがローカルモードで動作するようにknife.rbに'local_mode true'を設定する。

~/.chef/knife.rb

local_mode               true

レシピを作成

chefのリポジトリとクックブックを作成する。

>chef generate repo chef-repo
>cd chef-repo
>knife cookbook create sample

今回はGlassFish4のセットアップ自動化を目標に次のようなレシピを作成した。 bashリソースを使用している箇所の冪等性担保などはいまいちなので今後改善していく予定。

chef-repo/cookbooks/sample/recipes/default.rb

package %w(java-1.8.0-openjdk unzip wget expect) do
  action :install
end

group 'glassfish' do
  group_name 'glassfish'
  action :create
end

glassfish_home = "/home/glassfish"

user 'glassfish' do
  manage_home true
  group 'glassfish'
  home "#{glassfish_home}" 
  shell '/bin/bash'
  action :create
end

remote_file "#{glassfish_home}/glassfish-4.1.zip" do
  source 'http://download.java.net/glassfish/4.1/release/glassfish-4.1.zip'
  owner 'glassfish'
  group 'glassfish'
  mode '0644'
end

bash 'unzip glassfish' do
  user 'glassfish'
  group 'glassfish'
  cwd "#{glassfish_home}"
  code <<-EOC
    unzip glassfish-4.1.zip
    rm -f glassfish-4.1.zip 
  EOC
  not_if { File.exists?("#{glassfish_home}/glassfish4/glassfish/lib/client/appserver-cli.jar")}
end

cookbook_file '/etc/systemd/system/glassfish.service' do
  source 'glassfish.service'
  owner 'root'
  group 'root'
  mode '0644'
  action :create_if_missing
end

service 'glassfish' do
  action [ :enable, :start ]
  supports :start => true, :stop => true, :reload => true
end

cookbook_file "#{glassfish_home}/glassfish_setting.exp" do
  source 'glassfish_setting.exp'
  owner 'root'
  group 'root'
  mode '0644'
  action :create_if_missing
end

bash 'setup glassfish' do
  user 'root'
  group 'root'
  cwd "#{glassfish_home}"
  code <<-EOC
    expect glassfish_setting.exp "admin" "" "password"
    systemctl stop glassfish
    systemctl start glassfish
    touch done
  EOC
  not_if { File.exists?("#{glassfish_home}/done")}
end

GlassFishのサービス設定は、以下の'glassfish.service'をcookbook_fileリソースでノードに配置する。

chef-repo/cookbooks/sample/files/glassfish.service

[Unit]
Description = GlassFish Server v4.1
After = syslog.target network.target

[Service]
User=glassfish
ExecStart = /usr/bin/java -jar /home/glassfish/glassfish4/glassfish/lib/client/appserver-cli.jar start-domain
ExecStop = /usr/bin/java -jar /home/glassfish/glassfish4/glassfish/lib/client/appserver-cli.jar stop-domain
ExecReload = /usr/bin/java -jar /home/glassfish/glassfish4/glassfish/lib/client/appserver-cli.jar restart-domain
Type = forking

[Install]
WantedBy = multi-user.target

Glassfishのadminパスワード設定とlocalhost以外からの管理コンソールアクセスを許可するために、expectスクリプトで'asadmin'との対話を自動化する。

chef-repo/cookbooks/sample/files/glassfish_setting.exp

#!/usr/bin/expect

set admin_user_name [lindex $argv 0]
set old_pw [lindex $argv 1]
set new_pw [lindex $argv 2]
set timeout 10

spawn env LANG=C /home/glassfish/glassfish4/glassfish/bin/asadmin change-admin-password
expect "Enter admin user name \[default: admin\]>"
send "${admin_user_name}\n"
expect "Enter the admin password>"
send "${old_pw}\n"
expect "Enter the new admin password>"
send "${new_pw}\n"
expect "Enter the new admin password again>"
send "${new_pw}\n"
expect "Command change-admin-password executed successfully."

spawn env LANG=C /home/glassfish/glassfish4/glassfish/bin/asadmin enable-secure-admin
expect "Enter admin user name>"
send "${admin_user_name}\n"
expect "Enter admin password for user \"admin\">"
send "${new_pw}\n"
expect "Command enable-secure-admin executed successfully."

exit 0

動作確認

動作確認用に次のVagrantfileでVMを用意する。

chef-repo/Vagrantfile

VAGRANTFILE_API_VERSION = '2'

Vagrant.require_version '>= 1.5.0'

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  if Vagrant.has_plugin?("vagrant-vbguest")
    config.vbguest.auto_update = true
  end
  
  if Vagrant.has_plugin?("vagrant-omnibus")
    config.omnibus.chef_version = 'latest'
  end

  config.vm.hostname = 'vm'
  config.vm.box = 'centos/7'
  config.vm.network "forwarded_port", guest: 8080, host: 8080
  config.vm.network "forwarded_port", guest: 4848, host: 4848
  config.vm.network "private_network", ip: "192.168.33.11"
  config.vm.synced_folder ".", "/vagrant", type: "virtualbox"  
end

vagrant up'でVMを立ち上げる。

>vagrant up

‘knife zero bootstrap'でセットアップ対象のノードにchef-clientをインストールし、'knife node'と'knife zero converge'でレシピを適用する。

>knife zero bootstrap 192.168.33.11 -i .vagrant/machines/default/virtualbox/private_key --ssh-user vagrant --sudo -use-sudo-password
>knife node run_list add vm sample
>knife zero converge "name:vm" -x vagrant -i ./.vagrant/machines/default/virtualbox/private_key --sudo -a knife_zero.host

ブラウザから、GlassFishが動作していることを確認する。 f:id:hiroki-sawano:20170614012908p:plain

管理コンソールへのアクセスも確認できた。 f:id:hiroki-sawano:20170614012916p:plain