Puppet 6 и модуль puppetlabs / account не создают учетную запись пользователя в формате Hiera YAML - PullRequest
0 голосов
/ 25 февраля 2019

Когда я запускаю puppet agent --test У меня нет вывода ошибок, но пользователь не создал.

Моя марионеточная конфигурация hira.yaml:

---
version: 5
  datadir: "/etc/puppetlabs/code/environments"
  data_hash: yaml_data
hierarchy:
  - name: "Per-node data (yaml version)"
    path: "%{::environment}/nodes/%{::trusted.certname}.yaml"
  - name: "Common YAML hierarchy levels"
    paths:
      - "defaults/common.yaml"
      - "defaults/users.yaml"

users.yaml:

accounts::user:
  joed:
    locked: false
    comment: System Operator
    uid: '1700'
    gid: '1700'
    groups:
    - admin
    - sudonopw
    sshkeys:
    - ssh-rsa ...Hw== sysop+moduledevkey@puppetlabs.com

Я использую этот модуль

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Здесь есть несколько проблем.

В вашем hiera.yaml отсутствует строка, а именно клавиша defaults.Должно быть:

---
version: 5
defaults:  ## add this line
  datadir: "/etc/puppetlabs/code/environments"
  data_hash: yaml_data
hierarchy:
  - name: "Per-node data (yaml version)"
    path: "%{::environment}/nodes/%{::trusted.certname}.yaml"
  - name: "Common YAML hierarchy levels"
    paths:
      - "defaults/common.yaml"
      - "defaults/users.yaml"

Я обнаружил, что с помощью puppet-syntax gem (включено, если вы используете PDK, что рекомендуется):

▶ bundle exec rake validate            
Syntax OK
---> syntax:manifests
---> syntax:templates
---> syntax:hiera:yaml
ERROR: Failed to parse hiera.yaml: (hiera.yaml): mapping values are not allowed in this context at line 3 column 10

ТакжеВ дополнение к тому, что упомянул Джон, простейший класс для чтения в ваших данных был бы следующим:

class test (Hash[String,Hash] $users) {
  create_resources(accounts::user, $users)
}

Или, если вы хотите избежать использования create_resources*:

class test (Hash[String,Hash] $users) {
  $users.each |$user,$props| {
    accounts::user { $user: * => $props }
  }
}

Обратите внимание, что для этого я использовал функцию автоматического поиска параметров.См. Ссылку ниже.

Тогда в ваших данных Hiera вам будет соответствовать ключ с именем test::users (имя класса "test", имя ключа "users"):

---
test::users:  ## Note that this line changed.
  joed:
    locked: false
    comment: System Operator
    uid: '1700'
    gid: '1700'
    groups:
    - admin
    - sudonopw
    sshkeys:
    - ssh-rsa ...Hw== sysop+moduledevkey@puppetlabs.com

Использование автоматического поиска параметров обычно является более идиоматичным способом написания кода Puppet по сравнению с явным вызовом функции lookup.

Для получения дополнительной информации:

(* Обратите внимание, чтоcreate_resources является "спорным". Многие в сообществе марионеток предпочитают не использовать его.)

0 голосов
/ 26 февраля 2019

Ничто в самих данных Hiera не вызывает применения что-либо к целевым узлам.Некоторая декларация требуется где-то в манифесте или в выходных данных скрипта классификатора внешнего узла.Кроме того, модуль puppetlabs / account предоставляет только определенные типы, а не классы.Вы можете хранить данные определенного типа в Hiera и читать их обратно, но автоматическое связывание параметров через Hiera применяется только к классам, а не к определенным типам.

Короче говоря, пользователь не создается (и об ошибках не сообщается)) потому что никакие соответствующие ресурсы не объявлены в каталоге целевого узла.Вы не дали Puppet ничего делать.

Если вы хотите применить сохраненные пользовательские данные, представленные к вашим узлам, вам нужно что-то вроде этого:

$user_data = lookup('accounts::user', Hash[String,Hash], 'hash', {})

$user_data.each |$user,$props| {
  accounts::user { $user: * => $props }
}

Это будетв блок узла, соответствующий вашему целевому узлу, или, что лучше, в класс, который объявлен этим блоком узла или его эквивалентом.Это довольно сложно для стольких строк, но вкратце:

  • функция lookup ищет ключевые «account :: user» в ваших данных Hiera

    • выполнение слияния результатов хеша, появляющихся на разных уровнях иерархии
    • ожидание результата как хеш со строковыми ключами и значениями хеша
    • и значение по умолчанию пустого хеша, если результаты не найдены;
  • итерации в результирующем хэше повторяются, и для каждого из них объявляется экземпляр определенного типа accounts::user

    • используя (внешний) ключ хеша в качестве имени пользователя,
    • и значение, связанное с этим ключом, в качестве отображения имен параметров в значения параметров.
...