Vagrant, по-видимому, неправильно объединяет Vagrantfiles, конфигурация Chef потеряна

Во-первых, вот ошибка, которую я получаю:

There are errors in the configuration of this machine. Please fix
the following errors and try again:

chef client provisioner:
* Chef server URL must be populated.
* Validation key path must be valid path to your chef server validation key.

URL-адрес сервера шеф-повара заполнен, и путь к ключу проверки действителен.

У меня есть 3 действующих файла Vagrantfile, и я использую документацию для постарайтесь получить правильный порядок.

Это отлично работает, когда я вставляю все в один файл Vagrantfile в каталоге проекта, но я хочу установить значения по умолчанию и не копировать все.

1) Vagrantfile в комплекте с коробкой:

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

Vagrant.configure("2") do |config|
  config.vm.provider :vsphere do |vsphere|
    vsphere.host = 'vsphereserver.example.com'
    vsphere.compute_resource_name = 'TestDev'
    vsphere.user = 'vagrantadmin'
    vsphere.password = 'password'
    vsphere.insecure = true
  end

  config.ssh.username = 'auto'
  config.ssh.private_key_path = '~/.vagrant.d/id_rsa'
end

2) Vagrantfile в моем домашнем каталоге (~/.vagrant.d):

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

Vagrant.configure("2") do |config|
  config.vm.box = 'vsphere'

  config.vm.provider :vsphere do |vsphere|
    vsphere.template_name = 'vagrantchefnode'
  end

  config.vm.provision "chef_client" do |chef|
    chef.add_role "base"
    chef.provisioning_path = "/etc/chef"
    chef.chef_server_url = "https://chefserver.example.com"
    chef.validation_key_path = "/home/user/.vagrant.d/chef/validation.pem"
    chef.client_key_path = "/etc/chef/client.pem"
    chef.validation_client_name = "chef-validator"
    chef.custom_config_path = "/home/user/.vagrant.d/Vagrantfile.chef"
    chef.delete_node = true
    chef.delete_client = true
  end
end

3) Vagrantfile из каталога проекта (~/.vagrant.d/boxes/chefnode1):

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

Vagrant.configure("2") do |config|

  config.vm.provider :vsphere do |vsphere|
#    vsphere.template_name = 'chefnode'
    vsphere.customization_spec_name = 'chefnode1'
    vsphere.name = 'chefnode1'
  end

  config.vm.provision "chef_client" do |chef|
    chef.node_name = "chefnode1"
    chef.add_role "test"
  end

end

Это каким-то образом перезаписывает всю конфигурацию chef_client? Если да, то как мне заставить его придерживаться и сливаться так, как это должно быть?

Обновление:

У меня есть кое-что, что работает с ответом Теджая и этим документом, но это требует перевода на другой синтаксис, и я не могу понять, как перевести такие методы, как add_role. Вот что у меня есть:

2)

  config.vm.provision "chef_client",
    id: "chef",
    provisioning_path: "/etc/chef",
    chef_server_url: "https://chefserver.example.com",
    validation_key_path: "/home/user/.vagrant.d/chef/validation.pem",
    client_key_path: "/etc/chef/client.pem",
    validation_client_name: "chef-validator",
    custom_config_path: "/home/user/.vagrant.d/Vagrantfile.chef",
    delete_node: true,
    delete_client: true

3)

  config.vm.provision "chef_client",
    id: "chef",
    node_name: "chefnode1"

Итак, это запускает машину, но я не могу указать run_list.


person Zook    schedule 01.10.2014    source источник
comment
Открыта проблема Github   -  person Zook    schedule 02.10.2014


Ответы (1)


Фактически вы создаете два поставщика, по одному в каждом файле, поэтому у поставщика в каталоге вашего проекта нет URL-адреса или ключа проверки. Документация Vagrant объясняет, что вам нужно использовать id для изменения существующего провайдера. Взгляните на раздел «ПЕРЕОПРЕДЕЛЕНИЕ ПАРАМЕТРОВ PROVISIONER» на этой странице:

https://docs.vagrantup.com/v2/provisioning/basic_usage.html

Итак, попробуйте это (не проверено):

Vagrantfile в моем домашнем каталоге (~/.vagrant.d):

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

Vagrant.configure("2") do |config|
  config.vm.box = 'vsphere'

  config.vm.provider :vsphere do |vsphere|
    vsphere.template_name = 'vagrantchefnode'
  end

  config.vm.provision("chef_client", id: 'someID') do |chef|
    chef.add_role "base"
    chef.provisioning_path = "/etc/chef"
    chef.chef_server_url = "https://chefserver.example.com"
    chef.validation_key_path = "/home/user/.vagrant.d/chef/validation.pem"
    chef.client_key_path = "/etc/chef/client.pem"
    chef.validation_client_name = "chef-validator"
    chef.custom_config_path = "/home/user/.vagrant.d/Vagrantfile.chef"
    chef.delete_node = true
    chef.delete_client = true
  end
end

Vagrantfile из каталога проекта (~/.vagrant.d/boxes/chefnode1):

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

Vagrant.configure("2") do |config|

  config.vm.provider :vsphere do |vsphere|
#    vsphere.template_name = 'chefnode'
    vsphere.customization_spec_name = 'chefnode1'
    vsphere.name = 'chefnode1'
  end

  config.vm.provision("chef_client", id: 'someID') do |chef|
    chef.node_name = "chefnode1"
    chef.add_role "test"
  end
end
person Tejay Cardon    schedule 01.10.2014
comment
Спасибо за ссылку на документацию. Однако, когда я пытаюсь это сделать, я получаю: в дополнение к другим ошибкам: * The following settings shouldn't exist: id повторяется 4 раза. - person Zook; 02.10.2014
comment
Подожди, похоже на бродячую ошибку, посмотрим, что можно придумать с. - person Zook; 02.10.2014
comment
Нет, это было исправлено в 1.5.3, у меня 1.6.3 - person Zook; 02.10.2014
comment
Хорошо, это работает, когда я перевожу его в синтаксис, указанный в документе, на который вы ссылаетесь, однако я не могу понять, как переводить такие методы, как add_role, и я плохо разбираюсь в Ruby... - person Zook; 02.10.2014
comment
@Zook Я пытаюсь докопаться до источника. Я уверен, что есть способ сделать это без переключения синтаксиса. Я дам вам знать, что я найду. - person Tejay Cardon; 02.10.2014
comment
Потрясающе, спасибо. Я также открыл проблему на github. - person Zook; 02.10.2014
comment
@Zook, кажется, у меня получилось. Похоже, идентификатор должен быть в хэше конфигурации, переданном методу предоставления. Взгляните на мой отредактированный ответ выше. - person Tejay Cardon; 02.10.2014
comment
syntax error, unexpected ',', expecting ')' -- через запятую после chef_client - person Zook; 02.10.2014
comment
Ну, это помогло мне решить эту проблему, теперь у меня есть еще один :/ - person Zook; 03.10.2014
comment
Есть забавный маленький Heisenbug, если вы хотите посмотреть. - person Zook; 03.10.2014