【问题标题】:Puppet : how to resolve "file_line" multi match patternsPuppet:如何解析“file_line”多匹配模式
【发布时间】:2016-08-13 08:29:16
【问题描述】:

我正在尝试使用 puppet 更改配置文件。

这是我要更改的 test.txt 文件:

[default]
#puppet=no
abc=123

[nova]
#puppet=no

我想将“#puppet=no”更改为“puppet=yes”仅在 [default] 选项卡上。

这是我的两个版本的 test.pp:

file_line{"someline":
   path => '/root/openstack-puppet/computenode/nova/test.txt',
   match => '[default]\n#puppet',
   line => 'puppet=ok'
}

这个找不到匹配模式,所以它只是在文件末尾添加“puppet=ok”。

file_line{"someline":
   path => '/root/openstack-puppet/computenode/nova/test.txt',
   match => '#puppet',
   line => 'puppet=ok'
}

这个失败是因为多匹配模式问题。

我也尝试过 Augeas,但我找不到如何使用 Augeas 取消注释。

请有人帮我解决这个问题!

================================================ ============================

我运行这段代码:

file_line { 'someline':
  path     => '/root/openstack-puppet/computenode/nova/test.txt',
  after    => '\[default\]',
  multiple => 'false',
  match    => '#puppet',
  line     => 'puppet=ok',
}

但是当我使用“puppet apply”运行时,它仍然会出现同样的错误:

Error: More than one line in file '/root/openstack-puppet/computenode/nova/test.txt' matches pattern '#puppet'
Error: /Stage[main]/Main/File_line[someline]/ensure: change from absent to present failed: More than one line in file '/root/openstack-puppet/computenode/nova/test.txt' matches pattern '#puppet'

我认为在定义 'match' 属性时不能应用 'after' 属性。

当我删除“匹配”属性时,它可以工作,但它没有替换原始字符串('#puppet=no')。

它只是像这样在 [default] 之后添加了新行:

[default]
puppet=ok
#puppet=no
abc=123
dedd=0


[nova]
#puppet=no

所以问题仍然存在,我怎样才能擦除(或替换)字符串 '#puppet=no' 仅在 [默认] 选项卡上??

【问题讨论】:

    标签: puppet


    【解决方案1】:

    after 属性将为您解决这个问题。使用您的第二个资源并清理一些资源,我们有:

    file_line { 'someline':
      path     => '/root/openstack-puppet/computenode/nova/test.txt',
      match    => '#puppet',
      line     => 'puppet=ok'
      after    => '[default]',
      multiple => false,
    }
    

    请注意,我还添加了 multiple 属性以防止更改的内容不仅仅是您要更改的行。

    您的第一个资源出现问题的原因有三个。首先,file_line 要求您的 line 属性与 match 属性进行成功的正则表达式匹配,这在您的情况下不正确。其次,将[default] 放入match 属性意味着如果资源在您编写时成功,则[default] 将从您的文件中删除。第三,你需要在你的正则表达式中转义[],所以如果你想走那条路,它看起来像\[default\](你不这样做是因为前两个原因)。

    【讨论】:

    • 感谢您的帮助!!但是,我认为仍然存在一些问题...您的代码出现了一些错误...我在我的问题中添加了这些问题。请检查一下。
    • @BlakStar 根据您上面的编辑,我看到您对我的回答感到困惑,需要更多关于这些属性在file_line 中的作用的信息。请参考forge.puppet.com/puppetlabs/stdlib/types 的文档。快速解决方法是使用我上面提供的资源。没有理由在 after 属性中的文字字符串中转义 []。
    • 您的代码(我刚刚在 'line' 属性中添加了 ',' 因为它会产生语法错误)仍然会出现我在问题中添加的相同错误(多重匹配)。我检查了这个文档上的 file_line 属性:forge.puppet.com/puppetlabs/stdlib。文档说“之后”只是指示将添加“行”的位置,所以我认为它不会影响“匹配”属性。所以我猜你的代码也会因为这个原因产生多重匹配错误。
    • @BlakStar 希望您能弄清楚只使用我的答案,然后从我的答案和文档中了解它是如何工作的。祝你好运!
    • @BlakStar 在这里是正确的,after 仅用于插入行的位置,而不是match 的插入位置。所以我相信上面的答案是不正确的,因为它会匹配#puppet 之外或[default] 块之前的行。如果你有multiple=> false 的2 个块中的行,你还会收到一条错误消息,指出该行被多次匹配,即使是after。这是有道理的,因为after 也不会保护您免于在默认情况下破坏另一个块中的选项。正则表达式解析不理解 ini,你需要类似 augeas 而不是 file_line
    【解决方案2】:

    该文件看起来适合 ini 文件格式,因此更好的解决方案是使用 inifile 资源类型https://forge.puppet.com/modules/puppetlabs/inifile

    ini_setting { "sample setting":
      ensure  => present,
      path    => '/root/openstack-puppet/computenode/nova/test.txt',
      section => 'default',
      setting => 'puppet',
      value   => 'yes',
    }
    

    【讨论】:

      【解决方案3】:

      你好,你可以试试。

      include stdlib
      file_line{"someline":
         ensure => 'present',
         after => 'default',
         multiple => false,
         path => '/root/openstack-puppet/computenode/nova/test.txt',
         line => 'puppet=ok',
      }
      

      【讨论】:

      • 除了省略任何解释之外,这与现有的、被赞成的、五年前的答案有何不同?
      猜你喜欢
      • 2017-07-24
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多