Задачи, которые вы описываете, могут быть решены несколькими способами. Ни один из способов не является "лучшим", поскольку у каждого есть свои плюсы и минусы. 
Индустрия в целом развивается от сценариев к управлению конфигурациями и неизменным системам. 
Например, чтобы управлять web.config веб-сервера IIS, вы запускаете команды appcmd.exe. Мы используем Chef и IIS cookbook для абстрагирования идемпотентных ресурсов команды appcmd.exe. 
  iis_config "session sql_provider" do
    cfg_cmd "Foobar/#{site} -section:system.web/sessionState /+\"providers.[name='#{session_name}',connectionString='#{session_connection_string}',type='#{session_type}']\""
    action :set
      notifies :restart, 'iis_site[mysite]'
  end
Здесь все внутри '# {}' является переменной chef. Если ресурс запускается, он запускает перезапуск службы IIS. 
Преимущество не прямого использования appcmd.exe, а его абстрагирования от ресурса в том, что ресурс может легко принимать переменные в качестве параметров. Таким образом, вы можете написать свой код один раз, но использовать его в нескольких центрах обработки данных и средах. Конечная цель состоит в том, чтобы иметь возможность написать политику для каждого типа сервера и позволить управлению конфигурацией привести сервер в соответствие с политикой. 
Еще один пример управления файлом конфигурации журнала внутри chef. 
template "#{node['web']['path']}/log4net.config.xml" do
  source 'wwwroot/log4net.config.erb'
  variables(
    :log_level => node['web']['log4net']['log_level']
  )
  action :create
end
Затем XML-файл "шаблонизируется" как шаблон erb. Все, что между <% = -%> является переменной
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <log4net>
    <root>
      <level value="<%= @log_level -%>"/>
Затем вы можете запустить chef по расписанию, так что если переменная когда-либо изменится. Управление конфигурацией переводит файл в желаемое состояние. 
Ansible, Chef, Puppet и Salt работают по очень схожим принципам.