実行環境
- Mac OS X 10.9.5
インストール
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が動作していることを確認する。
管理コンソールへのアクセスも確認できた。