Оцените значение хэшей в манифесте кукол из hiera - PullRequest
2 голосов
/ 14 марта 2019

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

файл 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}"
       }
    }
}
}

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

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

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

1 Ответ

3 голосов
/ 14 марта 2019

Да, это неверный синтаксис.

Итак, вы должны рефакторинг вашего 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.

...