2012-08-07 80 views
7

我正在进入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 

任何想法?

回答

6

您可以使用grep将您的sed命令添加到一个exec选项中,使用except选项。像这样的(未经测试)的东西:

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资源(木偶实验室STDLIB模块我相信的一部分)来添加行注释掉并留下注释行不变。

+0

你是我的英雄,谢谢! 不能只添加该行,因为脚本中的位置很重要,但是您的建议非常好。谢谢 :) – Ludo 2012-08-09 09:54:03

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

0

虽然单Augeas不能做到这一点,从Augeasproviders的shellvar提供商将能够做到这一点,每当this PR合并。

1

shellvar已经可以取消线

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

我认为这比使用exec和调用SED干净多了。

相关问题