Hiera
Hiera and Yaml belong together (as do Puppet and Hiera). There are some limitations of using Yaml in Hiera.
Data
# key/value
postfix::interface: # value is nil
postfix::interface: '' # value is empty
postfix::interface: 'all' # value is "all"
# arrays
postfix::relays: # value is nil
-
postfix::relays: [] # value is empty
postfix::relays: # value is ["relay01", "relay02"]
- 'relay01'
- 'relay02'
# hash or dict
postfix::aliases: {} # value is empty
postfix::aliases: # value is {"root"=>{"destination"=>"admin@example.com"} }
root:
destination: 'admin@example.com'
Data types
Automatic
---
my_data_types:
boolean: true
float: 3.14
integer: 4
string: somewords
stringthatneedsquotes: "Some characters like % need to be encapsulated in quotes"
stringifiedinteger: '7' # value is string '7', not integer 7
stringifiedboolean: 'false' # value is string 'false', not boolean false.
Set
---
specify_my_data_types:
a_boolean: !!bool 'true'
a_string: !!str true
a_integer: !!num '-1'
Output
$ hiera specify_my_data_types environment=testing
{"a_boolean"=>true, "a_string"=>"true", "a_integer"=>-1}
Anchors and Aliases
Limitations
- Parse order dependance: Anchors must be defined first.
- Merge is also depending on the order: Overrides must be after the merge.
- Anchors and Alias must be in the same file. They are part of the Yaml specification, not of Hiera.
---
# The anchor, &apache_vhosts_defaults in this example
apache::vhosts::defaults: &apache_vhosts_defaults
email: 'default_admin@example.com'
servername: 'localhost'
# Anchors must be defined before they are referenced
# parser order matters
apache::vhosts:
demo.example.com:
<<: *apache_vhosts_defaults # the <<: mean merge the hash
port: '8088'
test.example.com:
<<: *apache_vhosts_defaults
email: 'reza@example.com' # NOTE: parser order, this will overwrite the default
port: '8080'
prod.example.com:
email: 'prod@example.com' # NOTE: The merge happena ...
Facts and Functions
Referencing facts:
---
postfix::myorigin: "%{::fqdn}"
postfix::relay: "relay.%{::domain}"
Referencing functions
postfix::allowed_ips: "%{hiera('my_ips')}"
Using hiera within the Yaml file in this way allows to query other values of the yaml document as well:
---
setting1: value1
setting2: "%{hiera('setting1')}"
Output:
$ hiera setting1
value1
$ hiera setting2
value1
Multi-line blocks
---
multi_line1: |
line1 first line
line2 second line
multi_line2: >
line1 first line
line2 second line