我正在构建一个脚本,该脚本利用配置文件 (YAML) 读取所有必要的配置信息,然后打印出 Linux 管理员构建服务器所需的所有必要步骤。
一个必需的选项是运行脚本的 Linux 管理员能够在命令行覆盖配置文件中的任何项目/值对。
我目前处理这个问题的方式似乎过于繁琐,我知道必须有一种更具创新性和不那么笨拙的方式来做到这一点。
在代码中我:
location:
continent: na
country: us
city: rh
my $yaml = YAML::Tiny->new;
$yaml = YAML::Tiny->read($config_yml);
my $continent = $yaml->[0]->{location}->{continent};
my $country = $yaml->[0]->{location}->{country};
my $city = $yaml->[0]->{location}->{city};
GetOptions (
"city=s" => \$city,
"continent=s" => \$continent,
"country=s" => \$country,
);
所以那些只是 3 个项目/值对,我的实际配置有超过 40 个并且会改变......这使得一些工作必须不断更新。有什么建议?
最佳答案
您可以让管理员使用类似于 ssh(1)
的单个灵活开关来覆盖 YAML 设置。与 -o
一起使用.如果配置设置很多并且可能会更改,这尤其合适。
$ myscript -o location:city=rh --option location:country=us
现在,在脚本中,为了方便起见,您可以将所有运行时配置捆绑在一个散列中(而不是让
$this_and_that_opt
标量随着时间的推移而激增)。选项解析看起来像这样:# First, set up %GlobalAppCfg from defaults and YAML
# now handle "-o location:country=us"
GetOptions('option|o=s' => sub {
my (undef, $optstring) = @_;
my ($userkey, $val) = split('=', $optstring, 2);
my ($major, $minor) = split(':', $userkey, 2);
$GlobalAppCfg->{$major}->{$minor} = $val;
},
...);
管他呢。您可以规范化配置键和值,处理任意深度的键/子键/子键配置等。这可能会变得很棘手,所以您可能喜欢 key-lock那个全局散列。
关于Perl:命令行覆盖配置文件设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8540300/