簡體   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