取消注释Puppet中的一行

时间:2012-08-07 10:00:34

标签: puppet

我正在进入Puppet并且喜欢它,但是我用一个小东西碰到了我的头,我肯定必须比我做的更容易。

我希望在用户的.bashrc中取消注释这一行:

#force_color_prompt=yes

我一直在使用augeas做很多事情,但似乎这对此无效。

我注意到有一个file_line资源可用于确保文件中存在一行,但我需要该行保留在同一位置。

我不希望用我自己的副本完全替换.bashrc,尽管看到这种模式在Puppet中很受欢迎,但它对我来说没有意义,因为我不想维护我的升级之间的版本。

在sed中我用这个:

sed -i "s/#force_color_prompt=yes/force_color_prompt=yes/g" ~/.bashrc

有什么想法吗?

4 个答案:

答案 0 :(得分:6)

你可以使用grep将一个除外选项添加你的sed命令给一个exec。像这样(未经测试):

exec { 'force_color_prompt':
  command   => 'sed -i "s/#force_color_prompt=yes/force_color_prompt=yes/g" .bashrc'
  cwd       => '/home/user',
  shell     => true,
  unless    => 'grep -Fxq "force_color_prompt=yes" .bashrc',
}

或者使用您提到的file_line资源(我相信Puppet Labs stdlib模块的一部分)添加未注释的行并保持注释行不受影响。

答案 1 :(得分:6)

根据我的经验,file_line将替换与正则表达式匹配的行。

为了得到force_color_prompt=yes#force_color_prompt=yes,您可以:

file_line {
    'color_prompt':
        path        => '/home/<youruser>/.bashrc',
        match       => 'force_color_prompt',
        line        => "force_color_prompt=yes",
}

重要的是,如果正则表达式匹配,则替换在位置发生,即。它会改变线条,而不是线条的位置。如果正则表达式匹配,则该行将附加到文件的末尾。

这种体验与Puppet 3.1有关。

参考:https://forge.puppetlabs.com/puppetlabs/stdlib

答案 2 :(得分:1)

shellvar已经可以取消注释行

shellvar { '.bashrc':
  ensure    => present,
  target    => "/home/${your_user}/.bashrc",
  variable => 'force_color_prompt'
  uncomment => true,
}

我认为这比使用exec和调用sed更清晰。

答案 3 :(得分:0)

虽然仅Augeas无法做到,但只要合并this PR,Augeasproviders的shellvar提供商就能够做到这一点。