diff --git a/content/blog/infrastructure-as-code-tools/index.md b/content/blog/infrastructure-as-code-tools/index.md new file mode 100644 index 000000000000..5adbeeff2355 --- /dev/null +++ b/content/blog/infrastructure-as-code-tools/index.md @@ -0,0 +1,1028 @@ +--- +title: "Most Effective Infrastructure as Code (IaC) Tools" +date: 2025-05-22 +draft: false +meta_desc: "Complete guide to the most effective IaC tools. Compare Pulumi, Terraform, OpenTofu, AWS CDK, and more to find the perfect solution." +authors: + - asaf-ashirov +tags: + - infrastructure-as-code + - terraform + - aws + - azure + - gcp + - kubernetes + - devops +--- + +Infrastructure as Code (IaC) has evolved beyond simple automation into a fundamental shift toward applying software engineering practices to infrastructure management. By 2025, leading organizations aren't just automating infrastructure—they're treating it as software, complete with testing, version control, code reviews, and continuous integration. + +The divide between teams using traditional infrastructure tools and those embracing modern software engineering approaches has become a critical competitive differentiator. Organizations stuck with limited domain-specific languages and basic templating systems struggle with productivity, reliability, and scalability challenges that modern programming language-based approaches have solved. + +This comprehensive guide examines the most effective infrastructure as code tools available today, providing detailed analysis of 19+ platforms through the lens of software engineering best practices. Whether you're starting fresh with IaC or evaluating alternatives to overcome limitations in your current toolchain, we'll help you navigate this complex landscape and choose solutions that truly bring software engineering to infrastructure. + + + +## What is Infrastructure as Code? + +[Infrastructure as Code (IaC)](/what-is/what-is-infrastructure-as-code/) is an approach to automating the provisioning and management of infrastructure using software engineering principles, approaches, and tools. Rather than manually configuring servers, networks, and cloud resources through user interfaces or command-line tools, IaC enables you to define your entire infrastructure declaratively through code. + +This approach brings the same benefits that have revolutionized software development—version control, automated testing, code reviews, and CI/CD pipelines—to infrastructure management. + +## What Are Infrastructure as Code Tools? + +Infrastructure as Code tools are platforms and frameworks that enable you to define, provision, and manage infrastructure resources through code rather than manual processes. These tools translate your infrastructure definitions into API calls that create, modify, or destroy cloud resources across various providers. + +The most effective IaC tools share several key characteristics: + +- **End-state focus**: Define your desired infrastructure outcome, whether through declarative syntax (like YAML/JSON templates) or imperative languages that express declarative intent +- **Multi-cloud support**: Work across different cloud providers and services +- **State management**: Track the current state of your infrastructure +- **Preview capabilities**: Show what changes will be made before applying them +- **Idempotency**: Safe to run multiple times with consistent results + +## Why Infrastructure as Code Tools Are Essential + +The shift to IaC tools addresses fundamental challenges that manual infrastructure management cannot solve at scale: + +**Eliminates Configuration Drift**: Manual changes lead to inconsistencies between environments. IaC ensures your production, staging, and development environments remain identical, eliminating the notorious "works on my machine" syndrome for infrastructure. + +**Accelerates Deployment Velocity**: Teams can provision complex multi-cloud architectures in minutes instead of weeks. This speed enables faster time-to-market and more frequent, reliable deployments. + +**Enables True Collaboration**: Infrastructure becomes code that teams can review, test, and approve together. This collaborative approach reduces errors and ensures knowledge sharing across the organization. + +**Provides Cost Control**: Automated provisioning and deprovisioning prevents resource sprawl. Teams can easily track infrastructure costs, set budget alerts, and optimize resource usage across environments. + +**Ensures Compliance and Security**: Codified security policies and compliance requirements are automatically enforced across all deployments. Audit trails become automatic, and policy violations are caught before deployment. + +**Guarantees Business Continuity**: Complete infrastructure definitions stored in version control enable rapid disaster recovery. Organizations can reconstruct entire environments from code, minimizing downtime and data loss. + +## Infrastructure as Code Tools Overview + +This guide covers the following infrastructure as code tools and platforms: + +### Core Infrastructure Provisioning Tools + +- **[Pulumi IaC](#pulumi)** - Modern IaC with general-purpose programming languages +- **[Terraform](#terraform)** - The established standard with HCL syntax +- **[OpenTofu](#opentofu)** - Open-source Terraform alternative +- **[AWS CDK](#aws-cloud-development-kit-cdk)** - Cloud Development Kit for AWS +- **[AWS CloudFormation](#aws-cloudformation)** - Native AWS integration +- **[Terragrunt](#terragrunt)** - Terraform orchestration wrapper +- **[Azure Resource Manager (ARM) and Bicep](#azure-resource-manager-arm-and-bicep)** - Azure-native templates and DSL +- **[Google Cloud Infrastructure Manager](#google-cloud-infrastructure-manager)** - Modern GCP IaC with Terraform +- **[Crossplane](#crossplane)** - Kubernetes as universal control plane +- **[Kubernetes Operators](#kubernetes-operators)** - Application-specific controllers +- **[Ansible](#ansible)** - Agentless automation platform +- **[Chef](#chef)** - Ruby-based configuration management +- **[Puppet](#puppet)** - Enterprise configuration management +- **[Salt](#salt)** - Python-based automation + +### Additional Infrastructure Tools + +- **[System Initiative](#system-initiative)** - Next-generation collaborative infrastructure automation +- **[Brainboard](#brainboard---visual-infrastructure-design)** - Visual infrastructure design +- **[Kubernetes](#kubernetes---container-orchestration-platform)** - Container orchestration platform + +### Security and Compliance Tools + +- **[Checkov](#security-scanning-tools)** - Static analysis for IaC security +- **[KICS](#security-scanning-tools)** - Infrastructure security scanning +- **[Terrascan](#security-scanning-tools)** - Compliance violation detection +- **[Trivy](#security-scanning-tools)** - Comprehensive security scanner +- **[Spectral](#security-scanning-tools)** - Policy-as-code platform +- **[TFLint](#linting-and-validation-tools)** - Terraform linting and validation +- **[Aikido Security](#linting-and-validation-tools)** - Application security platform + +## Core Infrastructure as Code Tools + +### Pulumi + +License: Apache 2.0 (Open Source) +Best For: Teams who solve operations problems with a development approach + +Pulumi IaC represents a modern approach to infrastructure as code, fundamentally changing how teams approach infrastructure by enabling the use of general-purpose programming languages like Python, TypeScript, Go, C#, and Java, plus YAML for simpler configurations. Unlike tools that force teams to learn proprietary domain-specific languages (DSLs), Pulumi leverages familiar languages and software engineering practices, providing unprecedented flexibility, powerful abstractions, and seamless integration with existing development workflows. + +Pulumi's approach combines the best of both imperative and declarative paradigms: you use imperative programming languages to define your desired infrastructure state, but the Pulumi engine processes this declaratively to determine what changes are needed to achieve your intended outcome. + +Key Features: + +- **Universal language support**: Use Python, TypeScript, Go, C#, Java, or YAML configurations—no new DSL to learn +- **Any cloud, any architecture**: Deploy to AWS, Azure, Google Cloud, Kubernetes, and 100+ other providers +- **Real programming constructs**: Leverage loops, conditionals, functions, classes, packages, and third-party libraries +- **Superior developer experience**: Full IDE support with IntelliSense, debugging, and refactoring +- **Built-in testing**: Unit and integration testing for infrastructure code +- **Policy as Code**: Enforce compliance and security policies with CrossGuard +- **Component ecosystem**: Rich library of reusable infrastructure components + +Code Example: + +```python +import pulumi +import pulumi_aws as aws +import pulumi_awsx as awsx + +# Create a VPC with automatic subnets +vpc = awsx.ec2.Vpc("main-vpc", + cidr_block="10.0.0.0/16", + number_of_availability_zones=2) + +# Create an ECS cluster +cluster = aws.ecs.Cluster("app-cluster") + +# Create an Application Load Balancer +alb = awsx.elasticloadbalancingv2.ApplicationLoadBalancer("app-alb", + vpc_id=vpc.vpc_id, + subnet_ids=vpc.public_subnet_ids) + +# Deploy a containerized application +service = awsx.ecs.FargateService("app-service", + cluster=cluster.arn, + task_definition_args=awsx.ecs.FargateServiceTaskDefinitionArgs( + container=awsx.ecs.TaskDefinitionContainerDefinitionArgs( + image="nginx:latest", + memory=128, + ports=[awsx.ecs.TaskDefinitionPortMappingArgs( + container_port=80, + target_group=alb.default_target_group + )] + ) + )) + +pulumi.export("vpc_id", vpc.vpc_id) +pulumi.export("service_url", alb.load_balancer.dns_name) +``` + +**Key Strengths:** + +- **General-purpose language support**: Use Python, TypeScript, Go, C#, Java, or YAML without learning new DSLs +- **Software engineering practices**: Full IDE support, comprehensive testing frameworks, debugging capabilities +- **Multi-cloud flexibility**: Native cloud provider SDKs with same-day feature access +- **Incremental adoption**: Migration tools and state integration for gradual transitions +- **Open source licensing**: Apache 2.0 ensures long-term freedom and flexibility + +**Considerations:** + +- **Learning curve**: Teams new to programming may prefer template-based approaches initially +- **Ecosystem maturity**: Smaller community compared to more established tools like Terraform +- **Tool complexity**: Advanced features may require more setup than simpler template systems + +Organizations like Unity, Snowflake, and Starburst have reported significant productivity improvements (80-90% deployment time reductions) when adopting programming language-based approaches, though results vary based on team expertise and use cases. + +### Terraform + +License: Business Source License (BSL) 1.1 (Not Open Source) +Best For: Teams with existing Terraform expertise and established workflows + +[Terraform](/docs/iac/concepts/vs/terraform/) remains one of the most widely adopted IaC tools, using HashiCorp Configuration Language (HCL) to define infrastructure across multiple cloud providers. While its licensing changed to BSL in 2023 (making it no longer open source), it continues to be a popular choice for many organizations with existing Terraform investments. + +However, teams increasingly encounter productivity barriers and scalability challenges with Terraform's approach: + +**Key Strengths:** + +- **Extensive provider ecosystem**: Strong community-maintained provider coverage +- **Established workflows**: Familiar plan-and-apply process for many teams +- **Documentation**: Comprehensive guides and community resources + +**Notable Limitations:** + +- **Proprietary HCL syntax**: Domain-specific language requires learning new DSL, limiting expressiveness compared to general-purpose programming languages +- **Limited programming constructs**: No native loops, functions, or complex logic—workarounds often required +- **Testing gaps**: Integration testing only; no built-in unit or property testing capabilities +- **IDE limitations**: Basic plugins with limited IntelliSense, debugging, or refactoring support +- **State management complexity**: Manual backend configuration and locking setup required for collaboration +- **Provider update delays**: Community-maintained providers may lag weeks or months behind new cloud features + +Code Example: + +```hcl +data "aws_availability_zones" "available" {} + +resource "aws_vpc" "main" { + cidr_block = "10.0.0.0/16" + + tags = { + Name = "main-vpc" + } +} + +resource "aws_subnet" "public" { + count = 2 + vpc_id = aws_vpc.main.id + cidr_block = "10.0.${count.index + 1}.0/24" + availability_zone = data.aws_availability_zones.available.names[count.index] + + tags = { + Name = "public-subnet-${count.index + 1}" + } +} +``` + +### OpenTofu + +License: Mozilla Public License 2.0 +Best For: Teams seeking an open-source Terraform alternative with community governance + +OpenTofu emerged as a fork of Terraform v1.5.x following HashiCorp's license change, maintained by the Linux Foundation. It provides [full compatibility with Terraform](/docs/iac/concepts/vs/opentofu/) while ensuring long-term open-source availability under MPL 2.0 licensing. + +**Key Strengths:** + +- **True open source**: MPL 2.0 license with community governance via Linux Foundation +- **Terraform compatibility**: Drop-in replacement maintaining existing workflows and modules +- **Community-driven development**: Transparent roadmap and contribution process + +**Inherited Limitations from Terraform:** + +- **Same HCL constraints**: Still requires learning proprietary DSL instead of leveraging existing programming language skills +- **Limited programming constructs**: No native support for complex logic, loops, or functions found in general-purpose languages +- **Testing limitations**: Integration testing only; lacks unit and property testing capabilities +- **IDE experience**: Basic tooling support compared to full programming language ecosystems +- **Provider update dependencies**: Relies on community maintenance for cloud provider feature updates + +While OpenTofu addresses Terraform's licensing concerns, teams still face the fundamental productivity and scalability challenges inherent in HCL-based approaches. + +Code Example: + +```hcl +resource "aws_instance" "web" { + ami = "ami-0c55b159cbfafe1d0" + instance_type = "t3.micro" + + tags = { + Name = "HelloWorld" + } +} + +output "instance_ip" { + value = aws_instance.web.public_ip +} +``` + +### AWS Cloud Development Kit (CDK) + +License: Apache 2.0 +Best For: AWS-focused teams who prefer programming languages over templates + +AWS CDK allows you to define AWS infrastructure using familiar programming languages, synthesizing CloudFormation templates for deployment while providing higher-level abstractions. CDK addresses many limitations of traditional template-based approaches by enabling general-purpose programming languages. + +**Key Strengths:** + +- **General-purpose programming languages**: TypeScript, Python, Java, C#, Go support with full IDE integration +- **AWS-optimized constructs**: High-level components encapsulating AWS best practices +- **Type safety**: Compile-time checking and IntelliSense support +- **CloudFormation reliability**: Built on AWS's proven deployment engine + +**Notable Limitations:** + +- **AWS-only ecosystem**: Locked into single cloud provider, limiting multi-cloud strategies +- **CloudFormation constraints**: Inherits template size limits and deployment restrictions +- **Vendor lock-in**: Deep AWS integration makes migration to other clouds challenging +- **Limited cross-cloud consistency**: Teams need different tools and approaches for multi-cloud deployments + +CDK represents a significant improvement over CloudFormation templates but constrains organizations to AWS-only infrastructure strategies. + +Code Example: + +```typescript +import * as cdk from 'aws-cdk-lib'; +import * as ec2 from 'aws-cdk-lib/aws-ec2'; +import * as ecs from 'aws-cdk-lib/aws-ecs'; +import { Construct } from 'constructs'; + +export class MyStack extends cdk.Stack { + constructor(scope: Construct, id: string, props?: cdk.StackProps) { + super(scope, id, props); + + const vpc = new ec2.Vpc(this, 'MyVpc', { + maxAzs: 2 + }); + + const cluster = new ecs.Cluster(this, 'MyCluster', { + vpc: vpc + }); + + const taskDefinition = new ecs.FargateTaskDefinition(this, 'TaskDef', { + memoryLimitMiB: 512, + cpu: 256 + }); + + taskDefinition.addContainer('web', { + image: ecs.ContainerImage.fromRegistry('nginx:latest'), + portMappings: [{ containerPort: 80 }] + }); + + new ecs.FargateService(this, 'MyService', { + cluster: cluster, + taskDefinition: taskDefinition + }); + } +} +``` + +### AWS CloudFormation + +License: Proprietary (AWS Service) +Best For: AWS-only deployments requiring deep service integration + +AWS CloudFormation provides the foundation for infrastructure as code on AWS, offering native integration with all AWS services and deep platform-specific features. + +**Pulumi Integration**: Pulumi provides native AWS providers that offer the same comprehensive AWS service coverage as CloudFormation, with the added benefit of using general-purpose programming languages. You can also import existing CloudFormation stacks into Pulumi for gradual migration or hybrid management approaches. + +Key Features: + +- **AWS-native**: First-party support for all AWS services +- **JSON/YAML templates**: Declarative resource definitions +- **Stack management**: Organized resource grouping and lifecycle management +- **Change sets**: Preview infrastructure changes before deployment +- **Service integration**: Deep integration with other AWS services + +Code Example: + +```yaml +AWSTemplateFormatVersion: '2010-09-09' +Resources: + MyVPC: + Type: AWS::EC2::VPC + Properties: + CidrBlock: 10.0.0.0/16 + EnableDnsHostnames: true + Tags: + - Key: Name + Value: MyVPC + + MySubnet: + Type: AWS::EC2::Subnet + Properties: + VpcId: !Ref MyVPC + CidrBlock: 10.0.1.0/24 + AvailabilityZone: !Select [0, !GetAZs ''] +``` + +### Terragrunt + +License: MIT +Best For: Complex Terraform deployments requiring advanced orchestration + +Terragrunt acts as a wrapper around Terraform, providing additional functionality for managing complex, multi-environment Terraform deployments with reduced code duplication. + +Key Features: + +- **DRY configurations**: Eliminate repetitive Terraform code +- **Dependency management**: Handle complex module dependencies +- **Remote state management**: Automated backend configuration +- **Environment management**: Consistent configurations across environments + +Code Example: + +```hcl +# terragrunt.hcl +terraform { + source = "git::git@github.com:foo/modules.git//app?ref=v0.0.3" +} + +include { + path = find_in_parent_folders() +} + +inputs = { + instance_count = 3 + instance_type = "t3.micro" +} +``` + +### Azure Resource Manager (ARM) and Bicep + +License: Proprietary (Microsoft Service) / MIT (Bicep) +Best For: Azure-focused deployments requiring native platform integration + +Azure Resource Manager provides the native infrastructure as code solution for Microsoft Azure, offering comprehensive support for Azure services through ARM templates. Azure Bicep serves as a more readable domain-specific language (DSL) that compiles to ARM templates, providing a cleaner syntax while maintaining full ARM compatibility. + +**Pulumi Integration**: Pulumi's native Azure providers offer equivalent comprehensive Azure service coverage with general-purpose programming languages. Both ARM templates and Bicep deployments can be imported into Pulumi, and you can reference ARM deployments from Pulumi programs for hybrid scenarios. + +Key Features: + +- **Azure-native**: Complete Azure service coverage +- **Multiple syntaxes**: JSON templates (ARM) or Bicep DSL for improved readability +- **Resource groups**: Logical organization of related resources +- **Deployment modes**: Complete or incremental deployment options +- **ARM compilation**: Bicep compiles to ARM templates for deployment + +Code Example: + +```json +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "resources": [ + { + "type": "Microsoft.Storage/storageAccounts", + "apiVersion": "2023-01-01", + "name": "mystorageaccount", + "location": "[resourceGroup().location]", + "sku": { + "name": "Standard_LRS" + }, + "kind": "StorageV2" + } + ] +} +``` + +### Google Cloud Infrastructure Manager + +License: Proprietary (Google Service) +Best For: Google Cloud Platform deployments using Terraform + +Google Cloud Infrastructure Manager automates the deployment and management of Google Cloud infrastructure resources using Terraform configurations, representing Google's modern approach to infrastructure as code. Infrastructure Manager replaces the deprecated Google Cloud Deployment Manager (which reaches end of support on December 31, 2025). + +Key Features: + +- **Terraform-based**: Uses standard Terraform configurations declaratively +- **Automated workflows**: Handles Terraform init, validate, and apply operations +- **Version control integration**: Supports Git repositories and Cloud Storage +- **Deployment tracking**: Comprehensive metadata storage and logging +- **Multiple Terraform versions**: Flexibility in Terraform version selection +- **Cloud Build integration**: Leverages Google Cloud Build for execution environment +- **Migration path**: Provides upgrade path from legacy Cloud Deployment Manager + +Code Example: + +```hcl +# main.tf - Terraform configuration for Infrastructure Manager +resource "google_compute_instance" "vm_instance" { + name = "my-vm" + machine_type = "e2-medium" + zone = "us-central1-a" + + boot_disk { + initialize_params { + image = "debian-cloud/debian-11" + } + } + + network_interface { + network = "default" + access_config { + // Ephemeral public IP + } + } + + metadata = { + startup-script = "echo Hello from Infrastructure Manager!" + } +} + +output "instance_ip" { + value = google_compute_instance.vm_instance.network_interface[0].access_config[0].nat_ip +} +``` + +### Crossplane + +License: Apache 2.0 +Best For: Kubernetes-first organizations managing multi-cloud infrastructure + +Crossplane is a Cloud-Native Framework for Platform Engineering that extends Kubernetes to help organizations build custom infrastructure management platforms, allowing teams to provision and manage cloud resources using Kubernetes APIs and patterns. + +**Pulumi Integration**: Pulumi offers the Pulumi Kubernetes Operator (PKO) that provides similar Kubernetes-native infrastructure management capabilities, plus support for YAML-based definitions. Teams can also use Pulumi programs to provision the underlying infrastructure that Crossplane manages, creating layered infrastructure management approaches. + +Key Features: + +- **Kubernetes-native**: Uses CRDs and standard Kubernetes patterns +- **Composite resources**: Create higher-level infrastructure abstractions +- **GitOps compatibility**: Seamless integration with GitOps workflows +- **Multi-cloud support**: Provision resources across cloud providers +- **Policy integration**: Leverage Kubernetes RBAC and admission controllers + +Code Example: + +```yaml +apiVersion: ec2.aws.crossplane.io/v1alpha1 +kind: VPC +metadata: + name: sample-vpc +spec: + cidrBlock: 10.0.0.0/16 + region: us-east-1 + tags: + Name: sample-vpc + providerConfigRef: + name: aws-provider-config +``` + +### Kubernetes Operators + +License: Various (typically Apache 2.0) +Best For: Kubernetes-native application lifecycle management + +Kubernetes Operators extend the Kubernetes API to manage complex applications and infrastructure using custom resources and controllers that encode operational knowledge. + +Key Features: + +- **Custom resources**: Application-specific APIs and abstractions +- **Controller patterns**: Automated reconciliation and self-healing +- **Operator Hub**: Community marketplace for operators +- **Lifecycle management**: Automated installation, updates, and maintenance + +Code Example: + +```yaml +apiVersion: postgresql.cnpg.io/v1 +kind: Cluster +metadata: + name: postgres-cluster +spec: + instances: 3 + postgresql: + parameters: + max_connections: "200" + shared_buffers: "256MB" + bootstrap: + initdb: + database: app + owner: app +``` + +### Ansible + +License: GPL v3 +Best For: Configuration management with infrastructure provisioning capabilities + +Ansible provides both configuration management and infrastructure provisioning through its agentless architecture and simple YAML-based playbooks. + +**Pulumi Integration**: Rather than competing with Ansible, Pulumi complements it perfectly. Use Pulumi for infrastructure provisioning and Ansible for configuration management. Pulumi's Command provider can execute Ansible playbooks as part of your infrastructure deployment, and many Pulumi customers use both tools together for comprehensive infrastructure automation. [See example: Deploy WordPress to AWS using Pulumi and Ansible](/blog/deploy-wordpress-aws-pulumi-ansible/). + +Key Features: + +- **Agentless architecture**: No software installation required on target systems +- **YAML playbooks**: Human-readable automation definitions +- **Idempotent operations**: Safe to run multiple times +- **Large module library**: Extensive built-in functionality for various systems +- **Push-based execution**: Centralized control and execution + +Code Example: + +```yaml +--- +- name: Provision AWS infrastructure + hosts: localhost + tasks: + - name: Create VPC + amazon.aws.ec2_vpc_net: + name: ansible-vpc + cidr_block: 10.0.0.0/16 + region: us-east-1 + tags: + Environment: production + register: vpc + + - name: Create subnet + amazon.aws.ec2_vpc_subnet: + vpc_id: "{{ vpc.vpc.id }}" + cidr: 10.0.1.0/24 + region: us-east-1 + tags: + Name: ansible-subnet +``` + +### Chef + +License: Apache 2.0 +Best For: Complex configuration management scenarios requiring programmable logic + +Chef provides configuration management and infrastructure automation using Ruby-based recipes and cookbooks, offering powerful programmability for complex scenarios. + +Key Features: + +- **Ruby DSL**: Full programming language for configuration logic +- **Agent-based architecture**: Continuous compliance and drift detection +- **Cookbook ecosystem**: Reusable configuration patterns and community recipes +- **Test Kitchen**: Infrastructure testing and validation framework +- **Enterprise features**: Advanced reporting and compliance capabilities + +Code Example: + +```ruby +# cookbook/recipes/default.rb +package 'nginx' do + action :install +end + +service 'nginx' do + action [:enable, :start] +end + +template '/etc/nginx/sites-available/default' do + source 'default.erb' + owner 'root' + group 'root' + mode '0644' + notifies :restart, 'service[nginx]' +end +``` + +### Puppet + +License: Apache 2.0 +Best For: Enterprise environments requiring strong governance and compliance + +Puppet offers enterprise-grade configuration management with a focus on compliance, governance, and declarative system state management. + +Key Features: + +- **Declarative language**: Puppet DSL for describing desired system state +- **Compliance reporting**: Built-in governance and audit capabilities +- **Forge marketplace**: Community modules and enterprise content +- **Enterprise support**: Professional services and enterprise features +- **Continuous enforcement**: Ongoing configuration compliance monitoring + +Code Example: + +```puppet +# manifests/webserver.pp +class webserver { + package { 'nginx': + ensure => installed, + } + + service { 'nginx': + ensure => running, + enable => true, + require => Package['nginx'], + } + + file { '/var/www/html/index.html': + ensure => file, + content => '