What is new in CFEngine 3.6

34
www.cfengine.com What is new in CFEngine 3.6

description

This talk will introduce new CFEngine 3.6 features, we have these bullet points: User promises TLS protocol Math expressions Dynamic inputs New language functions Tags Data containers File templating Presentation by Kristian Amlie of CFEngine, given at CfgMgmtCamp 2014 in Ghent

Transcript of What is new in CFEngine 3.6

Page 1: What is new in CFEngine 3.6

www.cfengine.com

What is new in CFEngine 3.6

Page 2: What is new in CFEngine 3.6

What is new

• User promises• TLS protocol• Math expressions• Dynamic inputs• New language functions• Tags• Data containers• File templating

Page 3: What is new in CFEngine 3.6

User promises

Page 4: What is new in CFEngine 3.6

User promises

• A new promise type• Manage local users on hosts• Make promises about user

characteristics• UID

• Group membership

• Home directory

• Password

• Shell

• Description

Page 5: What is new in CFEngine 3.6

User promises - Example

bundle agent my_bundle {

users:

“joe”

policy => “present”,

group_primary => “users”,

groups_secondary => { “printers”,

“db_users” },

home_dir => “/nfs/home/joe”,

home_bundle => setup_home_dir(“joe”);

}

Page 6: What is new in CFEngine 3.6

TLS protocol

Page 7: What is new in CFEngine 3.6

TLS protocol

• Industry standard security protocol• All traffic is fully encrypted• Transparent to the user• Old protocol

• Deprecated, but still supported

• Can be turned off after upgrade is complete

Page 8: What is new in CFEngine 3.6

Math expressions

Page 9: What is new in CFEngine 3.6

Math expressions

• New math evaluation function: eval()• Works on strings• String contains expression to evaluate

• Example: eval(“ceil($(sys.cpus) / 4)”)

• Previously required shell script

Page 10: What is new in CFEngine 3.6

Math expressions

• Accepts common math operators: +, -, *, /

• Some less common ones too: ^, **, %

• Many common math functions• ceil, floor, log10, log2, log, sqrt, sin, cos, tan, asin, acos, atan, abs, step

• Mathematical constants• e, log2e, log10e, ln2, ln10, pi, pi_2, pi_4, 1_pi, 2_pi, 2_srqtpi, sqrt2, sqrt1_2

• SI-units: K, M, G, T, P

Page 11: What is new in CFEngine 3.6

Dynamic inputs

Page 12: What is new in CFEngine 3.6

Dynamic inputs

• 3.5:• Input files can only be defined in promises.cf

• Inconvenient; all file additions require editing promises.cf

• 3.6:• file control bodies can contain input files

• Body can be specified once per file• body file control {

inputs => “input_file.cf”;

}

Page 13: What is new in CFEngine 3.6

Dynamic inputs - Example

• promises.cfbody common control {

inputs => { “input_file.cf” };

}

• input_file.cfbody file control {

inputs => { “nested_input_file.cf” };

}

Page 14: What is new in CFEngine 3.6

New language functions

Page 15: What is new in CFEngine 3.6

New language functions

• findfiles(glob1, glob2, ...)• Returns a list of files that match glob pattern

• makerule(target, sources)• Determines whether target needs to be rebuilt from sources

• Inspired by the Unix make program

• packagesmatching(...)• Returns list of installed packages

• List can be filtered by name, version and architecture

Page 16: What is new in CFEngine 3.6

New language functions

• canonifyuniquely(test)• Convert a string into a legal class name

• Unlike canonify, name is guaranteed to be unique.

• Useful when making class names from a list of files

• bundlesmatching(regex, tag1, ...)• Returns bundles matching criteria

• Result can be used in a methods promise

• Very powerful together with findfiles

Page 17: What is new in CFEngine 3.6

bundlesequence - Example

