2016-10-31 9 views
2

Я пытаюсь создать файл sudoers динамически через куклу. Вот у меня есть hieradata как это:erb sudoers перебирать хэш массивов

--- 
    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 

И эрб шаблон:

<% @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 не работает. Как я могу это сделать, чтобы создать список разделителей запятой für Cmnd_Aliases и Runas_Aliases, если эти массивы существуют в sudoparameter hash?

Приветствия

Christian

+0

Что именно не работает? Вы получили сообщение об ошибке? Я не могу сказать из пасты, если вы заполнили переменную 'sudoparameters' в манифесте, а если нет, это может быть проблема или что-то еще не так. –

+0

Были ошибки в моих * .map командах. Но теперь он терпит неудачу, если массив в хеше не установлен. 'Подробно: неопределенный метод' each 'for nil: NilClass' –

ответ

1

Чтобы решить эту проблему я завернула каждый блоки в:

<% 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 -%> 
1

Если некоторые значения в вашем Hash равны нулю, то вы можете использовать следующий синтаксис:

<% (@sudoparameters['cmnd_aliases'] || {}).each do |cmnd_alias_key, cmnd_alias_values| -%> 
    Cmnd_Alias <%= cmnd_alias_key %> <%= cmnd_alias_values.join(', ') %> 
<% end -%> 

а || Синтаксис б помогает избежать неопределенных ошибок методы:

{:a => :b} || {} 
#=> {:a => :b} 

nil || {} 
#=> {} 

Наконец, если cmnd_alias_value является массивом, он должен быть записан как множественное число: cmnd_alias_values. Это не обязательно, но это может сделать ваш код немного понятнее.

+0

Это еще один подход к решению ошибки nilClass. Спасибо за это. –

 Смежные вопросы

  • Нет связанных вопросов^_^