Puppet:如何强制在 root 的主文件夹中创建文件?

Puppet:如何强制在 root 的主文件夹中创建文件?

.vimrc我正在尝试使用 Puppet 在生产环境中的所有服务器上设置自定义配置文件。

我写了以下清单:

class vim {
    file { "/etc/skel/.vimrc":
    path    => '/etc/skel/.vimrc',
    ensure  => present,
    mode    => "664",
    source  => "puppet:///modules/vim/.vimrc",
         }
    }

    file { "/root/.vimrc":
    path    => '/root/.vimrc',
    ensure  => present,
    mode    => "664",
    source  => "puppet:///modules/vim/.vimrc",
    }
}

清单的第一部分像魔法一样工作,并将.vimrc文件添加到/etc/skel,但由于某种原因,第二部分不起作用,即使你可以看到除了路径之外它是完全相同的配置,第二部分中的路径是root的主目录。

Puppet 忽略此部分有什么原因吗?

这是因为它对 root 的主文件夹有一些防御措施吗?

编辑#1:

[root@sgproxy04 ~]# ls -la /root/
total 2452
dr-xr-x---.  3 root root    4096 2015-02-10 10:53 .
dr-xr-xr-x. 27 root root    4096 2015-01-12 09:31 ..
-rw-------.  1 root root    9423 2013-07-17 14:19 anaconda-ks.cfg
-rw-------   1 root root   14032 2015-02-10 10:55 .bash_history
-rw-r--r--.  1 root root      18 2009-05-20 10:45 .bash_logout
-rw-r--r--   1 root root     196 2014-11-17 12:16 .bash_profile
-rw-r--r--.  1 root root     176 2004-09-23 03:59 .bashrc
-rw-r--r--.  1 root root    9545 2013-07-17 14:21 cobbler.ks
-rw-r--r--.  1 root root     100 2004-09-23 03:59 .cshrc
-rwxr-xr-x.  1 root root     396 2013-07-10 07:33 hosts.sh
-rw-r--r--.  1 root root   17440 2013-07-17 14:19 install.log
-rw-r--r--.  1 root root   12476 2013-07-17 14:19 install.log.syslog
-rw-r--r--.  1 root root 2382545 2013-07-17 14:21 ks-post.log
-rw-r--r--.  1 root root    3572 2013-07-17 14:17 ks-pre.log
drwx------   2 root root    4096 2014-09-15 07:45 .ssh
-rw-r--r--.  1 root root     129 2004-12-03 21:42 .tcshrc
-rw-rw-r--   1 root root       0 2014-12-18 16:14 testfile2.dat
-rw-rw-r--   1 root root       0 2014-12-18 16:14 testfile.dat
-rw-------   1 root root    6757 2015-02-10 10:53 .viminfo
[root@sgproxy04 ~]#

编辑#2:puppet agent -t在客户端运行时,我得到以下输出:

[root@sgproxy04 ~]# puppet agent -t
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Loading facts in /var/lib/puppet/lib/facter/root_home.rb
Info: Loading facts in /var/lib/puppet/lib/facter/pe_version.rb
Info: Loading facts in /var/lib/puppet/lib/facter/puppet_vardir.rb
Info: Loading facts in /var/lib/puppet/lib/facter/facter_dot_d.rb
Error: Could not retrieve catalog from remote server: Error 400 on SERVER: syntax error on line 11, col 4: `    ensure  => present,' at /etc/puppet/environments/production/manifests/site.pp:1 on node sgproxy04.sg.company.com
Warning: Not using cache on failed catalog
Error: Could not retrieve catalog; skipping run
[root@sgproxy04 ~]#

在Puppet服务器中检查有问题的文件时:

[root@foreman fqdns]# cat /etc/puppet/environments/production/manifests/site.pp
hiera_include("classes", [])
Package {  allow_virtual => false, }

node default {
}
[root@foreman fqdns]#

如您所见,它说第 11 行存在问题,但文件中只有 5 行。

答案1

正如 Sven 在他的评论中指出的那样,这实际上是你的代码中的一个语法错误 - 你}的第一个资源的末尾有一个多余的内容file

进一步说,这实际上并不被视为“无效”语法 - 因此 Puppet 仍可运行且不会发出任何抱怨。您实际上是用第二个 来结束类},之后的所有内容都会被 Puppet 忽略。

另外,还有几点风格要点:

  • 你的mode属性需要是'0644'[来源:Puppet 文档]
  • 仅当您在字符串中使用变量/事实时才需要用双引号括住字符串(即"This is a string quoting ${myvar}."[来源:Puppet Lint]
  • path如果使用路径作为资源名称,则可以完全删除该属性[来源:Puppet 文档]

尝试使用此代码:

class vim {
    file { '/etc/skel/.vimrc':
        ensure  => file,
        mode    => '0664',
        source  => 'puppet:///modules/vim/.vimrc',
    }

    file { '/root/.vimrc':
        ensure  => file,
        mode    => '0664',
        source  => 'puppet:///modules/vim/.vimrc',
    }
}

答案2

好的,我找到了问题。我错误地将类写入了 hiera 文件中,而不是 puppet 的模块目录中。一旦我将文件移动到文件夹modules/vim/manifests/并像这样编辑 hiera 文件:

classes:
 - vim

它开始工作了。

感谢您的帮助。

相关内容