Статьи

Обслуживание файлов с помощью Puppet Standalone в Vagrant

Если вы используете Puppet в режиме клиент-сервер для настройки своей производственной среды, вы можете захотеть скопировать и вставить из конфигурации prod в конфигурацию автономного марионетки Vagrant для тестирования. Одной из ключевых функций, необходимых для этого, является возможность подачи файлов через «source => ‘puppet: /// path / to / file’». В режиме клиент-сервер файлы обслуживаются сервером, в автономном режиме вы можете настроить чтение кукол из локальной (вероятно, общей) папки. Посмотрим, как это сделать.

Кредиты: Этот пост в значительной степени основан на ответе Акумрия в StackOverflow: как получить файл в манифесте кукол из модуля.

Включение Puppet Standalone в Vagrant для разрешения кукол: ///…

Краткая информация:

  1. Сделайте каталог с файлами для обслуживания доступными для Vagrant VM
  2. Создайте fileserver.conf, чтобы сообщить Puppet о каталоге
  3. Расскажите марионетке о файле server.conf
  4. Используй это

1. Сделайте каталог с файлами для обслуживания доступными для Vagrant VM

Например, как общая папка:

1
2
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"># Snippet of <vagrant directory>/Vagrantfile</span> # Фрагмент <каталога vagrant> / Vagrantfile</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">config.vm.share_folder "PuppetFiles", "/etc/puppet/files", "./puppet-files-symlink"</span> config.vm.share_folder "PuppetFiles", "/ etc / puppet / files", "./puppet-files-symlink"</span>

(В моем случае это фактически символическая ссылка на фактическую папку в нашем репозитории puppet git. Помните, что символические ссылки внутри общих папок часто не работают, и поэтому лучше использовать символическую ссылку в качестве отдельного корневого каталога общих папок.)

Обратите внимание, что вам не нужно объявлять общую папку

2. Создайте fileserver.conf, чтобы сообщить Puppet о каталоге

Вы должны сообщить Puppet, что исходный код «puppet: /// files /» должен быть подан из / etc / puppet / files /:

1
2
3
4
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"># <vagrant directory>/fileserver.conf</span> # <каталог vagrant> /fileserver.conf</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">[files]</span> [файлы]</span>
  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">path /etc/puppet/files</span> путь / etc / puppet / files</span>
  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">allow *</span> позволять *</span>

3. Расскажите марионетке о файле server.conf

Puppet должен знать, что он должен прочитать файл fileserver.conf:

1
2
3
4
5
6
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"># Snippet of <vagrant directory>/Vagrantfile</span> # Фрагмент <каталога vagrant> / Vagrantfile</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">config.vm.provision :puppet,</span> config.vm.provision: puppet,</span>
  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">:options => ["--fileserverconfig=/vagrant/fileserver.conf"],</span> : options => ["--fileserverconfig = / vagrant / fileserver.conf"],</span>
  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">:facter => { "fqdn" => "vagrant.vagrantup.com" } do |puppet|</span> : facter => {"fqdn" => "vagrant.vagrantup.com"} do | puppet |</span>
     <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">...</span> ...</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">end</span> конец</span>

4. Используйте это

1
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">vagrant_dir$ echo "dummy content" > ./puppet-files-symlink/example-file.txt</span> vagrant_dir $ echo "фиктивный контент"> ./puppet-files-symlink/example-file.txt</span>
1
2
3
4
5
6
7
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"># Snippet of <vagrant directory>/manifests/<my manifest>.pp</span> # Фрагмент <каталога vagrant> / manifest / <мой манифест> .pp</span>
 <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">...</span> ...</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">file{'/tmp/example-file.txt':</span> Файл { '/ TMP / пример-file.txt':</span>
  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">ensure => file,</span> обеспечить => файл,</span>
  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">source => 'puppet:///files/example-file.txt',</span> source => 'puppet: ///files/example-file.txt',</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">...</span> ...</span>

Предостережения

URL с именем сервера (puppet: // puppet /) не работают

URL-адреса, такие как puppet: // puppet / files / path / to / file, не работают, вместо этого вы должны использовать puppet: /// files / path / to / file (пустой, то есть неявный, имя сервера => три слеша). Я полагаю, что причина в том, что если вы прямо указали имя сервера, Puppet попытается найти сервер и получить оттуда файлы (это может быть желательным, если вы запускаете Puppet Master локально или где-то еще; в этом случае просто добавьте имя сервера / etc / hosts в Vagrant VM или убедитесь, что используемый DNS-сервер может его разрешить). С другой стороны, если вы не указали имя сервера и полагались на неявное значение, Puppet в автономном режиме свяжется с файлом fileserver.conf и будет вести себя соответствующим образом. (Обратите внимание, что в режиме сервер-клиент неявное имя сервера равно хозяину puppet, т.е. puppet: /// там работает очень хорошо.)

Если вы используете puppet: // puppet / files /…, вы получите ошибку, подобную этой:

1
2
3
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">err: /Stage[main]/My_example_class/File[fetch_cdn_logs.py]: Could not evaluate:</span> err: /Stage[main]/My_example_class/File[fetch_cdn_logs.py]: не удалось оценить:</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">getaddrinfo: Name or service not known Could not retrieve file metadata for puppet://puppet/files/analytics/fetch_cdn_logs.py:</span> getaddrinfo: Имя или служба не известны. Не удалось получить метаданные файла для кукол: //puppet/files/analytics/fetch_cdn_logs.py:</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">getaddrinfo: Name or service not known at /tmp/vagrant-puppet/manifests/analytics_dev.pp:283</span> getaddrinfo: имя или служба, неизвестные по адресу /tmp/vagrant-puppet/manifests/analytics_dev.pp:283</span>

Среда

Кукольный: 2.7.14, Бродяга: 1.0.2

Ссылка: подача файлов с помощью Puppet Standalone в Vagrant От марионетки: // URI от нашего партнера JCG Якуба Холи в блоге Holy Java .