0

I am attempting to define my user accounts as Hashes in Hiera, like this:

---
accounts::user:
  jack:
    ensure: present
    bashrc_content: file('accounts/shell/bashrc')
    bash_profile_content: file('accounts/shell/bash_profile')

It works fine if I define them in my *.pp files.

Please, find more details about hiera.yaml, manifest and users.yamal on Gist

Why doesn't this work?

P.S. This question continues to,

Alex Harvey
  • 14,494
  • 5
  • 61
  • 97

1 Answers1

1

No, what you are trying to do is not possible.

I have a few options for you. In Hiera, you could have all of the data other than the call to the file() function:

---
accounts::user:
  jack:
    locked: false
    comment: Jack Doe
    ensure: present
    groups:
    - admins
    - sudo
    shell: '/bin/bash'
    home_mode: '0700'
    purge_sshkeys: false
    managehome: true
    managevim: false
    sshkeys:
    - ssh-rsa AAAA
    password: '70'

And then in your manifest:

$defaults = {
  'bashrc_content' => file('accounts/shell/bashrc'),
  'bash_profile_content' => file('accounts/shell/bash_profile'),
}

$user_data = lookup('accounts::user', Hash[String,Hash], 'hash', {})
$user_data.each |$user,$props| {
  accounts::user { $user: * => $props + $defaults }
}

Another option is to simply include your file content in the YAML data, i.e.

---
accounts::user:
  jack:
    locked: false
    comment: Jack Doe
    ensure: present
    groups:
    - admins
    - sudo
    shell: '/bin/bash'
    home_mode: '0700'
    purge_sshkeys: false
    managehome: true
    managevim: false
    bashrc_content: |
      # If not running interactively, don't do anything
      [ -z "$PS1" ] && return

      if [ -f /etc/bashrc ]; then
        . /etc/bashrc   # --> Read /etc/bashrc, if present.
      fi
      ...
    bash_profile_content: ...
    sshkeys:
    - ssh-rsa AAAA
    password: '70'

Then you won't need the file function or the files at all.

For more info:

Alex Harvey
  • 14,494
  • 5
  • 61
  • 97