2015年12月30日水曜日

VagrantとChefによる自動構成


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










0 件のコメント:

コメントを投稿