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

时间:2011-12-16 21:21:47

标签: perl configuration yaml

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

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

我目前处理此问题的方式似乎过于繁琐,我知道必须采用更具创新性和不那么笨重的方式来实现这一目标。


在代码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,
    );
    
  4. 所以那些只是3个项目/值对,我的实际配置超过40并且将改变...这使得必须继续更新的一些工作。有什么建议吗?

3 个答案:

答案 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::YAMLConfig::YAML::Tiny

答案 2 :(得分:1)

只是草图,但

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

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

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

    < / LI>

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