Используете ли вы Puppet в настройке клиент-сервер и хотите протестировать конфигурацию для определенного узла, фактически не изменяя ее? Вы можете сделать это, обманув Puppet Master, поверив, что виртуальная машина Vagrant (VM) является тем узлом, и примените его там. Процесс очень прост: вы по существу , только нужно , чтобы получить сертификат в узлах или закрытый ключ и поставлять их в кукольный (и , вероятно , убедитесь , что имя хоста кукольный может быть решена внутри виртуальной машины). Давайте посмотрим на это подробно.
Благодарим моего коллегу Микаэля за то, что он нашел сертификат и ключевую уловку.
Решение
Я предполагаю, что вы уже установили Vagrant и Virtual Box (VMWare должен / мог бы работать тоже), если нет, установите их и прочитайте Getting Started .
Создайте Vagrant VM для использования в тесте. В каком-то каталоге, который я теперь буду называть <vagrantdir> , запустите vagrant init, чтобы создать Vagrantfile .
Далее получаем /var/lib/puppet/ssl/certs/<hostname>.pem
и /var/lib/puppet/ssl/private_keys/<hostname>.pem
с целевого узла. Поместите их в <vagrantdir> / ssl / (certs | private_keys) / <hostname> .pem . Каталог будет виден внутри виртуальной машины как / vagrant / ssl .
Обновите Vagrantfile для использования нужного вам блока ОС или базового блока Ubuntu (например, config.vm.box_url = « http://files.vagrantup.com/precise32.box” ; ) и настройте следующих провайдеров (выполняйте по порядку). внешнего вида), заменив targetnode.example.com фактическим именем хоста целевого узла и puppet.example.com именем хоста Puppet Master:
## Vagrantfile snippet # 1) Get the signed certificate needed to connect to Puppet Master as the given node # Get it from /var/lib/puppet/ssl/certs/<hostname>.pem # Note: A fresh agent has only private and public key (gets cert when signed?) config.vm.provision :shell, :inline => "mkdir -p /etc/puppet/ssl; cp -r /vagrant/ssl /etc/puppet" config.vm.provision "puppet_server" do |puppet| # BEWARE: Into /etc/hosts, add <puppet master's IP> puppet so that file://[puppet]/.. can work puppet.puppet_server = "puppet.example.com" puppet.puppet_node = "targetnode.example.com" puppet.options = ["--no-daemonize", "--onetime", "--verbose", "--debug"] # add "--env", "myEnvName" to test a particular environment end ·· config.vm.hostname = "targetnode.example.com"
Когда вы запускаете vagrant up , виртуальная машина должна подойти, получить ключи, подключиться к Puppet Master и получить и применить конфигурацию из нее.
Предостережения
Виртуальная машина работает на вашем компьютере, поэтому она, вероятно, не будет иметь доступа к тем же сетевым ресурсам (службам и т. Д.), Что и реальный узел. Скорее всего, у него будут и другие устройства (важно, если вы работаете в EC2, монтируете диски EBS и т. Д.), Если вам не удастся настроить Virtual Box или ОС, чтобы они были более похожи на ожидаемые Puppet.
Например, в нашем случае нам нужно было добавить « ln -sf / bin / true / sbin / dhclient » к провайдеру оболочки, чтобы смоделировать dhclient, потому что в противном случае он был запущен нашей установкой и был заблокирован навсегда.
Если вам случится заменить / etc / sudoerrs , вам нужно будет повторно разрешить пользователю vagrant (который находится в группе администраторов ) запускать все без указания пароля. Один из способов сделать это — запустить следующую команду изнутри виртуальной машины (можно даже добавить третьего поставщика для запуска его после Puppet, но он не будет запущен в случае сбоя Puppet):
echo -e "vagrant\n" | sudo -S sed -i '$ a\vagrant ALL=(ALL) NOPASSWD:ALL' /etc/sudoers
Обратите внимание на версии
Протестировано с Puppet 2.7.x, Vagrant 1.2.7, Virtual Box 4.2.16 на OS X 10.7.