使用 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',],
}
但你真的需要像 onlyif
或 unless
这样的东西,否则这将每 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',
}
如何从 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',],
}
但你真的需要像 onlyif
或 unless
这样的东西,否则这将每 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',
}