Ruby 在chef中添加sudoers文件在验证时失败 目标

Ruby 在chef中添加sudoers文件在验证时失败 目标,ruby,chef-infra,verification,sudoers,Ruby,Chef Infra,Verification,Sudoers,我正在尝试在中添加/编辑sudoers文件 在经历了大量的赛拉赫(和破碎的苏多尔人)之后,我发现并似乎正是我所追求的 我的食谱 因此,在我的厨师中,我添加了以下visudocookbook: 食谱:~/chef repo/cookbook/visudo/recipes/allowUpgrade.rb template '/etc/sudoers.d/allowUpgrade' do cookbook 'visudo' source 'allowUpgrade.erb'

我正在尝试在中添加/编辑sudoers文件

在经历了大量的赛拉赫(和破碎的苏多尔人)之后,我发现并似乎正是我所追求的


我的食谱 因此,在我的厨师中,我添加了以下
visudo
cookbook:

食谱:
~/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
我明白了

这意味着我可以跑步

sudo upgrade
没有提示输入sudo密码


运行Chef时验证失败 但是,使用Chef不起作用。我先在本地机器上用

sudo chef client-z--runlist'recipe[visudo::allowUpgrade]'
但是我得到了这个错误

执行操作“在资源模板上创建”时出错[/etc/sudoers.d/allowUpgrade] Chef::异常::验证失败 为什么chef中的验证失败?我做错了什么?

下面是完整的错误消息

配方:visudo::allowUpgrade *模板[/etc/sudoers.d/allowUpgrade]操作创建[2017-12-07T08:24:50+01:00]信息:处理模板[/etc/sudoers.d/allowUpgrade]操作创建(visudo::allowUpgrade第7行) ================================================================================ 在资源模板[/etc/sudoers.d/allowUpgrade]上执行操作“创建”时出错 ================================================================================ Chef::异常::验证失败 ---------------------------------- /etc/sudoers.d/allowUpgrade的建议内容验证失败# 资源声明: --------------------- #在/home/username/chef repo/.chef/local mode cache/cache/cookbooks/visudo/recipes/allowUpgrade.rb中 7:模板“/etc/sudoers.d/allowUpgrade”do 8:所有者“根” 9:组“根” 10:模式“0440” 11:来源“allowUpgrade.erb” 12:验证'visudo-c-f%{path}' 13:完 汇编资源: ------------------ #在/home/username/chef repo/.chef/local mode cache/cache/cookbooks/visudo/recipes/allowUpgrade.rb:7:in“from_file”中声明 模板(“/etc/sudoers.d/allowUpgrade”)do 动作[:创建] 默认\u保护\u解释器:默认值 来源“allowUpgrade.erb” 声明的类型:模板 食谱名称“visudo” 配方名称“allowUpgrade” 所有者“根” 组“根” 模式“0440” 验证[#] 路径“/etc/sudoers.d/allowUpgrade” 结束
更新

当我不做验证就这么做的时候

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

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

    verify { 1 == 1 }
end
sudo坏了!在恢复模式下,我检查了根控制台,它看起来和我手动插入它时一样(什么工作正常)

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

事实上,正如中所述,问题在于线条端点

我在Ubuntu服务器16.04上生成了食谱、食谱和模板,但我在Windows上的存储库中编辑了所有内容

这使得模板(和其他)文件具有
CRLF
而不是
LF
行尾,因为括号似乎自动使用它运行的操作系统的行尾。这当然使
/etc/sudoers.d/allowUpgrade
文件阻止了
sudoers
,因为它必须以新行结束

经过一些研究,我发现这是一个问题,可以通过

安装此插件后,我确实可以看到该文件具有
CRLF
lineendings

我通过点击
CRLF
将其切换到
LF
,多亏了插件。现在我的食谱按预期运行,我可以运行了

sudo upgrade
没有提示输入密码-这意味着它可以工作。

多亏了这里的帮助和
lineendings
的提示,我终于解决了这个问题

事实上,正如中所述,问题在于线条端点

我在Ubuntu服务器16.04上生成了食谱、食谱和模板,但我在Windows上的存储库中编辑了所有内容

这使得模板(和其他)文件具有
CRLF
而不是
LF
行尾,因为括号似乎自动使用它运行的操作系统的行尾。这当然使
/etc/sudoers.d/allowUpgrade
文件阻止了
sudoers
,因为它必须以新行结束

经过一些研究,我发现这是一个问题,可以通过

安装此插件后,我确实可以看到该文件具有
CRLF
lineendings

我通过点击
CRLF
将其切换到
LF
,多亏了插件。现在我的食谱按预期运行,我可以运行了

sudo upgrade

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

在NOPASSWD:和命令之间不应该有空格。我假设您的控制台测试根本不测试渲染文件。顺便说一句,有一个与一个供应商处理的工作fine@Tensibai感谢sudo食谱中的提示。因为在中,它们总是在
NOPASSWD:
和命令之间有一个空格,我认为这是必须的。这并不能解释为什么如果我手动操作,它会起作用。你是从windows盒子里创建食谱的吗?如果模板有CRLF行结尾,而不是LF,这可能是问题所在。我在ubuntu服务器16.04.2上的chef工作站上使用
chef generate cookbook/recipe/template
创建它们。我试着在同一台机器上本地运行它。我正在编辑Windows上括号内的食谱。。但我不认为这是个问题,寿