使用 puppet 将文本添加到文件的第一行

问题描述 投票:0回答:2

有没有办法使用 Puppet 将一行(或者更好是几行)新文本添加到文件的第一行? (显然只让它做一次)

背景是,我正在管理文件中的某些行,但我想在文件顶部添加一次性注释,以便该文件的清晰部分被“管理”。

puppet
2个回答
1
投票

我认为您无法使用标准的木偶资源(例如 file_line 或 augeas)来做到这一点。你可以做的是使用 exec fx [edited]:

$file = /somefile,
$text = 'some text'
) {
  exec { "add ${text} to ${file}":
    command => "sed -i '1s/^/${text}\\n/' '${file}'",
    unless  => "grep '${text}' '${file}'",
    path     => ['/bin'],
  }    
}

请参阅如何在 Bash 中将文本添加到文件的开头?了解使用 bash 的其他示例。

[原始发布语法] 该示例根据 [anonymous] 的建议进行了更新,以支持文件名中的空格和双转义新行。下面保留原始语法以供参考,因为我还没有测试换行符的双重转义。

$file = /somefile,
$text = 'some text'
) {
  exec { "add ${text} to ${file}":
    command => "sed -i '1s/^/${text}\n/' ${file}",
    unless  => "grep '${text}' ${file}",
    path     => ['bin'],
  }    
}

0
投票

我使用了

concat
模块,效果非常好。基本上,您声明文件并使用
concat::fragment
创建包含新内容和原始内容的文件。我还使用自定义事实来获取文件的原始文本,以便能够连接两者:

concat { '/somefile':
  owner => 'root',
  group => 'root',
  mode  => '0644'
}

concat::fragment { '/somefile':
  target  => '/somefile',
  content => 'This is new text\n',
  order   => '01'
}

concat::fragment { '/somefile':
  target  => '/somefile',
  content => $facts['original_text'],
  order   => '02'
}

创建自定义事实:

Facter.add('original_text') do
  confine kernel: 'Linux'
  setcode do
    Facter::Core::Execution.execute('cat /somefile')
  end
end

这是简化的答案,不包括查找文件的原始用户并检查

/somefile
是否存在以及新文本是否已在文件中。

© www.soinside.com 2019 - 2024. All rights reserved.