• bundle common global {

vars:

“policies” slist => findfiles

(“/var/cfengine/inputs/*.cf”);

“bundles” slist => bundlesmatching

(“.*”, “production”);

}

body common control {

inputs => { @(global.policies) };

bundlesequence => { @(global.bundles) };

}

Page 18: What is new in CFEngine 3.6

New language functions

• Plenty of others• data_readstringarray

• data_readstringarrayidx

• datastate

• datatype

• getclassmetatags

• getvariablemetatags

• max

• mean

• mergedata

• min

• parsejson

• readjson

• storejson

• string_downcase

• string_head

• string_length

• string_reverse

• string_tail

• string_upcase

• variablesmatching

• variance

Page 19: What is new in CFEngine 3.6

Tags

Page 20: What is new in CFEngine 3.6

Tags

• Labels that you can attach to bundles and promises

• Certain functions can filter based on tags• bundlesmatching

• classesmatching

• variablesmatching

Page 21: What is new in CFEngine 3.6

Tags - Example

• bundle agent my_bundle {

meta: ### Bundle tags

“tags” => { “experimental” };

vars: ### Variable tags

“db_server” string => “106.54.21.90”,

meta => { “mysql”, “trusted” };

classes: ### Class tags

“experimental” expression => “any”,

meta => { “tier_spec” };

}

Page 22: What is new in CFEngine 3.6

Data containers

Page 23: What is new in CFEngine 3.6

Data containers

• Structured containers (JSON)• “container” data => parsejson('[

{ “user”: “joe”, “groups”: “users” },

{ “user”: “jack”, “groups”: “admins” },

]');

• reports:

“$(container[1][user])”;

• --> R: jack

Page 24: What is new in CFEngine 3.6

Data containers

• Can read JSON files• readjson(filename, maxbytes)

• Or fields from a text file• data_readstringarray

(filename, comment, split, maxentries, maxbytes)

• data_readstringarrayidx

(filename, comment, split, maxentries, maxbytes)

• Convert back to JSON• storejson(data_container)

Page 25: What is new in CFEngine 3.6

Data containers - Example

• records.txt:• joe,/nfs/home/joe,Joe Smith

jack,/home/jack,Jack Jensen

• Resulting JSON after data_readstringarrayidx• [

[ “joe”, “/nfs/home/joe”, “Joe Smith” ],

[ “jack”, “/home/jack”, “Jack Jensen” ]

]

Page 26: What is new in CFEngine 3.6

Data containers - Example

• records.txt:• joe,/nfs/home/joe,Joe Smith

jack,/home/jack,Jack Jensen

• policy.cf:• vars:

“users” data => data_readstringarrayidx

(“records.txt”, “”, “,”, 10, 4000);

“index” slist => getindices(“users”);

users:

“$(users[$(index)][0])”

home_dir => “$(users[$(index)][1])”,

description => “$(users[$(index)][2])”,

policy => “present”;

Page 27: What is new in CFEngine 3.6

File templating

Page 28: What is new in CFEngine 3.6

File templating

• New templating engine: Mustache• Based on the Mustache templating

language• http://mustache.github.io/

Page 29: What is new in CFEngine 3.6

File templating - Example

• promises.cf:• files:

"/etc/motd"

edit_line => motd_edit,

edit_defaults => empty;

}

bundle edit_line motd_edit

{

insert_lines:

“Welcome to this CFEngine managed machine.”;

“This machine pulls policy from $(sys.policy_hub).”;

}

• Result:• Welcome to this CFEngine managed machine.

This machine pulls policy from 10.80.80.1.

Page 30: What is new in CFEngine 3.6

File templating - Example

• promises.cf:• files:

"/etc/motd"

edit_template => "template.mustache",

template_method => "mustache";

• template.mustache:• Welcome to this CFEngine managed machine.

This machine pulls policy from {{vars.sys.policy_hub}}.

• Result:• Welcome to this CFEngine managed machine.

This machine pulls policy from 10.80.80.1.

Page 31: What is new in CFEngine 3.6

Miscellaneous

• cf-serverd allows distinct key/IP/hostname access controls

• New “shortcut” constraint in server policy allows non-absolute paths in copy_from promises

• New log format

• Many new built-in variables:• sys.uptime, sys.masterdir, this.promiser_ppid, ...

• LMDB replaces Tokyo Cabinet as database backend

• Calls to execresult and returnszero are now cached instead of executing repeatedly

Page 32: What is new in CFEngine 3.6

www.cfengine.com

Questions?

Page 33: What is new in CFEngine 3.6

www.cfengine.com

Questions?

• User promises• TLS protocol• Math expressions• Dynamic inputs• New language functions• Tags• Data containers• File templating

Page 34: What is new in CFEngine 3.6

www.cfengine.com

Thank you!