繁体   English   中英

Perl:命令行覆盖配置文件设置?

[英]Perl: command-line override of config file settings?

我正在构建一个利用配置文件(YAML)读取所有必要配置信息的脚本,然后打印出Linux管理员需要逐步构建服务器所需的所有必要步骤。

对于运行脚本的Linux Admin,必需的选项是能够在命令行覆盖配置文件中的任何项/值对。

我目前正在处理这种方式似乎过于繁琐,我知道必须采用更具创新性和更少笨重的方式来实现这一目标。


在代码I中:

  1. 使用YAML :: Tiny解析YAML配置文件

     location: continent: na country: us city: rh 
  2. 使用与配置文件项相同的名称创建变量,从配置文件中分配值。

     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}; 
  3. 使用Getopt :: Long并分配变量,覆盖在命令行传递的任何内容。

     GetOptions ( "city=s" => \\$city, "continent=s" => \\$continent, "country=s" => \\$country, ); 

所以那些只是3个项目/值对,我的实际配置超过40并且将改变...这使得必须继续更新的一些工作。 有什么建议?

你可以让管理员用一个灵活的开关覆盖YAML设置,类似于ssh(1)-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;
                            },
            ...);

管他呢。 您可以规范化配置键和值,处理任意深度键/子键/子键配置等。这可能会变得很滑,因此您可能希望键锁定该全局哈希。

看一下与GetOpt和YAML结合的一些Config模块,可能是Config :: YAMLConfig :: YAML :: Tiny

只是草图,但是

  1. 在你的GetOptions调用中,你可以在YAML结构中使用“深度引用”,从而摆脱“中间”变量吗?

  2. 通过查看生成的YAML结构,您是否可以自动生成GetOptions调用(基于您在YAML中实际看到的变量)。 通过generate,我的意思是,将调用创建为字符串,然后使用“eval”来实际执行它。

  3. 如果你想要“中间变量”以方便起见,你可以自己从YAML结构中生成它们,也可以作为字符串,然后使用“eval”来实际创建变量。

正如我所说,只是一个草图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM