在 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
没有提示输入密码 - 这意味着它有效。
目标
我正在尝试 add/edit Chef 中的一个 sudoers 文件。
经过大量搜索(和损坏的 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
模板和验证手动工作
当我使用
手动将此 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
没有提示输入密码 - 这意味着它有效。