在 Chef 中添加 sudoers 文件验证失败

Adding a sudoers file in chef fails at verification

目标

我正在尝试 add/edit Chef 中的一个 sudoers 文件。

经过大量搜索(和损坏的 sudoers)后,我发现 and 似乎正是我所追求的。


我的食谱

所以在我的厨师中我添加了以下 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

模板和验证手动工作

当我使用

手动将此 line/file 放在那里时
sudo nano /etc/sudoers.d/allowUpgrade

(我知道不应该)然后使用

验证它
visudo -c -f /etc/sudoers.d/allowUpgrade

我明白了

/etc/sudoers.d/allowUpgrade: parsed OK

它有效意味着我可以 运行

sudo upgrade

没有提示输入 sudo 密码。


验证失败运行ning Chef

但是使用 Chef 无法正常工作。我先在本地机器上尝试使用

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

但是我得到这个错误

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

Chef::Exceptions::ValidationFailed

为什么chef验证失败?我做错了什么?

这里是完整的错误信息

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

sudo 坏了!在恢复模式和我检查的根控制台中,它看起来与我手动插入时一样(什么工作正常)?!

感谢 Tensibai 的评论帮助和 lineendings 的提示,我终于解决了这个问题。

确实,问题出在 this ancient Issue

中提到的行尾

我在 Ubuntu 服务器 16.04 上生成了食谱、食谱和模板,但在 Windows 上 Brackets.io 的存储库中进行了所有编辑。

这个制作的模板(和其他)文件有 CRLF 而不是 LF 行尾,因为括号似乎自动使用 OS 的行尾,它是 运行ning在。这当然使 /etc/sudoers.d/allowUpgrade 文件中断 sudoers 因为它必须换行结束。

经过一些研究,我发现这是一个 old known Issue and could be solved by the Plug-In Newline

安装此插件后,我确实可以看到该文件有 CRLF 行尾。

我通过单击 CRLF 将其切换为 LF 感谢插件。现在我的食谱 运行 符合预期,我可以 运行

sudo upgrade

没有提示输入密码 - 这意味着它有效。