Infrastructure Agents
Agents for managing, provisioning, monitoring, and optimizing infrastructure: cloud, Kubernetes, networking, and security.
Infrastructure Agent Capabilities
| Capability | Description | Tools |
|---|---|---|
| Provisioning | Create, update, destroy resources | Terraform, Pulumi, CloudFormation, CDK |
| Configuration | Manage config, secrets, policies | Ansible, Chef, Puppet, Salt |
| Orchestration | Deploy, scale, rollback | Kubernetes, Nomad, ECS, Docker Swarm |
| Monitoring | Metrics, logs, traces, alerts | Prometheus, Grafana, Datadog, Honeycomb |
| Networking | DNS, load balancing, mesh, policies | Istio, Linkerd, Cilium, Envoy |
| Security | Compliance, scanning, hardening | Trivy, Falco, OPA, Kyverno |
| Cost Optimization | Rightsizing, scheduling, spot | Kubecost, CloudHealth, Finout |
| Disaster Recovery | Backup, restore, failover | Velero, Restic, Crossplane |
| GitOps | Declarative, automated sync | ArgoCD, Flux, Fleet |
| Policy Enforcement | Admission, validation, mutation | OPA, Kyverno, Gatekeeper |
Infrastructure Agent Architectures
1. Infrastructure Provisioning Agent
class InfraProvisioningAgent:
def __init__(self):
self.terraform = TerraformExecutor()
self.pulumi = PulumiExecutor()
self.state = StateManager()
async def provision(self, spec: ProvisionSpec) -> ProvisionResult:
# 1. Generate IaC
if spec.tool == "terraform":
code = await self.generate_terraform(spec)
result = await self.terraform.apply(code)
elif spec.tool == "pulumi":
code = await self.generate_pulumi(spec)
result = await self.pulumi.up(code)
# 2. Validate
validation = await self.validate(result, spec)
# 3. Post-provision
await self.post_provision(result, spec)
return ProvisionResult(
resources=result.resources,
outputs=result.outputs,
state=result.state
)
async def generate_terraform(self, spec: ProvisionSpec) -> str:
# Use templates + variables
template = self.load_template(spec.template)
return template.render(
provider=spec.provider,
region=spec.region,
resources=spec.resources,
variables=spec.variables
)
2. Kubernetes Management Agent
class K8sManagementAgent:
def __init__(self, kubeconfig: str = None):
self.k8s = KubernetesClient(kubeconfig)
self.helm = HelmClient()
self.kustomize = KustomizeClient()
async def deploy(self, spec: DeploymentSpec) -> DeploymentResult:
# 1. Build manifests
if spec.method == "helm":
manifests = await self.helm.template(spec.chart, spec.values)
elif spec.method == "kustomize":
manifests = await self.kustomize.build(spec.overlay)
else:
manifests = spec.manifests
# 2. Apply with Server-Side Apply
result = await self.k8s.apply(manifests, server_side=True)
# 3. Wait for rollout
await self.wait_for_rollout(spec.namespace, spec.selector)
return DeploymentResult(
resources=result.resources,
status=await self.get_status(spec.namespace, spec.selector)
)
async def scale(self, deployment: str, namespace: str, replicas: int) -> ScaleResult:
await self.k8s.patch_deployment(deployment, namespace, {"spec": {"replicas": replicas}})
return await self.wait_for_replicas(deployment, namespace, replicas)
async def rollback(self, deployment: str, namespace: str, revision: int = None) -> RollbackResult:
if revision:
await self.k8s.rollback(deployment, namespace, revision)
else:
await self.k8s.rollback(deployment, namespace)
return await self.wait_for_rollback(deployment, namespace)
3. GitOps Agent
class GitOpsAgent:
def __init__(self):
self.argocd = ArgoCDClient()
self.flux = FluxClient()
async def sync_application(self, app_name: str) -> SyncResult:
return await self.argocd.sync(app_name)
async def create_application(self, spec: ApplicationSpec) -> Application:
return await self.argocd.create_app(Application(
metadata={"name": spec.name, "namespace": "argocd"},
spec=ApplicationSpec(
project=spec.project,
source=ApplicationSource(
repo_url=spec.repo_url,
path=spec.path,
target_revision=spec.revision
),
destination=ApplicationDestination(
server=spec.cluster_url,
namespace=spec.namespace
),
sync_policy=SyncPolicy(
automated=SyncPolicyAutomated(
prune=spec.auto_prune,
self_heal=spec.self_heal
),
sync_options=spec.sync_options
)
)
async def get_app_status(self, app_name: str) -> ApplicationStatus:
return await self.argocd.get_app(app_name)
4. Network & Service Mesh Agent
class NetworkMeshAgent:
def __init__(self):
self.istio = IstioClient()
self.cilium = CiliumClient()
self.gateway = GatewayAPIClient()
async def configure_mtls(self, namespace: str, mode: MTLSMode) -> MTLSResult:
if self.istio:
return await self.istio.configure_mtls(namespace, mode)
elif self.cilium:
return await self.cilium.configure_mtls(namespace, mode)
async def configure_traffic_split(self, spec: TrafficSplitSpec) -> TrafficSplitResult:
return await self.istio.configure_virtual_service(spec)
async def configure_authorization(self, spec: AuthzSpec) -> AuthzResult:
return await self.istio.create_authorization_policy(spec)
async def configure_gateway(self, spec: GatewaySpec) -> GatewayResult:
return await self.gateway.create_gateway(spec)
Cloud Provider Agents
AWS Agent
class AWSAgent:
def __init__(self, region: str = "us-east-1"):
self.session = boto3.Session(region_name=region)
self.cloudformation = self.session.client("cloudformation")
self.ec2 = self.session.client("ec2")
self.ecs = self.session.client("ecs")
self.eks = self.session.client("eks")
self.lambda_client = self.session.client("lambda")
self.s3 = self.session.client("s3")
self.rds = self.session.client("rds")
self.iam = self.session.client("iam")
async def deploy_stack(self, template: str, params: dict) -> StackResult:
response = await self.cloudformation.create_stack(
StackName=f"stack-{uuid4()}",
TemplateBody=template,
Parameters=[{"ParameterKey": k, "ParameterValue": v} for k, v in params.items()],
Capabilities=["CAPABILITY_IAM", "CAPABILITY_NAMED_IAM"]
)
return await self.wait_for_stack(response["StackId"])
async def create_eks_cluster(self, spec: EKSSpec) -> ClusterResult:
# Use eksctl or CloudFormation
cluster = await self.eks.create_cluster(
name=spec.name,
version=spec.version,
roleArn=spec.role_arn,
resourcesVpcConfig=spec.vpc_config
)
return await self.wait_for_cluster(cluster.name)
GCP Agent
class GCPAgent:
def __init__(self, project_id: str):
self.project_id = project_id
self.compute = compute_v1.InstancesClient()
self.container = container_v1.ClusterManagerClient()
self.storage = storage.Client(project=project_id)
self.run = run_v2.ServicesClient()
async def deploy_cloud_run(self, spec: CloudRunSpec) -> ServiceResult:
service = await self.run.create_service(
parent=f"projects/{self.project_id}/locations/{spec.region}",
service=Service(
template=RevisionTemplate(
containers=[Container(
image=spec.image,
resources=ResourceRequirements(limits=spec.resources),
env=[EnvVar(name=k, value=v) for k, v in spec.env.items()]
)],
traffic=[TrafficTarget(percent=100, latest_revision=True)]
),
service_id=spec.name
)
return await self.wait_for_service(service.name)
Azure Agent
class AzureAgent:
def __init__(self, subscription_id: str):
self.subscription_id = subscription_id
self.credential = DefaultAzureCredential()
self.compute = ComputeManagementClient(self.credential, subscription_id)
self.network = NetworkManagementClient(self.credential, subscription_id)
self.storage = StorageManagementClient(self.credential, subscription_id)
self.containers = ContainerRegistryManagementClient(self.credential, subscription_id)
async def deploy_aks(self, spec: AKSSpec) -> ClusterResult:
cluster = await self.containers.managed_clusters.begin_create_or_update(
resource_group_name=spec.resource_group,
resource_name=spec.name,
parameters=ManagedCluster(
location=spec.location,
kubernetes_version=spec.version,
agent_pool_profiles=[AgentPoolProfile(
name="default",
count=spec.node_count,
vm_size=spec.vm_size,
mode="System"
)],
identity=ManagedClusterIdentity(type="SystemAssigned")
)
)
return await cluster.result()
Monitoring & Observability Agents
Prometheus/Grafana Agent
class PrometheusAgent:
def __init__(self, prometheus_url: str):
self.prom = PrometheusClient(prometheus_url)
self.alertmanager = AlertmanagerClient()
async def query(self, query: str, time_range: TimeRange = None) -> QueryResult:
if time_range:
return await self.prom.query_range(query, time_range.start, time_range.end)
return await self.prom.query(query)
async def create_alert(self, rule: AlertRule) -> AlertResult:
return await self.alertmanager.create_alert(rule)
async def get_alerts(self) -> list[Alert]:
return await self.alertmanager.get_alerts()
Logging Agent (Loki/ELK)
class LogAnalysisAgent:
def __init__(self, loki_url: str = None, elasticsearch_url: str = None):
self.loki = LokiClient(loki_url) if loki_url else None
self.es = ElasticsearchClient(elasticsearch_url) if elasticsearch_url else None
async def query_logs(self, query: LogQuery) -> LogResult:
if self.loki:
return await self.loki.query_range(query.query, query.start, query.end)
return await self.es.search(query)
async def detect_anomalies(self, query: LogQuery) -> AnomalyReport:
logs = await self.query_logs(query)
return await self.detect_anomalies_in_logs(logs)
Distributed Tracing Agent
class TracingAgent:
def __init__(self, jaeger_url: str = None, tempo_url: str = None):
self.jaeger = JaegerClient(jaeger_url) if jaeger_url else None
self.tempo = TempoClient(tempo_url) if tempo_url else None
async def get_trace(self, trace_id: str) -> Trace:
if self.jaeger:
return await self.jaeger.get_trace(trace_id)
return await self.tempo.get_trace(trace_id)
async def find_traces(self, query: TraceQuery) -> list[Trace]:
if self.jaeger:
return await self.jaeger.find_traces(query)
return await self.tempo.find_traces(query)
async def analyze_latency(self, service: str, window: TimeWindow) -> LatencyAnalysis:
traces = await self.find_traces(TraceQuery(service=service, start=window.start, end=window.end))
return self.analyze_latency(traces)
Security & Compliance Agents
Vulnerability Scanning Agent
class VulnerabilityScanner:
def __init__(self):
self.trivy = TrivyScanner()
self.grype = GrypeScanner()
self.snyk = SnykScanner()
async def scan_image(self, image: str) -> ScanResult:
results = await asyncio.gather(
self.trivy.scan(image),
self.grype.scan(image),
self.snyk.scan(image)
)
return self.merge_results(results)
async def scan_k8s(self, cluster: str) -> K8sScanResult:
return await self.trivy.scan_k8s(cluster)
async def scan_terraform(self, plan: str) -> TerraformScanResult:
return await self.trivy.scan_terraform(plan)
Policy Enforcement Agent (OPA/Kyverno)
class PolicyAgent:
def __init__(self):
self.opa = OPAClient()
self.kyverno = KyvernoClient()
async def validate(self, resource: dict, policies: list[Policy]) -> ValidationResult:
# OPA evaluation
input_data = {"resource": resource}
result = await self.opa.evaluate("data.policy.allow", input_data)
return ValidationResult(
allowed=result.get("allow", False),
violations=result.get("violations", [])
)
async def mutate(self, resource: dict, policies: list[Policy]) -> dict:
return await self.kyverno.mutate(resource, policies)
Compliance Agent
class ComplianceAgent:
def __init__(self):
self.frameworks = {
"SOC2": SOC2Framework(),
"PCI-DSS": PCIDSSFramework(),
"HIPAA": HIPAAFramework(),
"GDPR": GDPRFramework(),
"CIS": CISBenchmark()
}
async def assess(self, resources: list[Resource], framework: str) -> ComplianceReport:
framework = self.frameworks[framework]
results = await asyncio.gather(*[
framework.check(resource) for resource in resources
])
return ComplianceReport(
framework=framework,
passed=sum(1 for r in results if r.passed),
failed=sum(1 for r in results if not r.passed),
findings=[r for r in results if not r.passed],
score=sum(r.score for r in results) / len(results)
)
Cost Optimization Agent
class CostOptimizationAgent:
def __init__(self):
self.providers = {
"aws": AWSCostExplorer(),
"gcp": GCPCostExplorer(),
"azure": AzureCostManagement(),
"k8s": KubecostClient()
}
async def analyze(self, scope: CostScope) -> CostAnalysis:
provider = self.providers[scope.provider]
# 1. Current spend
current = await provider.get_spend(scope.time_range)
# 2. Identify waste
waste = await self.identify_waste(current)
# 3. Rightsizing
rightsizing = await self.rightsizing_recommendations(current)
# 4. Spot/reserved optimization
savings = await self.optimization_opportunities(current)
# 5. Forecast
forecast = await provider.forecast(next_months=3)
return CostAnalysis(
current_spend=current.total,
waste=waste,
rightsizing=rightsizing,
savings_opportunities=savings,
forecast=forecast,
recommendations=self.generate_recommendations(waste, savings)
)
async def identify_waste(self, spend: SpendData) -> WasteReport:
waste = []
for resource in spend.resources:
if resource.utilization < 0.1:
waste.append(WasteItem(
resource=resource.id,
type="idle",
monthly_cost=resource.cost,
recommendation="Terminate or downsize"
))
elif resource.utilization < 0.3:
waste.append(WasteItem(
resource=resource.id,
type="underutilized",
monthly_cost=resource.cost * 0.7,
recommendation="Downsize or use spot"
))
return WasteReport(items=waste)
Disaster Recovery Agent
class DisasterRecoveryAgent:
def __init__(self):
self.velero = VeleroClient()
self.restic = ResticClient()
self.crossplane = CrossplaneClient()
async def backup(self, spec: BackupSpec) -> BackupResult:
if spec.target == "k8s":
return await self.velero.backup(spec)
elif spec.target == "vm":
return await self.restic.backup_vm(spec)
elif spec.target == "database":
return await self.backup_database(spec)
async def restore(self, spec: RestoreSpec) -> RestoreResult:
if spec.source == "k8s":
return await self.velero.restore(spec)
elif spec.source == "vm":
return await self.restic.restore_vm(spec)
async def test_dr(self, spec: DRTestSpec) -> DRTestResult:
# 1. Create isolated test environment
test_env = await self.create_test_environment()
# 2. Restore
restore = await self.restore(RestoreSpec(
backup=spec.backup_id,
target=test_env
))
# 3. Validate
validation = await self.validate_restore(restore, spec.validation_checks)
# 4. Cleanup
await self.cleanup_test_environment(test_env)
return DRTestResult(
restored=restore.success,
validation=validation,
rto=restore.duration,
rpo=spec.rpo
)
Related Notes
- CI CD Best Practices — CI/CD pipelines
- Observability — Monitoring, logging, tracing
- Infrastructure as Code — IaC patterns
- Git Workflow — GitOps
- Function Calling — Infrastructure as tools
- MCP Protocol — MCP for infrastructure
- API Integration — Cloud APIs
- Supply Chain Security — Supply chain security
- Secure Coding — Secure infrastructure code
- Deployment Architecture — Deployment patterns
- Scaling Strategies — Scaling strategies
- Reliability — Reliability patterns
- Security — Security hardening
- Compliance — Compliance automation
- Cost Optimization — Cost optimization
- Reliability — DR, backup
- Deployment Architecture — Deployment architecture
- Scaling Strategies — Auto-scaling
- Supply Chain Security — Supply chain
- Secure Coding — Secure IaC
- Deployment Architecture — Deployment patterns
- Research Directions — Infrastructure research
Sources: Terraform, Pulumi, Crossplane, Kubernetes, Helm, Kustomize, ArgoCD, Flux, Istio, Linkerd, Cilium, Envoy, Gateway API, Prometheus, Grafana, Loki, Tempo, Jaeger, OpenTelemetry, Trivy, Grype, Syft, OPA, Kyverno, Gatekeeper, Falco, Velero, Restic, Crossplane, Kubecost, CloudHealth, Finout, AWS Cost Explorer, GCP Billing, Azure Cost Management, CloudFormation, CDK, eksctl, kops, kubeadm, kind, k3s, k0s, Talos, Bottlerocket, Flatcar, Container Linux, eBPF (Cilium, Tetragon), Service Mesh (Istio, Linkerd, Consul Connect), CNCF Landscape.