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

标签 perl configuration yaml

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

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

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

在代码中我:

  • 使用 YAML::Tiny 解析 YAML 配置文件
    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 个并且会改变......这使得一些工作必须不断更新。有什么建议?

    最佳答案

    您可以让管理员使用类似于 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/

    相关文章:

    javascript - 在脚本中使用 HTML 表标签

    amazon-web-services - AWS 云形成 : Combining ImportValue and Sub functions causes error

    perl - 使用 Moose::Meta::Class 或 Class::MOP::Class 生成正确的动态类

    c++ - 快速路径数据包处理的配置更新

    perl - 如何在反引号内正确使用perl变量名?

    php - 在 Mac OS X 上为 PHP --enable-zip 安装 zip 扩展

    symfony - Twig 从 Yaml 文件写入

    yaml - 如何在 GItLab CI/CD YAML 值中使用以下空格转义冒号?

    regex - Perl 正则表达式语法错误

    apache - 在 Windows 7 上找不到 Apache 的 "cgi-bin"目录