{"id":215,"date":"2026-10-12T22:41:00","date_gmt":"2026-10-12T22:41:00","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2010\/03\/21\/power-point-ppt-configuration-management\/"},"modified":"2026-10-12T22:41:00","modified_gmt":"2026-10-12T22:41:00","slug":"power-point-ppt-configuration-management","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/power-point-ppt-configuration-management\/","title":{"rendered":"Configuration Management in DevOps: Workflow, Tool Comparison, and an Ansible Example"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Originally published on 2010-03-21; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Configuration management is the practice of defining and enforcing system configuration as code so environments stay consistent over time. This rewrite is aimed at DevOps engineers and platform teams who need repeatable deployments, reduced drift, and safer change control across development, staging, and production.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The original post was a short SlideShare embed. This updated version provides a complete, practical reference you can use directly.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Original embedded slide deck (archival)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Original permalink: <a href=\"https:\/\/www.devopsschool.com\/blog\/power-point-ppt-configuration-management\/\">https:\/\/www.devopsschool.com\/blog\/power-point-ppt-configuration-management\/<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">{slideshare}[slideshare id=1117749&amp;doc=configurationmanagement-090308134227-phpapp02]{\/slideshare}<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What configuration management solves<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Without configuration management, servers and clusters tend to diverge over time: package versions drift, manual fixes are forgotten, and incidents become harder to reproduce. With configuration managed as code, teams can track changes, review them, and apply them consistently.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Consistency:<\/strong> same desired state across environments.<\/li><li><strong>Auditability:<\/strong> configuration changes are tracked in version control.<\/li><li><strong>Repeatability:<\/strong> rebuilding or scaling infrastructure is predictable.<\/li><li><strong>Drift control:<\/strong> unauthorized or accidental changes are easier to detect and correct.<\/li><li><strong>Safer operations:<\/strong> dry runs, peer review, and staged rollout reduce change risk.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">End-to-end workflow in a DevOps pipeline<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A robust workflow treats configuration exactly like application code: author, review, validate, stage, deploy, and continuously check for drift.<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Define desired state as code] --> B[Commit to Git]\n    B --> C[CI validates syntax and policy]\n    C --> D[Review and approve]\n    D --> E[Apply in staging]\n    E --> F[Run service checks]\n    F --> G{Promote to production}\n    G -- no --> A\n    G -- yes --> H[Apply in production]\n    H --> I[Detect drift and open fix change]\n    I --> A\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Approaches and tools compared<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Different tools can achieve configuration management, but they differ in operating model, complexity, and fit for scale.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Option<\/th><th>Model<\/th><th>Best for<\/th><th>Trade-offs<\/th><\/tr><\/thead><tbody><tr><td>Manual shell scripts<\/td><td>Imperative commands executed directly on hosts<\/td><td>Small, one-off tasks<\/td><td>Hard to keep idempotent; drift grows quickly<\/td><\/tr><tr><td>Ansible<\/td><td>Agentless automation (commonly over SSH\/WinRM) with YAML playbooks<\/td><td>Teams that want quick adoption and readable automation<\/td><td>Controller design and inventory strategy matter at larger scale<\/td><\/tr><tr><td>Puppet<\/td><td>Declarative desired state with agent-based enforcement<\/td><td>Large fleets needing continuous state enforcement<\/td><td>Agent and control-plane lifecycle adds operational overhead<\/td><\/tr><tr><td>Chef<\/td><td>Code-driven automation with Ruby DSL, typically agent-based<\/td><td>Complex automation patterns and strong code customization<\/td><td>Steeper learning curve for teams unfamiliar with Ruby DSL<\/td><\/tr><tr><td>Salt<\/td><td>Remote execution plus state management, event-driven capabilities<\/td><td>Teams needing both orchestration and configuration control<\/td><td>Architecture choices can increase design complexity<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Hands-on example: baseline web server configuration with Ansible<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This example installs and enables NGINX on a target host group named <strong>web<\/strong>. It demonstrates idempotent configuration management with a dry-run step before enforcement.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Inventory file<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-ini\">&#91;web]\nweb-01 ansible_host=192.0.2.10 ansible_user=ubuntu\nweb-02 ansible_host=192.0.2.11 ansible_user=ubuntu<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Playbook<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css language-yaml\"><span class=\"hljs-selector-tag\">---<\/span>\n<span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">name<\/span>: <span class=\"hljs-selector-tag\">Configure<\/span> <span class=\"hljs-selector-tag\">web<\/span> <span class=\"hljs-selector-tag\">servers<\/span>\n  <span class=\"hljs-selector-tag\">hosts<\/span>: <span class=\"hljs-selector-tag\">web<\/span>\n  <span class=\"hljs-selector-tag\">become<\/span>: <span class=\"hljs-selector-tag\">true<\/span>\n  <span class=\"hljs-selector-tag\">tasks<\/span>:\n    <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">name<\/span>: <span class=\"hljs-selector-tag\">Ensure<\/span> <span class=\"hljs-selector-tag\">nginx<\/span> <span class=\"hljs-selector-tag\">is<\/span> <span class=\"hljs-selector-tag\">installed<\/span>\n      <span class=\"hljs-selector-tag\">ansible<\/span><span class=\"hljs-selector-class\">.builtin<\/span><span class=\"hljs-selector-class\">.package<\/span>:\n        <span class=\"hljs-selector-tag\">name<\/span>: <span class=\"hljs-selector-tag\">nginx<\/span>\n        <span class=\"hljs-selector-tag\">state<\/span>: <span class=\"hljs-selector-tag\">present<\/span>\n\n    <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">name<\/span>: <span class=\"hljs-selector-tag\">Ensure<\/span> <span class=\"hljs-selector-tag\">nginx<\/span> <span class=\"hljs-selector-tag\">service<\/span> <span class=\"hljs-selector-tag\">is<\/span> <span class=\"hljs-selector-tag\">enabled<\/span> <span class=\"hljs-selector-tag\">and<\/span> <span class=\"hljs-selector-tag\">running<\/span>\n      <span class=\"hljs-selector-tag\">ansible<\/span><span class=\"hljs-selector-class\">.builtin<\/span><span class=\"hljs-selector-class\">.service<\/span>:\n        <span class=\"hljs-selector-tag\">name<\/span>: <span class=\"hljs-selector-tag\">nginx<\/span>\n        <span class=\"hljs-selector-tag\">enabled<\/span>: <span class=\"hljs-selector-tag\">true<\/span>\n        <span class=\"hljs-selector-tag\">state<\/span>: <span class=\"hljs-selector-tag\">started<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Validate first, then apply<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css language-bash\"><span class=\"hljs-selector-tag\">ansible-playbook<\/span> <span class=\"hljs-selector-tag\">-i<\/span> <span class=\"hljs-selector-tag\">inventory<\/span><span class=\"hljs-selector-class\">.ini<\/span> <span class=\"hljs-selector-tag\">web<\/span><span class=\"hljs-selector-class\">.yml<\/span> <span class=\"hljs-selector-tag\">--syntax-check<\/span>\n<span class=\"hljs-selector-tag\">ansible-playbook<\/span> <span class=\"hljs-selector-tag\">-i<\/span> <span class=\"hljs-selector-tag\">inventory<\/span><span class=\"hljs-selector-class\">.ini<\/span> <span class=\"hljs-selector-tag\">web<\/span><span class=\"hljs-selector-class\">.yml<\/span> <span class=\"hljs-selector-tag\">--check<\/span> <span class=\"hljs-selector-tag\">--diff<\/span>\n<span class=\"hljs-selector-tag\">ansible-playbook<\/span> <span class=\"hljs-selector-tag\">-i<\/span> <span class=\"hljs-selector-tag\">inventory<\/span><span class=\"hljs-selector-class\">.ini<\/span> <span class=\"hljs-selector-tag\">web<\/span><span class=\"hljs-selector-class\">.yml<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Minimal CI validation stage<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css language-yaml\"><span class=\"hljs-selector-tag\">stages<\/span>:\n  <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">validate<\/span>\n\n<span class=\"hljs-selector-tag\">validate_config<\/span>:\n  <span class=\"hljs-selector-tag\">stage<\/span>: <span class=\"hljs-selector-tag\">validate<\/span>\n  <span class=\"hljs-selector-tag\">script<\/span>:\n    <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">ansible-playbook<\/span> <span class=\"hljs-selector-tag\">-i<\/span> <span class=\"hljs-selector-tag\">inventory<\/span><span class=\"hljs-selector-class\">.ini<\/span> <span class=\"hljs-selector-tag\">web<\/span><span class=\"hljs-selector-class\">.yml<\/span> <span class=\"hljs-selector-tag\">--syntax-check<\/span>\n    <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">ansible-playbook<\/span> <span class=\"hljs-selector-tag\">-i<\/span> <span class=\"hljs-selector-tag\">inventory<\/span><span class=\"hljs-selector-class\">.ini<\/span> <span class=\"hljs-selector-tag\">web<\/span><span class=\"hljs-selector-class\">.yml<\/span> <span class=\"hljs-selector-tag\">--check<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Common pitfalls and best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Pitfall:<\/strong> making emergency manual server edits and never backporting them. <strong>Best practice:<\/strong> every change goes through version control and pull request review.<\/li><li><strong>Pitfall:<\/strong> applying directly to production first. <strong>Best practice:<\/strong> validate in CI, then stage, then promote.<\/li><li><strong>Pitfall:<\/strong> treating configuration tools as ad-hoc scripting engines. <strong>Best practice:<\/strong> prefer idempotent resources and declarative patterns where possible.<\/li><li><strong>Pitfall:<\/strong> weak inventory and host-group design. <strong>Best practice:<\/strong> model environments and roles explicitly to prevent accidental broad changes.<\/li><li><strong>Pitfall:<\/strong> no drift checks after deployment. <strong>Best practice:<\/strong> schedule regular compliance runs and open fix changes automatically.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>This guide explains configuration management for DevOps teams: what it solves, how it fits into delivery workflows, and how major tool options compare. It also includes a practical Ansible example you can adapt for real environments.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-215","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/215","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=215"}],"version-history":[{"count":2,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/215\/revisions"}],"predecessor-version":[{"id":79053,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/215\/revisions\/79053"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=215"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=215"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=215"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}