Статьи

Проверка конфигурации Puppet существующего узла с помощью Puppet Master через Vagrant

Используете ли вы 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.