Vagrantを使ってインスタンスを作成できるようになったら、次はインスタンスの自動設定にチャレンジしてみましょう。
自動設定にはChefを使います。
Chefのダウンロード、導入、セットアップは次の2つのブログを参照してください。
Chefサーバを構築する
Chef Workstationを構築する
ChefサーバとChef Workstationの導入が終わったら、Chef Workstationが導入されたマシンにログインし、以下の作業を続行します。
Chefを自動導入するためのプラグインをインストールする
Vagrantからインスタンスを起動してもインスタンスにはChefが導入されていないので、Chefを作動させることができません。ここで紹介するvagrant-omnibusプラグインを導入すると、Chefを自動導入することができます。https://github.com/chef/vagrant-omnibus
次のコマンドで導入します。
$ vagrant plugin install vagrant-omnibus
Vagrantfileに次の行を追加します。
config.omnibus.chef_version = :latest
config.vm.provision :chef_client do |chef|
chef.node_name = 'matsuos-01'
chef.validation_client_name = 'matsuos-org-validator'
chef.validation_key_path = '~/chef-repo/.chef/matsuos-org-key'
chef.chef_server_url =
'https://matsuos-chef-server/organizations/matsuos-org/'
chef.run_list = []
end
vagrant upを実行すると次のようなエラーが出てしまいます。
/home/anton/.vagrant.d/gems/gems/vagrant-openstack-provider-0.7.0/lib/vagrant-openstack-provider/action/provision.rb:34:in `run_provisioner': Catched Error: Catched Error: uninitialized constant VagrantPlugins::Shell::Provisioner (NameError)
Googleで検索すると次のIssueがヒットしました。
https://github.com/ggiamarchi/vagrant-openstack-provider/issues/240
この記事からリンクしている次の記事に回避策が出ています。
https://github.com/Sharpie/vagrant-openstack-provider/commit/8e2dc291e18af0f13b80ef0735c9568d6237ee37
この記事によると、vagrant-openstack-providerに含まれる2つのファイルを修正することで解決できるとあります。
$ sudo find / -name provisionで検索すると次の2つのファイルであることがわかります。
/home/ubuntu/.vagrant.d/gems/gems/vagrant-openstack-provider-0.7.0/lib/vagrant-openstack-provider/action/provision.rb
/home/ubuntu/.vagrant.d/gems/gems/vagrant-openstack-provider-0.7.0/spec/vagrant-openstack-provider/action/provision_spec.rb
それぞれバックアップを取ってから、記事の内容に従って修正します。
修正後、vagrant destroyでいったんインスタンスを削除し、vagrant upで再び起動します。
今までなかったログが吐き出されていることがわかります。
==> default: Running provisioner: chef_client...
default: Installing Chef (latest)...
Chefのインストールが始まりました。
==> default: Creating folder to hold client key...
==> default: Uploading chef client validation key...
Generating chef JSON and uploading...
==> default: Warning: Chef run list is empty. This may not be what you want.
runlistが空なので当然です。
==> default: Running chef-client...
==> default: sudo: unable to resolve host default
/etc/hostsを修正しないといけなさそうです。user_dataで修正してみましょう。
下の赤字部分が修正箇所です。
hostname:でホスト名を指定しています。
write_files:で/etc/hostsの書き換えを指定しています。
この辺に使い方が掲載されています。https://coreos.com/os/docs/latest/cloud-config.html
自分自身のホスト名を127.0.0.1に追記しているのと、Chefサーバの名前解決もできるようにしています。
os.user_data = '
#cloud-config
password: zaq12wsx
chpasswd: { expire: False }
ssh_pwauth: True
hostname: matsuos-01
write_files:
- path: /etc/hosts
permissions: 0644
owner: "root"
content: |
127.0.0.1 matsuos-01 localhost
10.230.41.160 matsuos-chef-server
'
注意
Vagrantfileの下記の部分は、Chefクライアントインストール時に設定したknife.rb の内容と一致すること。(参照) Chef Workstationを構築する
(Vagrantfile抜粋)
chef.validation_client_name = 'matsuos-org-validator'
chef.validation_key_path = '~/chef-repo/.chef/matsuos-org-key'
chef.chef_server_url = 'https://matsuos-chef-server/organizations/matsuos-org/'
(knife.rbの内容)
ubuntu@matsuos-chef-workstation:~/chef-repo/.chef$ cat knife.rb
current_dir = File.dirname(__FILE__)
log_level :info
log_location STDOUT
node_name 'matsuos'
client_key '/home/ubuntu/chef-repo/.chef/chef-server-key'
validation_client_name 'matsuos-org-validator'
validation_key '/home/ubuntu/chef-repo/.chef/matsuos-org-key'
chef_server_url 'https://matsuos-chef-server/organizations/matsuos-org/'
cache_type 'BasicFile'
cache_options( :path => "/home/ubuntu/chef-repo/.chef/checksums" )
cookbook_path ['/home/ubuntu/chef-repo/cookbooks']
学習用のApache導入クックブックを入手します。
$ cd ~/chef-repo
$ knife cookbook site download learn_chef_apache2
$ tar -zxvf learn_chef_apache2-0.2.1.tar.gz -C cookbooks
Chefサーバにアップロードします。
$ knife cookbook upload learn_chef_apache2