【问题标题】:Perl: command-line override of config file settings?Perl:配置文件设置的命令行覆盖?
【发布时间】:2011-12-16 21:21:46
【问题描述】:

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

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

我目前处理此问题的方式似乎过于繁琐,我知道必须有一种更具创新性且不那么笨重的方式来做到这一点。


在代码一中:

  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 个并且会改变......这使得一些工作必须不断更新。有什么建议吗?

【问题讨论】:

  • 是的,这绝对是一种过于繁琐的方法。 1) 已经有一个模块可以为您执行此操作 2) 如果您手动执行此操作,您可以将更复杂的结构传递给 GetOptions。

标签: perl configuration yaml


【解决方案1】:

您可以让管理员使用单个灵活的开关覆盖 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;
                            },
            ...);

或其他。您可以规范化配置键和值,处理任意深度的键/子键/子键配置等。这可能会变得很棘手,因此您可能希望 key-lock 那个全局哈希。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      只是一个草图,但是

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

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

      3. 1234563 /li>

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

      【讨论】:

        猜你喜欢
        • 2011-01-26
        • 2015-05-08
        • 2020-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-24
        • 2019-05-28
        • 2011-12-17
        相关资源
        最近更新 更多