en-US/about_PSRule_Rules.help.txt

TOPIC
    about_psrule_rules
 
SHORT DESCRIPTION
    Describes PSRule rules including how to use and author them.
 
LONG DESCRIPTION
    PSRule executes rules to validate an object from input either from a file or
    PowerShell pipeline. The PowerShell pipeline only available when running
    PSRule directly. PSRule can also be run from a continuous integration (CI)
    pipeline or Visual Studio Code. When using these methods, the PowerShell
    pipeline is not available.
    To evaluate an object PSRule can use rules defined in script or YAML.
    When using script rules:
    - Each rule is defined PowerShell within a `.Rule.ps1` file by using a
    `Rule` block.
    - PowerShell variables, functions, and cmdlets can be used just like regular
    PowerShell scripts.
    - Built-in assertion helpers can be used to quickly build out rules.
    - Pre-conditions can be defined with using a script block, type binding, or
    YAML-based selector.
    To learn more about assertion helpers see
    about_PSRule_Assert
    .
    When using YAML rules:
    - Each rule is defined in a `.Rule.yaml` file by using the `Rule` resource.
    - YAML-based expressions can be used.
    - Pre-conditions can be defined with using a type binding, or YAML-based selector.
    To learn more about YAML-based expressions see
    about_PSRule_Expressions
    .
 
    USING PRE-CONDITIONS
    Pre-conditions are used to determine if a rule should be executed. While
    pre-conditions are not required for each rule, it is a good practice to
    define them. If a rule does not specify a pre-condition it may be executed
    against an object it does not expect.
    Pre-conditions come in three forms:
    - Script - A PowerShell script block that is executed and if true will cause
    the rule to be executed. Script block pre-conditions only work with script
    rules. To use a script block pre-condition, specify the `-If` script
    parameter on the `Rule` block. - Type - A type string that is compared
    against the bound object type. When the type matches the rule will be
    executed. To use a type pre-conditions, specify the `-Type` script
    parameter or `type` YAML/JSON property. - Selector - A YAML/JSON based
    expression that is evaluated against the object. When the expression
    matches the rule will be executed. To use a selector pre-conditions,
    specify the `-With` script parameter or `with` YAML/JSON property.
    Different forms of pre-conditions can be combined. When combining
    pre-conditions, different forms must be all true (logical AND). i.e. Script
    AND Type AND Selector must be all be true for the rule to be executed.
    Multiple Type and Selector pre-conditions can be specified. If multiple Type
    and Selector pre-conditions are specified, only one must be true (logical OR).
    For example:
 
    # Synopsis: An example script rule with pre-conditions.
    Rule 'ScriptRule' -If { $True } -Type 'CustomType1', 'CustomType2' -With 'Selector.1', 'Selector.2' {
        # Rule condition
    }
 
```yaml
SYNOPSIS: AN EXAMPLE YAML RULE WITH PRE-CONDITIONS.
    apiVersion: github.com/microsoft/PSRule/v1 kind: Rule metadata: name:
    'YamlRule' spec: type: - 'CustomType1' - 'CustomType2' with: -
    'Selector.1' - 'Selector.2' condition: { }
 
     
 
    jsonc [ { // Synopsis: An example YAML rule with pre-conditions.
    "apiVersion": "github.com/microsoft/PSRule/v1", "kind": "Rule",
    "metadata": { "name": "YamlRule" }, "spec": { "type": [
           "CustomType1", "CustomType2" ], "with": [
    "Selector.1", "Selector.2" ], "condition": {} } }
    ]
 
    Pre-conditions are evaluated in the following order: Selector, Type, then Script.
     
    ### Defining script rules
     
    To define a script rule use the `Rule` keyword followed by a name and a pair of squiggly brackets `{`.
    Within the `{ }` one or more conditions can be used.
    Script rule must be defined within `.Rule.ps1` files.
    Multiple rules can be defined in a single file by creating multiple `Rule` blocks.
    Rule blocks can not be nested within each other.
     
    Within the `Rule` block, define one or more conditions to determine pass or fail of the rule.
     
    Syntax:
 
    text Rule [-Name] <string> [-Tag <hashtable>] [-When <string[]>] [-Type
    <string[]>] [-If <scriptBlock>] [-DependsOn <string[]>] [-Configure
    <hashtable>] [-ErrorAction <ActionPreference>] [-Body] { ... }
 
    Example:
 
    powershell
 
SYNOPSIS: USE A STANDARD LOAD-BALANCER WITH AKS CLUSTERS.
    Rule 'Azure.AKS.StandardLB' -Type
    'Microsoft.ContainerService/managedClusters' -Tag @{ release = 'GA'; ruleSet
    = '2020_06' } { $Assert.HasFieldValue($TargetObject,
    'Properties.networkProfile.loadBalancerSku', 'standard'); }
 
    ### Defining YAML rules
     
    To define a YAML rule use the `Rule` resource in a YAML file.
    Each rule must be defined within a `.Rule.yaml` file following a standard schema.
    Multiple rules can be defined in a single YAML file by separating each rule with a `---`.
     
    Within the `Rule` resource, the `condition` property specifies conditions to pass or fail the rule.
     
    Syntax:
 
yaml
SYNOPSIS: {{ SYNOPSIS }}
    apiVersion: github.com/microsoft/PSRule/v1 kind: Rule metadata: name: '{{
    Name }}' tags: { } spec: type: [ ] with: [ ] condition: { }
 
    Example:
 
yaml
SYNOPSIS: USE A STANDARD LOAD-BALANCER WITH AKS CLUSTERS.
    apiVersion: github.com/microsoft/PSRule/v1 kind: Rule metadata: name:
    'Azure.AKS.StandardLB' tags: release: 'GA' ruleSet: '2020_06'
    spec: type: - Microsoft.ContainerService/managedClusters condition:
     field: 'Properties.networkProfile.loadBalancerSku' equals: 'standard'
 
    ### Defining JSON rules
     
    To define a JSON rule use the `Rule` resource in a JSON file.
    Each rule must be defined within a `.Rule.jsonc` file following a standard schema.
    One or more rules can be defined in a single JSON array separating each rule in a JSON object.
     
    Within the `Rule` resource, the `condition` property specifies conditions to pass or fail the rule.
     
    Rules can also be defined within `.json` files.
    We recommend using `.jsonc` to view [JSON with Comments](https://code.visualstudio.com/docs/languages/json#_json-with-comments) in Visual Studio Code.
     
    Syntax:
 
    jsonc [ { // Synopsis: {{ Synopsis }} "apiVersion":
    "github.com/microsoft/PSRule/v1", "kind": "Rule", "metadata": {
     "name": "{{ Name }}", "tags": {} }, "spec": { "type":
    [], "with": [], "condition": {} } } ]
 
    Example:
 
    jsonc [ { // Synopsis: Use a Standard load-balancer with AKS clusters.
        "apiVersion": "github.com/microsoft/PSRule/v1", "kind": "Rule",
    "metadata": { "name": "Azure.AKS.StandardLB", "tags": {
    "release": "GA", "ruleSet": "2020_06" } }, "spec": {
        "type": [ "Microsoft.ContainerService/managedClusters" ],
         "condition": { "field":
    "Properties.networkProfile.loadBalancerSku", "equals": "standard"
       } } } ] ```
 
NOTE
    An online version of this document is available at
    https://microsoft.github.io/PSRule/v2/concepts/PSRule/en-US/about_PSRule_Rules/.
 
SEE ALSO
    -
    Invoke-PSRule
 
KEYWORDS
    - Rules
- Expressions
- PSRule