A cross-platform module to validate infrastructure as code (IaC) and objects using PowerShell rules. PSRule works great and integrates with popular continuous integration (CI) systems.
Features of PSRule include:
This project uses GitHub Issues to track bugs and feature requests. Please search the existing issues before filing new issues to avoid duplicates.
Support for this project/ product is limited to the resources listed above.
You can download and install the PSRule module from the PowerShell Gallery.
Module | Description | Downloads / instructions |
---|---|---|
PSRule | Validate infrastructure as code (IaC) and objects using PowerShell rules. | latest / instructions |
For rule and integration modules see related projects.
Companion extensions are available for the following platforms.
Platform | Description | Downloads / instructions |
---|---|---|
Azure Pipelines | Validate infrastructure as code (IaC) and DevOps repositories using Azure Pipelines. | latest / instructions |
GitHub Actions | Validate infrastructure as code (IaC) and DevOps repositories using GitHub Actions. | latest / instructions |
Visual Studio Code | Visual Studio Code extension for PSRule. | latest / instructions |
The following example shows basic PSRule usage for validating PowerShell objects. For specific use cases see scenarios.
For frequently asked questions, see the FAQ.
To define a rule, use a Rule
block saved to a file with the .Rule.ps1
extension.
Rule 'NameOfRule' {
# Rule conditions
}
Within the body of the rule provide one or more conditions.
A condition is valid PowerShell that results in $True
or $False
.
For example:
Rule 'isFruit' {
# Condition to determine if the object is fruit
$TargetObject.Name -in 'Apple', 'Orange', 'Pear'
}
An optional result message can be added to by using the Recommend
keyword.
Rule 'isFruit' {
# An recommendation to display in output
Recommend 'Fruit is only Apple, Orange and Pear'
# Condition to determine if the object is fruit
$TargetObject.Name -in 'Apple', 'Orange', 'Pear'
}
The rule is saved to a file named isFruit.Rule.ps1
file.
One or more rules can be defined within a single file.
To execute the rule use Invoke-PSRule
.
For example:
# Define objects to validate
$items = @();
$items += [PSCustomObject]@{ Name = 'Fridge' };
$items += [PSCustomObject]@{ Name = 'Apple' };
# Validate each item using rules saved in current working path
$items | Invoke-PSRule;
The output of this example is:
TargetName: Fridge
RuleName Outcome Recommendation
-------- ------- --------------
isFruit Fail Fruit is only Apple, Orange and Pear
TargetName: Apple
RuleName Outcome Recommendation
-------- ------- --------------
isFruit Pass Fruit is only Apple, Orange and Pear
To filter results to only non-fruit results, use Invoke-PSRule -Outcome Fail
.
Passed, failed and error results are shown by default.
# Only show non-fruit results
$items | Invoke-PSRule -Outcome Fail;
For a summary of results for each rule use Invoke-PSRule -As Summary
.
For example:
# Show rule summary
$items | Invoke-PSRule -As Summary;
The output of this example is:
RuleName Pass Fail Outcome
-------- ---- ---- -------
isFruit 1 1 Fail
An optional failure reason can be added to the rule block by using the Reason
keyword.
Rule 'isFruit' {
# An recommendation to display in output
Recommend 'Fruit is only Apple, Orange and Pear'
# An failure reason to display for non-fruit
Reason "$($PSRule.TargetName) is not fruit."
# Condition to determine if the object is fruit
$TargetObject.Name -in 'Apple', 'Orange', 'Pear'
}
To include the reason with output use Invoke-PSRule -OutputFormat Wide
.
For example:
# Show failure reason for failing results
$items | Invoke-PSRule -OutputFormat Wide;
The output of this example is:
TargetName: Fridge
RuleName Outcome Reason Recommendation
-------- ------- ------ --------------
isFruit Fail Fridge is not fruit. Fruit is only Apple, Orange and Pear
TargetName: Apple
RuleName Outcome Reason Recommendation
-------- ------- ------ --------------
isFruit Pass Fruit is only Apple, Orange and Pear
The final rule is saved to isFruit.Rule.ps1
.
For walk through examples of PSRule usage see:
PSRule extends PowerShell with domain specific language (DSL) keywords, cmdlets and automatic variables.
The following language keywords are used by the PSRule
module:
The following commands exist in the PSRule
module:
The following conceptual topics exist in the PSRule
module:
PSRule uses the following schemas:
The following projects use or integrate with PSRule.
Name | Description |
---|---|
PSRule.Rules.Azure | A suite of rules to validate Azure resources and infrastructure as code (IaC) using PSRule. |
PSRule.Rules.Kubernetes | A suite of rules to validate Kubernetes resources using PSRule. |
PSRule.Rules.CAF | A suite of rules to validate Azure resources against the Cloud Adoption Framework (CAF) using PSRule. |
PSRule.Rules.GitHub | A suite of rules to validate GitHub repositories using PSRule. |
PSRule.Rules.MSFT.OSS | A suite of rules to validate repositories against Microsoft Open Source Software (OSS) requirements. |
PSRule.Monitor | Send and query PSRule analysis results in Azure Monitor. |
PSRule-pipelines | Validate infrastructure as code (IaC) and DevOps repositories using Azure Pipelines. |
ps-rule | Validate infrastructure as code (IaC) and DevOps repositories using GitHub Actions. |
PSRule-vscode | Visual Studio Code extension for PSRule. |
Modules in this repository use semantic versioning to declare breaking changes. For a list of module changes please see the change log.
Pre-release module versions are created on major commits and can be installed from the PowerShell Gallery. Pre-release versions should be considered experimental. Modules and change log details for pre-releases will be removed as stable releases are made available.
This project welcomes contributions and suggestions. If you are ready to contribute, please visit the contribution guide.
This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact [email protected] with any additional questions or comments.
This project is licensed under the MIT License.