Target objects
The Target
object represents a target and its specific
connection options.
The state of a target is stored in the code for the duration of a plan, allowing you to collect facts or set variables for a target and retrieve them later. Target objects must reference a target in the PE inventory. This includes targets connected via the PCP protocol that have puppet-agent installed, or targets in the PE inventory added with either SSH or WinRM credentials or as network devices. Target objects in PE do not have control over their connection information, and the connection info cannot be changed from within a plan.
Because target objects in PE are references, and cannot control their own configuration, accessing target connection info will return empty data.
TargetSpec
The TargetSpec
type is a wrapper for defining targets that
allows you to pass a target, or multiple targets, into a plan. Use TargetSpec
for plans that accept a set of targets as a parameter to ensure clean
interaction with the CLI and other plans.
TargetSpec
accepts strings allowed by --targets
, a single target object, or an array of targets and
target patterns. To operate on an individual target, resolve the target to a list via
get_targets
.
For example, to loop over each target in a plan, accept a TargetSpec
argument, but call get_targets
on it
before looping.
plan loop(TargetSpec $targets) { get_targets($targets).each |$target| { run_task('my_task', $target) } }
Set variables and facts on targets
You can use the $target.facts()
and $target.vars()
functions to set transport configuration values, variables, and
facts from a plan. Facts come from running facter
or another
fact collection application on the target, or from a fact store like PuppetDB. Variables are computed externally or assigned
directly.
For example, set variables in a plan using $target.set_var
:
plan vars(String $host) { $target = get_targets($host)[0] $target.set_var('newly_provisioned', true) $targetvars = $target.vars run_command("echo 'Vars for ${host}: ${$targetvars}'", $host) }
Or set variables in the inventory file using the vars
key
at the group level.
groups: - name: my_targets targets: - localhost vars: operatingsystem: windows config: transport: ssh
Collect facts from targets
The facts
plan connects to targets,discovers facts, and
stores these facts on the targets.
The plan uses these methods to collect facts:
- On
ssh
targets, it runs a Bash script. - On
winrm
targets, it runs a PowerShell script. - On
pcp
or targets where the Puppet agent is present, it runs Facter.
For example, use the facts
plan to collect facts and then
uses those facts to decide which task to run on the
targets.
plan run_with_facts(TargetSpec $targets) { # This collects facts on targets and update the inventory run_plan(facts, targets => $targets) $centos_targets = get_targets($targets).filter |$n| { $n.facts['os']['name'] == 'CentOS' } $ubuntu_targets = get_targets($targets).filter |$n| { $n.facts['os']['name'] == 'Ubuntu' } run_task(centos_task, $centos_targets) run_task(ubuntu_task, $ubuntu_targets) }
Collect facts from PuppetDB
You can use the puppetdb_fact
plan to collect facts for
targets when they are running a Puppet agent and sending
facts to PuppetDB.
For example, use the puppetdb_fact
plan to collect facts,
and then use those facts to decide which task to run on the targets.
plan run_with_facts(TargetSpec $targets) { # This collects facts on targets and update the inventory run_plan(puppetdb_fact, targets => $targets) $centos_targets = get_targets($targets).filter |$n| { $n.facts['os']['name'] == 'CentOS' } $ubuntu_targets = get_targets($targets).filter |$n| { $n.facts['os']['name'] == 'Ubuntu' } run_task(centos_task, $centos_targets) run_task(ubuntu_task, $ubuntu_targets) }
Collect general data from PuppetDB
You can use the puppetdb_query
function in plans to make direct queries to
PuppetDB.
For example, you can discover targets from PuppetDB and then run tasks on them. You must configure the PuppetDB client before running it. See the PQL tutorial to learn how to structure pql queries and see the PQL reference guide for query examples.
plan pdb_discover { $result = puppetdb_query("inventory[certname] { app_role == 'web_server' }") # extract the certnames into an array $names = $result.map |$r| { $r["certname"] } # wrap in url. You can skip this if the default transport is pcp $targets = $names.map |$n| { "pcp://${n}" } run_task('my_task', $targets) }