Назад | Перейти на главную страницу

Puppet: Как принудительно создать файл в домашней папке root?

Я пытаюсь установить кастом .vimrc profile на всех серверах в производственной среде с помощью 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 строк.

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

classes:
 - vim

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

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

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

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

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

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

Попробуйте использовать этот код:

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