erb sudoers 遍历数组的散列
erb sudoers iterate over hash of arrays
我尝试通过 puppet 动态生成 sudoers 文件。我这里有这样的 hieradata:
---
sudoparameters:
cmnd_aliases:
CMND_ALIAS_A:
- /path/to/command_a *
- /path/to/command_b *
CMND_ALIAS_B:
- /path/to/command_c
- /path/to/command_d *
runas_aliases:
RUNAS_ALIAS_A:
- runas_user_a, runas_user_b
RUNAS_ALIAS_B:
- runas_user_a, runas_user_c
defaults:
- user!authenticate
- user!systlog
commands:
- user ALL=(root) NOPASSWD:/usr/sbin/puppetd --test agent --server=*
- user ALL=(root) NOPASSWD:/usr/bin/lsof -a *
- user ALL=(RUNAS_ALIAS_A) NOPASSWD: CMND_ALIAS_A
还有这样的 erb 模板:
<% @sudoparameters['cmnd_aliases'].each do |cmnd_alias| -%>
Cmnd_Alias <%= cmnd_alias %> <%= cmnd_alias.map { |path| path.join(', ') } %>
<% end -%>
<% @sudoparameters['runas_aliases'].each do |runas_alias| -%>
Runas_Aliases <%= runas_alias %> <%= runas_alias.map { |path| path.join(', ') } %>
<% end -%>
<% @sudoparameters['defaults'].each do |default| -%>
Defaults:<%= default %>
<% end -%>
<% @sudoparameters['commands'].each do |command| -%>
<%= command %>
<% end -%>
我迭代 cmnd_aliases 和 runas_aliases 的方法不起作用。如果这些数组存在于 sudoparameter hash 中,我如何完成它以生成逗号分隔列表 für Cmnd_Aliases 和 Runas_Aliases?
干杯
基督教徒
为了解决这个问题,我将每个块包装成:
<% if (@sudoparameters['cmnd_aliases'] != nil) then -%>
<% @sudoparameters['cmnd_aliases'].each do |cmnd_alias| -%>
Cmnd_Alias <%= cmnd_alias %> <%= cmnd_alias.map { |path| path.join(', ') } %>
<% end -%>
<% end -%>
但目前 cmnd_alias.map
没有按预期工作。我收到以下错误。
Detail: undefined method `join' for "CMND_ALIAS_A":String
为了解决这个问题,我将键和值保存到不同的变量并将连接直接应用于值。
<% if (@sudoparameters['cmnd_aliases'] != nil) then -%>
<% @sudoparameters['cmnd_aliases'].each do |cmnd_alias_key, cmnd_alias_value| -%>
Cmnd_Alias <%= cmnd_alias_key %> <%= cmnd_alias_value.join(', ') %>
<% end -%>
<% end -%>
<% if (@sudoparameters['runas_aliases'] != nil) then -%>
<% @sudoparameters['runas_aliases'].each do |runas_alias_key, runas_alias_value| -%>
Runas_Aliases <%= runas_alias_key %> <%= runas_alias_value.join(', ') %>
<% end -%>
<% end -%>
<% if (@sudoparameters['defaults'] != nil) then -%>
<% @sudoparameters['defaults'].each do |default| -%>
Defaults:<%= default %>
<% end -%>
<% end -%>
<% @sudoparameters['commands'].each do |command| -%>
<%= command %>
<% end -%>
如果您的哈希值中的某些值为 nil,您可以使用此语法:
<% (@sudoparameters['cmnd_aliases'] || {}).each do |cmnd_alias_key, cmnd_alias_values| -%>
Cmnd_Alias <%= cmnd_alias_key %> <%= cmnd_alias_values.join(', ') %>
<% end -%>
一个|| b 语法有助于避免未定义的方法错误:
{:a => :b} || {}
#=> {:a => :b}
nil || {}
#=> {}
最后,如果cmnd_alias_value是数组,应该写成复数:cmnd_alias_values。这不是必须的,但它可能会使您的代码更容易理解。
我尝试通过 puppet 动态生成 sudoers 文件。我这里有这样的 hieradata:
---
sudoparameters:
cmnd_aliases:
CMND_ALIAS_A:
- /path/to/command_a *
- /path/to/command_b *
CMND_ALIAS_B:
- /path/to/command_c
- /path/to/command_d *
runas_aliases:
RUNAS_ALIAS_A:
- runas_user_a, runas_user_b
RUNAS_ALIAS_B:
- runas_user_a, runas_user_c
defaults:
- user!authenticate
- user!systlog
commands:
- user ALL=(root) NOPASSWD:/usr/sbin/puppetd --test agent --server=*
- user ALL=(root) NOPASSWD:/usr/bin/lsof -a *
- user ALL=(RUNAS_ALIAS_A) NOPASSWD: CMND_ALIAS_A
还有这样的 erb 模板:
<% @sudoparameters['cmnd_aliases'].each do |cmnd_alias| -%>
Cmnd_Alias <%= cmnd_alias %> <%= cmnd_alias.map { |path| path.join(', ') } %>
<% end -%>
<% @sudoparameters['runas_aliases'].each do |runas_alias| -%>
Runas_Aliases <%= runas_alias %> <%= runas_alias.map { |path| path.join(', ') } %>
<% end -%>
<% @sudoparameters['defaults'].each do |default| -%>
Defaults:<%= default %>
<% end -%>
<% @sudoparameters['commands'].each do |command| -%>
<%= command %>
<% end -%>
我迭代 cmnd_aliases 和 runas_aliases 的方法不起作用。如果这些数组存在于 sudoparameter hash 中,我如何完成它以生成逗号分隔列表 für Cmnd_Aliases 和 Runas_Aliases?
干杯
基督教徒
为了解决这个问题,我将每个块包装成:
<% if (@sudoparameters['cmnd_aliases'] != nil) then -%>
<% @sudoparameters['cmnd_aliases'].each do |cmnd_alias| -%>
Cmnd_Alias <%= cmnd_alias %> <%= cmnd_alias.map { |path| path.join(', ') } %>
<% end -%>
<% end -%>
但目前 cmnd_alias.map
没有按预期工作。我收到以下错误。
Detail: undefined method `join' for "CMND_ALIAS_A":String
为了解决这个问题,我将键和值保存到不同的变量并将连接直接应用于值。
<% if (@sudoparameters['cmnd_aliases'] != nil) then -%>
<% @sudoparameters['cmnd_aliases'].each do |cmnd_alias_key, cmnd_alias_value| -%>
Cmnd_Alias <%= cmnd_alias_key %> <%= cmnd_alias_value.join(', ') %>
<% end -%>
<% end -%>
<% if (@sudoparameters['runas_aliases'] != nil) then -%>
<% @sudoparameters['runas_aliases'].each do |runas_alias_key, runas_alias_value| -%>
Runas_Aliases <%= runas_alias_key %> <%= runas_alias_value.join(', ') %>
<% end -%>
<% end -%>
<% if (@sudoparameters['defaults'] != nil) then -%>
<% @sudoparameters['defaults'].each do |default| -%>
Defaults:<%= default %>
<% end -%>
<% end -%>
<% @sudoparameters['commands'].each do |command| -%>
<%= command %>
<% end -%>
如果您的哈希值中的某些值为 nil,您可以使用此语法:
<% (@sudoparameters['cmnd_aliases'] || {}).each do |cmnd_alias_key, cmnd_alias_values| -%>
Cmnd_Alias <%= cmnd_alias_key %> <%= cmnd_alias_values.join(', ') %>
<% end -%>
一个|| b 语法有助于避免未定义的方法错误:
{:a => :b} || {}
#=> {:a => :b}
nil || {}
#=> {}
最后,如果cmnd_alias_value是数组,应该写成复数:cmnd_alias_values。这不是必须的,但它可能会使您的代码更容易理解。