Puppet 6 и модуль puppetlabs/accounts не создают учетную запись пользователя в формате Hiera YAML

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

Моя конфигурация puppet 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== [email protected]

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


person Rostyslav Malenko    schedule 25.02.2019    source источник
comment
Как объявляются классы в этом модуле?   -  person Matt Schuchard    schedule 25.02.2019
comment
Он должен быть accounts::user и даже он работает как пишут в мануале, но я не знаю как он работает как YAML/Hiera   -  person Rostyslav Malenko    schedule 25.02.2019


Ответы (2)


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

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

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

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

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

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

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

    • performing a hash merge of results appearing at different levels of the hierarchy
    • ожидая, что результатом будет хэш со строковыми ключами и хэш-значениями
    • и по умолчанию пустой хэш, если результаты не найдены;
  • сопоставления в хэше результата повторяются, и для каждого объявляется экземпляр определенного типа accounts::user

    • using the (outer) hash key as the user name,
    • и значение, связанное с этим ключом, как сопоставление имен параметров со значениями параметров.
person John Bollinger    schedule 25.02.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 (включается, если вы используете 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== [email protected]

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

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

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

person Alex Harvey    schedule 26.02.2019
comment
Спасибо, я попробовал этот вариант, но пользователь не добавился. Возможно, я сделал что-то не так. ` тест класса (Hash [String, Hash] $users) { $users.each |$user,$props| {accounts::user { $user: * =› $props } } } ` - person Rostyslav Malenko; 26.02.2019
comment
Я только что проверил, и код работает — не стесняйтесь задавать новый вопрос? - person Alex Harvey; 27.02.2019
comment
Спасибо. Не могли бы вы мне помочь, пожалуйста? Из содержимого yaml, заполненного строками accounts/shell/bash.... bashrc_content: file('accounts/shell/bashrc') bash_profile_content: file('accounts/shell/bash_profile') Из содержимого .pp, заполненного содержимым из этих файлов bashrc_content => file('accounts/shell/bashrc'), bash_profile_content => file('accounts/shell/bash_profile'), Gist - person Rostyslav Malenko; 01.03.2019
comment
Я рад помочь, но вам нужно задать новый вопрос и показать весь соответствующий код. - person Alex Harvey; 02.03.2019