С "оркестрейшеном" у puppet все плохо.
Был puppet-kick, но его выпилили, теперь есть mcollective, который позволит вам дернуть агента на всех нодах и применить конфигурацию. Но имхо это из пушки по воробьям. 
Мы по прежнему по старинке, через pssh дергаем на нужной группе нод 'puppet agent -t'.
Применить конфиг на отдельном сервере, из коробки я думаю врядли получится. Нужно придумать что то свое :).
Ну или конечно же, Вы всегда можете нагородить
if $::fqdn in $testing_nginx_servers {
    $config = new_config
  else {
    $config = stable_config
  }
  ::nginx::vhost { 'server.com' :
    template      => $config
    server_name   => "${::fqdn} ${title}",
    document_root => '/var/www/server.com',
    ssl_keys      => 'server.com'
  }
А где нить в site.pp объявить
$testing_nginx_servers = [ 'web-1.server.com', 'web-2.server.com' ]
В конце концов вы можете раскатывать конфиг, но не релоадить nginx :).
На тему ansible vs puppet. Субъективно, ansible, массовый раннер скриптов :). К тому же на состояние полугодовалой давности довольно тормозной.
Puppet подразумевает,  что накатка изменений, не влияет критично на Ваше окружение, и может происходить в фоне. Тоесть для ряда пакетов Вы написали 'ensure => latest', и не паритесь, обновляется оно сам по себе когда нада +\- 30 минут и всё. Внесли изменения в конфигу, проверили на одном серваке, и уверенны что через полчаса это будет везде. Сейчас скажу глупость, но о "схеме" его работы можно сказать что он "согласован в конечном счете", и этот "конечный счет" определяется получасовым таймаутом обновления (как в DNS :) )
Может быть уже неактуально, но вот 
здесь человек сравнивал ansible \ salt в качестве альтернатив для переезда.
Если привлекает YAML в puppet есть hiera, для экспорта ресурсов с нод, есть puppetdb (к примеру что бы при добавлении backend  серверов, их адреса попали в необходимый upstream у nginx, без прямого прописывания их в конфиге).
Если напрягает что нету всяких "циклов", то это решается во первых при помощи define, или в свежем синтаксисе есть each / slise / reduce / filter, который позволяет удобно работать с со всякими списками параметров, плюс очень много чего полезного реализовано в stdlib.
Puppet декларативен, и если вы не хотите мирится с отсутствием возможностей перезаписать переменную /  параметры ресурса / класса,  то Вам будет сложно с ним, иначе не вижу ничего плохого в этом выборе.