我正在构建一个利用配置文件(YAML)读取所有必要配置信息的脚本,然后打印出Linux管理员需要逐步构建服务器所需的所有必要步骤。
运行脚本的Linux管理员必需的选项是能够在命令行覆盖配置文件中的任何项/值对。
我目前处理此问题的方式似乎过于繁琐,我知道必须采用更具创新性和不那么笨重的方式来实现这一目标。
在代码I中:
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};
使用Getopt::Long并分配变量,覆盖在命令行传递的任何内容。
GetOptions (
"city=s" => \$city,
"continent=s" => \$continent,
"country=s" => \$country,
);
所以那些只是3个项目/值对,我的实际配置超过40并且将改变...这使得必须继续更新的一些工作。有什么建议吗?
答案 0 :(得分:3)
您可以让管理员使用与ssh(1)
对-o
类似的单一灵活切换覆盖YAML设置。如果配置设置很多且可能会更改,这尤其适用。
$ 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表示全局哈希值。
答案 1 :(得分:2)
看看与GetOpt和YAML结婚的一些Config模块,可能是Config::YAML或Config::YAML::Tiny
答案 2 :(得分:1)
只是草图,但
在您的GetOptions调用中,您是否可以在YAML结构中使用“深度引用”,从而摆脱“中间”变量?
通过查看生成的YAML结构,您是否可以自动生成GetOptions调用(基于您在YAML中实际看到的变量)。通过生成,我的意思是,将调用创建为字符串,然后使用“eval”实际执行它。
如果您想要“中间变量”以方便起见,您可以自己从YAML结构生成这些变量,也可以作为字符串,然后使用“eval”来实际创建变量。
< / LI> 醇>正如我所说,只是一幅草图。