使用 Puppet 管理多个文件权限

Manage multiple files permissions using puppet

如何从 cat 命令的文件名列表中设置文件权限?

例如下面的命令returns 3个文件名:

$ cat /tmp/test | grep file
/etc/systemd/file_1.log
/etc/systemd/file_2.log
/etc/systemd/file_3.log

如何使用 puppet 运行 命令,获取文件名,然后循环 3 个文件名并相应地设置权限?

文件是资源,如果您想管理资源,您必须知道它就在那里,因此动态创建日志文件并不容易。如果您已经知道文件名,那么您可以使用类似这样的方法并将数组传递到文件资源中。

file { ['/etc/systemd/file_1.log', 
        '/etc/systemd/file_1.log',
        '/etc/systemd/file_1.log'] :
    ensure => 'file',
    mode   => '0644',
    owner  => 'root',
    group  => 'root',
  }

另一种方法可能是使用 exec

exec { 'chmod 644 /etc/systemd/file_*.log':
  path => ['/usr/bin', '/usr/sbin',],
}

但你真的需要像 onlyifunless 这样的东西,否则这将每 30 分钟执行一次,这打破了我们尝试应用 Puppet 代码的幂等规则,其中事情只有在以下情况下才会改变他们需要纠正。因此,您将需要一个命令行来测试权限和 return onlyif 的布尔值。 这里有更多详细信息 https://puppet.com/docs/puppet/5.5/types/exec.html

另一种方法(以及我的方法)是通过外部事实公开该文件的内容,该事实将文件列表传递给 Puppet 以用于目录编译。外部事实可以是 bash 脚本,所以我会创建一个名为 /etc/facter/facts.d/logfiles.sh 的文件,显然我会使用 Puppet 部署它。

#!/usr/bin/env bash
logfiles=($(grep file /tmp/test))
echo "logfiles=${logfiles[*]}"

然后在我的 Puppet 代码中我会有这样的东西;

$logfiles.each |String $logfile| {
  file { $logfile :
    ensure => 'file',
    mode   => '0644',
    owner  => 'root',
    group  => 'root',
  }
}

因此,当 Puppet 运行 发生时,日志文件列表将通过事实 returned 到 Puppet,然后列出的每个文件都被定义为具有正确权限的资源。

How do I set file permission from list of file names from cat command?

有两个主要选择,但我首先观察到您的示例是 grep 的输出,而不是 cat,并且该示例中的 cat 是多余的。尽管如此,这些细节并没有改变大局——基本上相同的方法适用于任何命令的数据输出。


写一个 custom fact 来捕获文件名(截至每个目录请求的时间),并使用该信息创建适当的 File 资源。

自定义事实并不难,但完整的细节比 SO 答案更合适。假设您有一个事实 $facts['systemd_logs'],其值是一个绝对文件名数组,您可以像这样紧凑地表达整组想要的 File 资源:

file { $facts['systemd_logs']:
    mode => '0644',
}

(或您想要的任何模式)。


使用 Exec 资源 运行 适当的命令会更快(也更脏)

exec { 'ensure correct file permissions':
    command  => 'chmod 0644 $(/bin/grep file /tmp/test)',
    onlyif   => '/bin/grep -q file /tmp/test',
    provider => 'shell',
}