Добавление файла sudoers в шеф-повар не проходит проверку

Цель

Я пытаюсь добавить/отредактировать файл 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

Однако он не работает с использованием 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

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


person derHugo    schedule 07.12.2017    source источник
comment
У вас не должно быть пробела между NOPASSWD: и командой. Я предполагаю, что ваш консольный тест вообще не проверяет визуализированный файл. Кстати, есть sudo поваренная книга с провайдером для обработки того, что работает нормально   -  person Tensibai    schedule 07.12.2017
comment
@Tensibai Спасибо за подсказку с кулинарной книгой sudo. Поскольку в руководстве между NOPASSWD: и командой всегда есть пробел, я подумал, что это обязательно. И это не объясняет, почему это работает, если я делаю это вручную.   -  person derHugo    schedule 07.12.2017
comment
Вы создаете свою поваренную книгу из окна окна? если шаблон имеет окончания строк CRLF, а не LF, это может быть проблемой.   -  person Tensibai    schedule 07.12.2017
comment
Я создаю их с помощью chef generate cookbook/recipe/template на рабочей станции шеф-повара на сервере Ubuntu 16.04.2. Я пытаюсь запустить его локально на этой же машине. Я редактирую свои поваренные книги в Brackets в Windows... но я не думаю, что это должно быть проблемой, не так ли? Есть ли способ узнать, какие строки имеют файл?   -  person derHugo    schedule 07.12.2017
comment
Ну, я понятия не имею, позволяет ли это ваш редактор, atom показывает окончания строк внизу экрана.   -  person Tensibai    schedule 07.12.2017
comment
@Tensibai Вау, большое спасибо, чувак! Я бы никогда не подумал о линиях. Я специально искал это и нашел проблему и плагин, которые, наконец, решили мою проблему (см. Мой ответ ниже)   -  person derHugo    schedule 07.12.2017
comment
Рад, что помогло :)   -  person Tensibai    schedule 07.12.2017


Ответы (1)


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

Действительно, проблема заключалась в окончании строк, как указано в этой древней проблеме.

Я сгенерировал поваренные книги, рецепты и шаблоны на сервере Ubuntu 16.04, но все изменения я выполняю в репозитории в Bracckets.io на Окна.

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

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

введите здесь описание изображения

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

введите здесь описание изображения

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

sudo upgrade

без запроса пароля - это означает, что он работает.

person derHugo    schedule 07.12.2017