Добавление файла sudoers в chef завершается неудачно при проверке

Цель

Я пытаюсь добавить / отредактировать файл sudoers в Chef.

После большого количества поисков (и сломанной sudoers) я нашел этот вопрос, и ответ, казалось, был точно, что я ищу.


Моя кулинарная книга

Так что в мой шеф-повар я добавил следующее visudo поваренная книга:

Рецепт: ~/chef-repo/cookbook/visudo/recipes/allowUpgrade.rb

template '/etc/sudoers.d/allowUpgrade' do
    cookbook 'visudo'
    source 'allowUpgrade.erb'

    owner'root'
    group 'root'
    mode '0440'

    verify "visudo -c -f %{path}"
end

Мой шаблон: ~/chef-repo/cookbooks/visudo/templates/allowUpgrade.erb

username ALL=(ALL) NOPASSWD: /usr/local/bin/upgrade

Шаблон и проверка работает вручную

Когда я помещаю эту строку / файл туда вручную, используя

sudo nano /etc/sudoers.d/allowUpgrade

(Я знаю, что не следует), а затем проверить это с помощью

visudo -c -f /etc/sudoers.d/allowUpgrade

я получил

/etc/sudoers.d/allowUpgrade: parsed OK

и это работает означает, что я могу бежать

sudo upgrade

без запроса пароля sudo.


Проверка не запускается шеф-поваром

Однако это не работает с помощью Chef. Я пробую сначала на локальной машине используя

sudo chef-client -z --runlist 'recipe[visudo::allowUpgrade]'

Но я получаю эту ошибку

Error executing action `create` on resource 'template[/etc/sudoers.d/allowUpgrade]'

Chef::Exceptions::ValidationFailed

Почему проверка не проходит у шеф-повара? Что я делаю неправильно?

Здесь полное сообщение об ошибке

Recipe: visudo::allowUpgrade
  * template[/etc/sudoers.d/allowUpgrade] action create[2017-12-07T08:24:50+01:00] INFO: Processing template[/etc/sudoers.d/allowUpgrade] action create (visudo::                                         allowUpgrade line 7)


    ================================================================================
    Error executing action `create` on resource 'template[/etc/sudoers.d/allowUpgrade]'
    ================================================================================

    Chef::Exceptions::ValidationFailed
    ----------------------------------
    Proposed content for /etc/sudoers.d/allowUpgrade failed verification #<Chef::Resource::File::Verification:0x0000000004070c48>

    Resource Declaration:
    ---------------------
    # In /home/username/chef-repo/.chef/local-mode-cache/cache/cookbooks/visudo/recipes/allowUpgrade.rb

      7: template '/etc/sudoers.d/allowUpgrade' do
      8:     owner'root'
      9:     group 'root'
     10:     mode '0440'
     11:     source 'allowUpgrade.erb'
     12:     verify 'visudo -c -f %{path}'
     13: end

    Compiled Resource:
    ------------------
    # Declared in /home/username/chef-repo/.chef/local-mode-cache/cache/cookbooks/visudo/recipes/allowUpgrade.rb:7:in `from_file'

    template("/etc/sudoers.d/allowUpgrade") do
      action [:create]
      default_guard_interpreter :default
      source "allowUpgrade.erb"
      declared_type :template
      cookbook_name "visudo"
      recipe_name "allowUpgrade"
      owner "root"
      group "root"
      mode "0440"
      verifications [#<Chef::Resource::File::Verification:0x0000000004070c48 @command_opts={},
          @command="visudo -c -f %{path}", @block=nil, @parent_resource=<template[/etc/sudoers.d/allowUpgrade] 
          @name: "/etc/sudoers.d/allowUpgrade" @before: nil @params: {} 
          @provider: nil @allowed_actions: [:nothing, :create, :delete, :touch, :create_if_missing] 
          @action: [:create] @updated: false @updated_by_last_action: false 
          @source_line: "/home/username/chef-repo/.chef/local-mode-cache/cache/cookbooks/visudo/recipes/allowUpgrade.rb:7:in `from_file'" 
          @guard_interpreter: nil @default_guard_interpreter: :default 
          @elapsed_time: 0 @source: "allowUpgrade.erb" @cookbook: nil 
          @local: false @variables: {} @inline_helper_blocks: {} 
          @inline_helper_modules: [] @helper_modules: [] @declared_type: :template 
          @cookbook_name: "visudo" @recipe_name: "allowUpgrade" @owner: "root" @group: "root" @mode: "0440" 
          @verifications: [...] @path: "/etc/sudoers.d/allowUpgrade">>]
      path "/etc/sudoers.d/allowUpgrade"
    end

Обновление:

Когда я оставляю проверку и просто делаю

template '/etc/sudoers.d/allowUpgrade' do
    cookbook 'visudo'
    source 'allowUpgrade.erb'

    owner 'root'
    group 'root'
    mode '0440'

    verify { 1 == 1 }
end

Судо сломан! В режиме восстановления и корневой консоли я проверил, и это выглядит так же, как когда я вставляю его вручную (что работает нормально)?!

1 ответ

Решение

Благодаря помощи Tensibai здесь в комментариях и подсказке lineendings Я мог бы наконец решить эту проблему.

На самом деле проблема заключалась в том, что, как отмечалось в этом древнем выпуске,

Я создал кулинарные книги, рецепты и шаблоны на сервере Ubuntu 16.04, но все редактирую в репозитории в https://brackets.io/ для Windows.

Этот созданный шаблон (и другие) файлы имеют CRLF вместо LF lineendings, потому что, похоже, Brackets автоматически использует линейные окончания ОС, в которой он работает. Это конечно сделало /etc/sudoers.d/allowUpgrade файл тормоза sudoers потому что это должно заканчиваться новой строкой.

После некоторых исследований я обнаружил, что это старая известная проблема, которая может быть решена с помощью плагина Newline.

После установки этого плагина действительно я мог видеть, что файл CRLF lineendings.

Я переключил это на LF благодаря плагину, нажав на CRLF, Теперь моя кулинарная книга работает, как и ожидалось, и я могу запустить

sudo upgrade

без пароля запрашивается пароль - значит, он работает.

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