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 строк.

2 ответа

Решение

Как указывает Свен в своем комментарии, это на самом деле синтаксическая ошибка в вашем коде - у вас есть дополнительная } в конце вашего первого file ресурс.

Чтобы расширить это, на самом деле это не считается "недействительным" синтаксисом как таковым - следовательно, почему Puppet все еще работает и не жалуется. Вы фактически заканчиваете класс со вторым }и все, что после этого игнорируется Puppet.

Также несколько стилевых моментов:

  • Ваш mode атрибут должен быть '0644' [Источник: Кукольные документы ]
  • Вам нужно только заключать в кавычки строки, когда вы используете переменную / факт внутри них (т.е. "This is a string quoting ${myvar}." [Источник: Puppet Lint ]
  • Вы можете удалить path атрибут полностью, если вы используете путь для имени ресурса [Source: Puppet docs ]

Попробуйте с этим кодом:

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',
    }
}

Хорошо, я нашел проблему. Я по ошибке написал класс в файле hiera вместо каталога модулей puppet. Как только я переместил файл в modules/vim/manifests/ папку и отредактировал файл hiera так:

classes:
 - vim

Это начало работать.

Спасибо за вашу помощь.

Другие вопросы по тегам