Раскомментируйте строку в кукольный

я попадаю в марионетку и люблю ее, но бьюсь головой о стену с одной маленькой вещью, которая, я уверен, должна быть легче, чем я ее делаю.

Я хочу раскомментировать эту строку в .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 ответов


вы можете просто добавить свою команду sed в exec с опцией unless, используя grep. Что-то вроде этого (непроверенных):

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, я считаю), чтобы добавить строку незафиксированной и оставить прокомментированную строку нетронутой.


по моему опыту, 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",
}

важно, если regex игр, замена происходит на место, т. е. это изменит линию, а не расположение линии. Если регулярное выражение не match однако строка будет добавлена в конец файла.

этот опыт с марионеткой 3.1.

ссылка:https://forge.puppetlabs.com/puppetlabs/stdlib


на shellvar уже можно раскомментировать строки

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

Я воспринимаю это намного чище, чем использование exec и вызов sed.


в то время как Augeas в одиночку не может этого сделать,shellvar провайдер от Augeasproviders сможет это сделать, когда это PR сливается.