Управление общими файлами конфигурации с помощью Powershell DSC
Мы разрабатываем систему развертывания на базе Windows DSC для нашего собственного приложения.NET. В рамках текущей инструкции по установке есть шаг для редактирования файла.NET machine.config. (Да, я знаю, это плохо, что наше приложение требует этого, но сейчас я не могу это исправить).
Мне интересно, как другие люди управляют "общими" файлами конфигурации с помощью DSC? Я не вижу никакого способа сделать это красиво, но был бы рад показать, как.
Единственный способ, о котором я могу подумать, - это создать пару пользовательских модулей DSC для управления частями файлов INI и XML-файлов конфигурации.
Я предлагаю модули со следующей спецификацией:
xIniSetting [string] #ResourceName
{
IniFile = [string]
Group = [string]
Key = [string]
[ Value = [string] ] # Only applicable if Ensure = Present
[ Ensure = [string] { Absent | Present } ]
[ DependsOn = [string[]] ]
}
а также
xXmlConfigElement [string] #ResourceName
{
ConfigFile = [string]
ParentSelector = [string] # XPath Selector of element parent
ElementSelector = [string] # XPath Selector of element itself
[ ElementXml = [string] ] # Only applicable if Ensure = Present
[ Ensure = [string] { Absent | Present } ]
[ DependsOn = [string[]] ]
}
(Примечание: я не знаю ни одного способа получить произвольный селектор XPath и декомпозировать его, чтобы получить селектор для родительского элемента, когда цель может не существовать, поэтому мне пришлось указать как родительский, так и целевой элементы)
Чтобы добавить группу пользовательских настроек в machine.config, я бы объявил что-то вроде следующего:
xXmlConfigElement CompanySettingsDefinition
{
ConfigFile = "$env:windir\ \Microsoft.NET\Framework64\v4.0.30319\Config\machine.config"
ParentSelector = "//configuration/configSections"
ElementSelector = "//configuration/configSections/section[@name='CompanySettings']"
ElementXml = "<section name=\"CompanySettings\" type=\"System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />"
Ensure = Present
}
xXmlConfigElement CompanySettingsConfiguration
{
ConfigFile = "$env:windir\ \Microsoft.NET\Framework64\v4.0.30319\Config\machine.config"
ParentSelector = "//configuration"
ElementSelector = "//configuration/CompanySettings"
ElementXml = "<CompanySettings><add key=\"SettingsKey\" value=\"SettingsValue\" /></CompanySettings>"
Ensure = Present
}
Является ли создание этих модулей "лучшим" подходом для решения этой проблемы? Я что-то упустил из-за DSC, который является "правильным" способом сделать это?
Любой совет будет принята с благодарностью.
2 ответа
Это именно то, что я сделал в наших сценариях.
Если бы у вас была более сложная логика для того, что входит в конфигурацию, я бы создал ресурс, который инкапсулирует эту логику.
Когда дело касается файлов.config, не существует единого решения, подходящего для всех. Вы проверили xWebAdministration
модуль в ресурсном комплекте? Оно имеет xWebConfigKeyValue
это может быть использовано для обновления файлов конфигурации приложения. Если это не решит проблему, которую вы рассматриваете, вы можете написать собственный ресурс в тех же строках.