Оценка значения хэшей в манифесте марионеток от hiera

У меня возникли трудности с вызовом значения хэшей в моем манифесте марионетки, мой код, как показано ниже,

файл hiera .yaml:

---
users:
  app1:
    ensure: 'present'
    home: '/home/app1'
    password: '!!'
    password_max_age: '99999'
    password_min_age: '0'
  app2:
    ensure: 'present'
    home: '/home/app2'
    password: '!!'
    password_max_age: '99999'
    password_min_age: '0'

Мой кукольный манифест:

class profile::sec::sec_model {
hiera_hash('users').each |String $user, Hash $user_hash| {
    $user_hash.each |String $attr, String $value| {
        user { "$user":
            "${attr}" => "${value}"
       }
    }
}
}

Моя цель - создать пользовательское приложение1 и приложение2, если использовать обычный манифест, как показано ниже, я могу создать его, как показано ниже,

user { 'app1':
        ensure            => "present",
        home              => "/home/app1",
        password          => '!!',
        password_max_age  => '99999',
        password_min_age  => '0',
        shell             => '/bin/bash',
    }
}

Однако при использовании hiera я получил сообщение об ошибке, как показано ниже, с тестового клиентского сервера puppet:

Ошибка: Не удалось получить каталог с удаленного сервера: Ошибка 500 на СЕРВЕРЕ: Ошибка сервера: Синтаксическая ошибка в '' (файл: /etc/puppetlabs/code/environments/xxxxx/site/profile/manifests/xxx/sec_model.pp, строка : 11, столбец: 13) на узле xxxx.xxx.com

Когда я смотрю в свой манифест, все хорошо, но я не могу определить, какая часть кода для вызова хеш-значения неверна.


person MrAZ    schedule 14.03.2019    source источник


Ответы (1)


Да, это недопустимый синтаксис.

Итак, вы должны реорганизовать свой YAML как:

---
profile::sec::sec_model::users:
  app1:
    ensure: present
    home: /home/app1
    password: '!!'
    password_max_age: 99999
    password_min_age: 0
  app2:
    ensure: present
    home: /home/app2
    password: '!!'
    password_max_age: 99999
    password_min_age: 0

А затем для вашего манифеста используйте либо:

class profile::sec::sec_model(Hash[String,Hash] $users) {
  $users.each |$user,$user_hash| {
    user { $user: * => $user_hash }
  }
}

Или просто:

class profile::sec::sec_model(Hash[String,Hash] $users) {
  create_resources(user, $users)
}

Отметив, что не всем в сообществе Puppet нравится использовать create_resources.

Дальнейшее объяснение:

  • Этот вопрос очень похож на этот более ранний вопрос. См. там дополнительную информацию о «почему» и дополнительные ссылки.

  • Обратите также внимание, что я удалил лишние знаки препинания в YAML. Лично я считаю лучшей практикой включать в файлы YAML только те знаки препинания, которые действительно необходимы, потому что это чище, а также вынуждает вас узнавать, когда и почему требуются знаки препинания в YAML.

person Alex Harvey    schedule 14.03.2019
comment
Для справки, я предпочитаю подход итерации/разметки, а не create_resources(), но, конечно, оба работают. - person John Bollinger; 14.03.2019
comment
@JohnBollinger Вы имеете в виду это: puppet.com/ документы/кукольный/5.5/? - person Matt Schuchard; 14.03.2019
comment
Единственный и неповторимый @MattSchuchard. Лично я предпочитаю create_resources, и, по моим наблюдениям, большинство людей, не использующих Puppet, находят его более понятным. Но определенно кукольникам это часто не нравится! - person Alex Harvey; 14.03.2019
comment
Если бы мне пришлось угадывать источник отвращения, это было бы потому, что create_resources и встроенные определенные типы ресурсов были единственным способом итерации до 3.7, и у всех есть плохие воспоминания о том, что затем мысленно ассоциируется с create_resources. Кроме того, вызов функции не так надежен, как лямбда, но тогда я думаю, зачем убивать муравья с помощью ракетной установки (с точки зрения инструмента, который потенциально является излишним для задачи). - person Matt Schuchard; 14.03.2019
comment
@AlexHarvey Спасибо, Алекс, это действительно ответ на мой вопрос. Однако, поскольку мой синтаксис неверен в моем .yaml, но я не понимаю, почему он там неправильный, обязательно ли включать наш класс в этот .yaml, как вы написали здесь? - person MrAZ; 14.03.2019
comment
Я предпочитаю явную итерацию и присваивание знака в значительной степени потому, что нахожу это значительно более понятным. Хотя create_resources имеет преимущество описательного имени, его поведение немного волшебно. Кроме того, версия с присвоением знака более гибкая (не то, чтобы это имело значение в случае с ОП), поэтому, если я собираюсь стандартизировать один — и я предпочитаю делать это — тогда версия пятна — это та, которую я выбирай, руки вниз. - person John Bollinger; 14.03.2019
comment
Если бы вы увидели, что эти знаки повторяются несколько раз подряд в базе кода, вы бы подумали о написании функции для удаления дублирования на другом языке, таком как C++? - person Alex Harvey; 14.03.2019
comment
@MrAZ, я создал суть, объясняющую синтаксические проблемы. - person Alex Harvey; 14.03.2019