<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>configuration management &#8211; Best DevOps</title>
	<atom:link href="https://www.bestdevops.com/tag/configuration-management/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bestdevops.com</link>
	<description>Lets Learn, Do it &#38; Share! Thats a Best DevOps!!!</description>
	<lastBuildDate>Tue, 13 Oct 2026 01:04:19 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>
	<item>
		<title>6 Kubernetes Security Use Cases You Must Prioritize</title>
		<link>https://www.bestdevops.com/6-kubernetes-security-use-cases-you-must-prioritize/</link>
					<comments>https://www.bestdevops.com/6-kubernetes-security-use-cases-you-must-prioritize/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Fri, 16 Oct 2020 05:00:46 +0000</pubDate>
				<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[Compliance]]></category>
		<category><![CDATA[configuration management]]></category>
		<category><![CDATA[detection and response]]></category>
		<category><![CDATA[kubernates]]></category>
		<category><![CDATA[Prioritize]]></category>
		<category><![CDATA[RBAC]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=13910</guid>

					<description><![CDATA[Source:-https://securityboulevard.com Organizations are rapidly moving their Kubernetes applications to production to accelerate feature velocity and drive digital transformation and business [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Source:-https://securityboulevard.com</p>
<p>Organizations are rapidly moving their Kubernetes applications to production to accelerate feature velocity and drive digital transformation and business growth. Our latest State of Kubernetes Security survey report shows that companies have standardized on Kubernetes, and this rapid adoption offers equal parts promise and peril. Promise, in the form of infrastructure that enables far greater inherent security than ever before. And peril, as companies struggle to overcome a skills gap and configure the technology in the most secure manner.</p>
<p><strong>Kubernetes workloads</strong> – often deployed across varying environments (cloud, on-prem, hybrid) – require a security approach that is portable; protects the full container life cycle; and leverages Kubernetes’ rich context, native controls, and scalable policy enforcement to build a bridge between DevOps and Security.</p>
<p>The following six Kubernetes security use cases top the list of priorities for most organizations that we surveyed – follow the best practices gleaned from your peers and shared here to get your organization on the right track.</p>
<p><strong>1. Runtime threat detection and response</strong></p>
<p>According to our report, runtime is the life cycle phase that customers are most worried about, and more people consider runtime detection a “must have” than any others. The security goal in this phase is to detect and respond to malicious activity in an automated and scalable way while minimizing false positives and alert fatigue. Kubernetes offers rich declarative data around images and deployments that delivers valuable context when assessing runtime behavior. Leverage this context to more accurately differentiate between simple anomalies and true threats, and use Kubernetes-native enforcement capabilities to mitigate runtime threats in the most automated and scalable manner.</p>
<p><strong>2. Compliance</strong></p>
<p>DevOps moves fast and relies on automation for continuous improvement, so organizations need a compliance solution built to complement – not inhibit – the pace of business. You need to not only adhere to industry compliance requirements but also show evidence of that compliance. You should be able to show which clusters, nodes, or namespaces are compliant with all the individual controls relevant in container and Kubernetes environments from frameworks including CIS benchmarks for Docker and Kubernetes, PCI, HIPAA, and NIST SP 800-190. And it should be dead simple to run on-demand compliance checks and export evidence of compliance.</p>
<p><strong>3. Configuration management</strong></p>
<p>Misconfiguration poses the greatest security risk to containers and Kubernetes, with 67% of survey respondents experiencing a K8s misconfiguration in the last 12 months. In today’s DevOps-driven environment, configuration management must be as automated and streamlined as possible for it to not slow down application development and deployment. It should be comprehensive, covering containers, Kubernetes, and all their configurable components, including:</p>
<p>RBAC<br />
Secrets<br />
Network policies<br />
Privilege levels<br />
Resource limits/requests<br />
Read-only root file systems<br />
Annotations, labels<br />
Sensitive host mount and access<br />
Image configuration, including provenance</p>
<p><strong>4. Vulnerability scanning and management</strong></p>
<p>Most organizations start with vulnerability management – the challenge is to quickly move beyond the limited value provided by image scanning. Organizations must also identify vulnerabilities in Kubernetes, and they need a way to quickly pinpoint newly discovered vulnerabilities in already running deployments. Start with vulnerability management, but demand more than image scanning for this use case.</p>
<p><strong>5. Visibility</strong></p>
<p>Gaining visibility into your container and Kubernetes environments is at the root of being able to properly secure that environment. Only when your security tooling is fully embedded into Kubernetes can you understand your cloud-native infrastructure, including images, containers, pods, namespaces, clusters, and network policies. You need insights into how each is configured and whether they’re compliant with industry standards and your internal security policies.</p>
<p><strong>6. Network segmentation</strong></p>
<p>Containers pose a unique networking challenge because containers communicate with each other across nodes and clusters (east-west traffic) and outside endpoints (north-south traffic). Kubernetes provides built-in capabilities that enable network segmentation. Leverage those native controls to ensure consistent, portable, and scalable network segmentation regardless of your CNI plugin or Kubernetes distribution. Using the segmentation inherent in Kubernetes ensures that security and DevOps see and act on a single source of truth and consistent information to restrict access and reduce the blast radius.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/6-kubernetes-security-use-cases-you-must-prioritize/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Why the Database Is at the Heart of DevOps Success</title>
		<link>https://www.bestdevops.com/why-the-database-is-at-the-heart-of-devops-success/</link>
					<comments>https://www.bestdevops.com/why-the-database-is-at-the-heart-of-devops-success/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Fri, 07 Dec 2018 05:50:02 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[configuration management]]></category>
		<category><![CDATA[Continuous Delivery]]></category>
		<category><![CDATA[Database]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=4745</guid>

					<description><![CDATA[If your database sits outside the DevOps workflow, it becomes your biggest bottleneck. Here is why integrating database changes into CI/CD pipelines — and breaking down the wall between DBAs and developers — is essential to high DevOps performance.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>This article draws on analysis originally published by <a href="http://www.devopsonline.co.uk/14196-2-devops-database-success/" target="_blank" rel="noopener">DevOps Online</a>, referencing findings from the 2018 Accelerate State of DevOps Report (DORA) and Redgate&#8217;s 2018 State of Database DevOps Survey.</em></p>



<h2 class="wp-block-heading">The Database: DevOps&#8217;s Forgotten Bottleneck</h2>



<p class="wp-block-paragraph">Organisations investing heavily in CI/CD pipelines, automated testing, and cloud-native infrastructure often overlook one critical component: the database. When database changes are managed manually, reviewed out-of-band, or simply excluded from the deployment pipeline, they become a chokepoint that erodes every efficiency gain made elsewhere in the delivery process.</p>



<p class="wp-block-paragraph">The 2018 Accelerate State of DevOps Report — produced by DORA (DevOps Research and Assessment) — makes this explicit. Elite-performing organisations in the report deployed code 46 times more frequently than low performers, recovered from failures 2,604 times faster, and had a 7 times lower change failure rate. Critically, their lead time from committing a change to deploying it was under one hour, compared to one to six months for the lowest-performing cohort. Excluding the database from the DevOps workflow is one of the fastest ways to land in that low-performing bracket.</p>



<h2 class="wp-block-heading">The Developer–DBA Divide</h2>



<p class="wp-block-paragraph">Part of the problem is cultural and historical. Application developers are focused on shipping features quickly. Database administrators (DBAs) are responsible for keeping business-critical data available, consistent, and safe. These priorities have traditionally pulled in opposite directions, breeding mutual suspicion: developers worry that DBAs will block or delay releases; DBAs worry that untested schema changes will bring down production databases.</p>



<p class="wp-block-paragraph">The good news is that attitudes are shifting. Redgate&#8217;s 2018 State of Database DevOps Survey found that 58% of respondents described collaboration between developers and DBAs as either good or great — a sign that the industry recognises shared goals matter more than functional silos.</p>



<p class="wp-block-paragraph">So how do you build that collaboration and make the database a first-class citizen in your DevOps process? The DORA report points to four practical focus areas.</p>



<h2 class="wp-block-heading">1. Ensure Consistency by Treating Database Changes Like Code</h2>



<p class="wp-block-paragraph">Database development today is roughly where application development was a decade ago: changes are often made manually, undocumented, and outside any formal pipeline. The solution is to apply the same discipline that transformed application delivery.</p>



<ul class="wp-block-list">
<li><strong>Version control everything.</strong> Store all schema changes, stored procedures, and seed data as SQL scripts in your version control system (Git, SVN, etc.), alongside application code. This creates a single source of truth and a full audit trail.</li>
<li><strong>Apply configuration management principles.</strong> Treat the database schema as infrastructure. Define the desired state, use tooling to detect drift, and automate remediation.</li>
<li><strong>Integrate database changes into CI/CD pipelines.</strong> Run schema migrations as a pipeline stage — building, validating, and deploying them with the same gates (automated tests, peer review, approval workflows) applied to application code.</li>
<li><strong>Use dedicated database DevOps tooling.</strong> Tools such as Flyway, Liquibase, and Redgate&#8217;s SQL Change Automation are designed to automate and version database deployments in a pipeline-friendly way.</li>
</ul>



<p class="wp-block-paragraph">Consistency means a change applied in development travels through test, staging, and production environments in a predictable, repeatable way — with no manual steps and no surprises.</p>



<h2 class="wp-block-heading">2. Use Monitoring and Observability to Learn Continuously</h2>



<p class="wp-block-paragraph">Visibility is a prerequisite for improvement. In a database-inclusive DevOps workflow, this means two complementary capabilities.</p>



<h3 class="wp-block-heading">Monitoring</h3>



<p class="wp-block-paragraph">Pre-defined metrics — query latency, replication lag, connection pool saturation, deadlock rates, index usage — need to be captured and surfaced to the whole team, not just the DBA. Dashboards should be tied to business SLAs so that a spike in database response time is immediately understood in terms of end-user impact, not just raw infrastructure numbers.</p>



<h3 class="wp-block-heading">Observability</h3>



<p class="wp-block-paragraph">The DORA report highlights observability as a distinct and newer capability. Where monitoring answers the questions you thought to ask in advance, observability lets you ask questions you did not anticipate — exploring system behaviour through logs, traces, and events to diagnose novel failure modes. The report found that organisations with both monitoring and observability in place were 1.3 times more likely to be among the top DevOps performers.</p>



<p class="wp-block-paragraph">Equally important is what you do with the data. DORA found that teams running structured post-incident reviews and using the findings to drive continuous improvement were more likely to rank among elite performers. Blameless retrospectives applied to database incidents — not just application outages — accelerate learning across the whole team.</p>



<h2 class="wp-block-heading">3. Build a Common, Open Culture</h2>



<p class="wp-block-paragraph">One of the more counterintuitive findings in the DORA report is that industry sector is not a reliable predictor of DevOps performance. High performers exist in heavily regulated industries — government, financial services, healthcare — just as much as in fast-moving retail or technology companies. The differentiator is not what business you are in, but how your organisation behaves.</p>



<p class="wp-block-paragraph">Culture shapes everything. High-performing teams share several traits:</p>



<ul class="wp-block-list">
<li><strong>Openness to change.</strong> They treat the current process as a starting point, not a fixed constraint.</li>
<li><strong>Psychological safety.</strong> Team members can surface problems — including database risks — without fear of blame.</li>
<li><strong>Shared ownership.</strong> No single team owns quality or reliability in isolation; everyone is accountable for the outcome.</li>
<li><strong>Continuous learning.</strong> Skills are developed across boundaries — developers learn database fundamentals; DBAs learn deployment automation.</li>
</ul>



<p class="wp-block-paragraph">Leadership plays a decisive role here. Building trust, granting teams meaningful autonomy, and communicating clearly why database changes are part of the shared mission — not a bureaucratic gate — are all leadership responsibilities, not technical ones.</p>



<h2 class="wp-block-heading">4. Encourage Collaboration and Shared Ownership Across the Organisation</h2>



<p class="wp-block-paragraph">The practical expression of that culture is how developers and DBAs actually work together day to day. Several patterns have emerged in organisations that have successfully bridged the divide.</p>



<ul class="wp-block-list">
<li><strong>Embed DBAs in DevOps teams.</strong> Rather than DBAs sitting in a separate team that reviews requests on a ticket-by-ticket basis, some organisations assign a DBA as an advisor to the development team around major releases. Their role shifts from gatekeeper to coach — helping developers write migration scripts that perform safely at scale, reviewing schema designs early in the sprint rather than at deployment time.</li>
<li><strong>Shared tooling and pipelines.</strong> When developers and DBAs use the same version control repositories, the same pipeline stages, and the same deployment scripts, there is a natural forcing function for conversation and shared understanding.</li>
<li><strong>Pair reviews on database changes.</strong> Pull request reviews on schema migrations that include a DBA or a developer with database expertise catch problems earlier and spread knowledge across the team.</li>
<li><strong>Database changes in sprint planning.</strong> Including database migration tasks in sprint planning — estimated, prioritised, and tracked alongside feature work — prevents them from becoming a last-minute surprise at deployment time.</li>
</ul>



<h2 class="wp-block-heading">Summary: The Database Is Not Optional in DevOps</h2>



<p class="wp-block-paragraph">The DORA findings are clear: elite DevOps performance requires the database to be part of the delivery pipeline, not an afterthought managed outside it. The four areas outlined above — consistency through version-controlled, automated database deployments; visibility through monitoring and observability; an open, learning culture; and genuine developer–DBA collaboration — provide a practical roadmap for any team looking to close the gap.</p>



<p class="wp-block-paragraph">For DBAs, this shift is also an opportunity. Moving from a reactive, ticket-driven role to an embedded advisor and automation specialist is a significant career evolution — one that makes the DBA function more visible, more valued, and more directly connected to business outcomes.</p>



<p class="wp-block-paragraph">Organisations that still treat developers and DBAs as separate silos will continue to find that their database is the ceiling on their DevOps ambitions. Breaking down that barrier is not just a process improvement — it is a competitive necessity.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/why-the-database-is-at-the-heart-of-devops-success/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>5 Foundational DevOps Practices Every Enterprise Needs to Succeed</title>
		<link>https://www.bestdevops.com/5-foundational-devops-practices-your-enterprise-needs-to-succeed/</link>
					<comments>https://www.bestdevops.com/5-foundational-devops-practices-your-enterprise-needs-to-succeed/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Mon, 19 Nov 2018 05:44:03 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[configuration management]]></category>
		<category><![CDATA[Continuous Deployment]]></category>
		<category><![CDATA[Continuous monitoring]]></category>
		<category><![CDATA[DevOps practices]]></category>
		<category><![CDATA[Puppet]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=4666</guid>

					<description><![CDATA[Puppet research identified five core DevOps practices that separate high performers from the rest. Here is what they are, why they matter, and how to implement them in your organization.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">DevOps has moved well beyond buzzword status. Over roughly a decade, it became the dominant framework for managing technological change and accelerating software delivery. Yet many enterprise teams still struggle to find a coherent starting point. A report from Puppet identified five foundational practices that consistently separate high-performing DevOps organizations from lower-performing ones—regardless of industry, company size, or the specific toolchain in use.</p>



<p class="wp-block-paragraph">No single transformation path fits every organization, but the research found that these five capabilities are essential at every stage of DevOps maturity. Teams that embed them early create the conditions for continuous improvement, faster delivery, and stronger cross-functional collaboration.</p>



<h2 class="wp-block-heading">1. Monitoring and Alerting Are Configurable by the Team Operating the Service</h2>



<p class="wp-block-paragraph">Effective DevOps requires both empowerment and accountability at the team level. High-performing organizations give individual product and service teams the authority to define their own monitoring thresholds, alerting rules, and observability criteria for the services they run in production—rather than delegating that responsibility to a central operations group.</p>



<p class="wp-block-paragraph">When teams own their own monitoring configuration, several things happen naturally:</p>



<ul class="wp-block-list">
<li><strong>Faster incident detection:</strong> The people who built the service know which signals matter most and can tune alerts accordingly.</li>
<li><strong>Shared metrics culture:</strong> Teams can publish dashboards and share measurement approaches across the organization, promoting continuous improvement.</li>
<li><strong>Systems thinking:</strong> Visibility into how one service affects others fosters cross-team collaboration and a broader understanding of the production environment.</li>
</ul>



<p class="wp-block-paragraph">Tools such as Prometheus, Datadog, Grafana, and PagerDuty all support team-level configuration of alerts and dashboards. The tooling matters less than the organizational decision to give teams genuine ownership of what they measure.</p>



<h2 class="wp-block-heading">2. Deployment Patterns Are Reused Across Applications and Services</h2>



<p class="wp-block-paragraph">Reinventing the deployment process for every application is expensive and error-prone. Top-performing DevOps organizations standardize on reusable deployment routines, pipeline templates, and tooling that any team can adopt and extend.</p>



<p class="wp-block-paragraph">According to the Puppet report, 46% of high-performing DevOps organizations reported always reusing deployment patterns, compared to just 2% of lower-performing organizations. That gap is significant: standardized deployment patterns reduce the cognitive overhead of shipping software, make onboarding new engineers easier, and create a shared vocabulary for discussing deployments across teams.</p>



<p class="wp-block-paragraph">In practice, reusable deployment patterns might take the form of:</p>



<ul class="wp-block-list">
<li>Shared CI/CD pipeline templates in tools like Jenkins, GitLab CI, or GitHub Actions</li>
<li>Standardized Helm charts or Kubernetes manifests for containerized workloads</li>
<li>Internal deployment libraries or platform engineering products that abstract infrastructure complexity</li>
</ul>



<h2 class="wp-block-heading">3. Testing Patterns Are Reused Across Applications and Services</h2>



<p class="wp-block-paragraph">The same logic that applies to deployment applies equally to testing. High-performing organizations do not ask every team to define its own approach to unit testing, integration testing, and end-to-end validation from scratch. They build and share reusable testing patterns that encode organizational knowledge about how to verify software quality reliably.</p>



<p class="wp-block-paragraph">The Puppet report found that high-performing organizations are 44 times more likely to use repeatable testing patterns than lower-performing peers. Reusable test frameworks reduce the barrier to achieving meaningful test coverage, make test results comparable across services, and give platform and quality engineering teams a lever to raise the quality floor for the whole organization at once.</p>



<p class="wp-block-paragraph">Common implementations include shared test harnesses, contract testing libraries (for microservices), and standardized policies for code coverage thresholds enforced at the pipeline level.</p>



<h2 class="wp-block-heading">4. Teams Contribute Improvements to Tooling Owned by Other Teams</h2>



<p class="wp-block-paragraph">In siloed organizations, tooling improvements stay within the team that built the tool. Engineers in other teams who identify a bug or a missing feature either work around it or duplicate effort by building their own version. This is one of the most persistent anti-patterns in enterprise software delivery.</p>



<p class="wp-block-paragraph">High-performing DevOps organizations break down that silo by creating a culture—and the technical infrastructure—for cross-team tooling contributions. The Puppet report found that high performers are 44 times more likely to contribute improvements to tooling provided by other teams. Treating internal tools as internal open-source projects, with contribution guides, code review processes, and clear ownership, is one proven way to enable this behavior.</p>



<p class="wp-block-paragraph">Platform engineering teams that operate internal developer platforms (IDPs) are well-positioned to formalize this practice. Exposing platform capabilities as versioned APIs or libraries with public repositories makes it straightforward for application teams to raise pull requests with improvements.</p>



<h2 class="wp-block-heading">5. Configurations Are Managed by a Configuration Management Tool</h2>



<p class="wp-block-paragraph">Configuration management was one of the earliest technical practices associated with the DevOps movement, and it remains a reliable baseline indicator of organizational maturity. Managing infrastructure and application configuration through code—rather than manual, ad hoc changes—enables reproducibility, auditability, and faster environment provisioning.</p>



<p class="wp-block-paragraph">The Puppet report found that 53% of high-performing organizations always use a configuration management tool, compared to 2% of lower-performing ones. Tools in this category include Puppet, Ansible, Chef, and SaltStack for infrastructure configuration, as well as approaches like GitOps (using tools such as Flux or Argo CD) for application configuration in Kubernetes environments.</p>



<p class="wp-block-paragraph">The benefits compound over time: teams that manage configuration as code can spin up consistent test environments on demand, reduce configuration drift between staging and production, and trace every infrastructure change back to a specific commit and author.</p>



<h2 class="wp-block-heading">Putting the Five Practices Together</h2>



<p class="wp-block-paragraph">These five practices are mutually reinforcing. Configuration management makes reusable deployment and testing patterns easier to implement consistently. Cross-team tooling contributions spread those patterns faster. Team-owned monitoring closes the feedback loop so that each release cycle generates actionable data for the next one.</p>



<p class="wp-block-paragraph">Organizations starting a DevOps transformation often look for a single lever to pull. The Puppet research suggests that sustainable improvement requires building all five capabilities in parallel, even if the initial implementations are modest. Start with configuration management and team-owned monitoring—both deliver value quickly and build the muscle memory for the collaborative practices that follow.</p>



<p class="wp-block-paragraph"><em>The statistics cited in this article are drawn from a Puppet State of DevOps report referenced in a <a href="http://techrepublic.com" target="_blank" rel="noopener">TechRepublic</a> article published in November 2018. Refer to Puppet&#8217;s annual State of DevOps Report series for the most current benchmarks.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/5-foundational-devops-practices-your-enterprise-needs-to-succeed/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Is &#8216;Continuous Delivery with Docker and Jenkins&#8217; Right for You?</title>
		<link>https://www.bestdevops.com/is-continuous-delivery-with-docker-and-jenkins-right-for-you/</link>
					<comments>https://www.bestdevops.com/is-continuous-delivery-with-docker-and-jenkins-right-for-you/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Fri, 28 Sep 2018 05:52:06 +0000</pubDate>
				<category><![CDATA[Continuous Delivery]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[configuration management]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[IT operations]]></category>
		<category><![CDATA[Jenkins]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=4440</guid>

					<description><![CDATA[A practical review of Rafal Leszko's book on building CI/CD pipelines with Docker and Jenkins, covering what you'll learn, who it's for, and where it falls short.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>Source: <a href="http://searchitoperations.techtarget.com" target="_blank" rel="noopener">searchitoperations.techtarget.com</a></em></p>



<h2 class="wp-block-heading">Overview</h2>



<p class="wp-block-paragraph"><em>Continuous Delivery with Docker and Jenkins</em> by Rafal Leszko is a hands-on technical book aimed at developers and DevOps engineers who want to build production-grade CI/CD pipelines. It covers the full lifecycle from local development to automated deployment, using Docker for containerization and Jenkins as the CI/CD orchestrator. For teams that have found other CI/CD books outdated or too abstract, this title offers a practical, current alternative.</p>



<h2 class="wp-block-heading">What the Book Covers</h2>



<p class="wp-block-paragraph">Leszko starts by contrasting traditional software delivery methods with continuous delivery, making a case for CD as the more reliable and scalable approach. He then progressively builds on that foundation, covering:</p>



<ul class="wp-block-list">
<li><strong>Docker fundamentals:</strong> What Docker is, how it works, and step-by-step installation and configuration instructions for all major operating systems.</li>
<li><strong>Jenkins setup:</strong> Installing and configuring Jenkins 2, including pipeline-as-code with Jenkinsfile.</li>
<li><strong>Automated testing:</strong> Integrating automated test stages into the pipeline.</li>
<li><strong>Configuration management with Ansible:</strong> Leszko covers Puppet, Chef, and Ansible as his top three configuration management tools, with a clear preference for Ansible due to its agentless architecture.</li>
<li><strong>Advanced pipeline patterns:</strong> Parallel pipeline steps, database management, and migration strategies within a CD workflow.</li>
<li><strong>Docker Swarm:</strong> Server clustering using Docker swarm mode and the <code>docker stack</code> command for orchestrating multi-container applications.</li>
<li><strong>Zero-downtime deployments and rollbacks:</strong> Strategies to keep applications available during updates and recover quickly from failed releases.</li>
</ul>



<h2 class="wp-block-heading">Strengths</h2>



<p class="wp-block-paragraph">The book&#8217;s greatest asset is its accessibility. Each chapter opens with foundational concepts before advancing to practical implementation, making it usable for readers who are new to containers or CI/CD. The writing style is described as clear and direct, avoiding jargon where possible.</p>



<p class="wp-block-paragraph">Beyond the basics, Leszko provides real-world examples and case studies to help readers optimize their pipelines rather than simply build them. The goal is for readers to finish the book capable of:</p>



<ul class="wp-block-list">
<li>Deploying applications using Docker Swarm clusters.</li>
<li>Managing database migrations as part of an automated pipeline.</li>
<li>Orchestrating and scaling multiple containers in production.</li>
<li>Implementing rollback strategies to reduce deployment risk.</li>
</ul>



<p class="wp-block-paragraph">The book also argues that a well-structured CD pipeline reduces the resources required compared to ad-hoc or manual delivery approaches, a practical selling point for teams making a case for DevOps investment.</p>



<h2 class="wp-block-heading">Limitations to Be Aware Of</h2>



<p class="wp-block-paragraph">The book&#8217;s configuration management coverage is narrow. Leszko focuses almost exclusively on Ansible and gives only brief mentions to Puppet and Chef. <strong>SaltStack</strong>, which offers both agentless and client-server modes and is a legitimate alternative to Ansible, is not discussed. Teams already using Salt or evaluating it will need to look elsewhere for guidance on integrating it into a Docker/Jenkins pipeline.</p>



<p class="wp-block-paragraph">Similarly, the orchestration coverage centers on Docker Swarm. Readers who need to understand <strong>Kubernetes</strong>-based pipelines — which have become the dominant container orchestration platform since this book was published — should supplement this book with Kubernetes-specific resources.</p>



<h2 class="wp-block-heading">Who Should Read It</h2>



<p class="wp-block-paragraph">This book suits a broad audience:</p>



<ul class="wp-block-list">
<li><strong>Developers</strong> who want to understand how their code moves from commit to production.</li>
<li><strong>IT operations staff</strong> building or modernizing delivery pipelines.</li>
<li><strong>Engineering managers and architects</strong> who need a clear picture of CD principles before evaluating tooling choices.</li>
<li><strong>Teams new to Docker and Jenkins</strong> who want a single resource rather than piecing together blog posts and documentation.</li>
</ul>



<p class="wp-block-paragraph">Experienced DevOps practitioners who already run Docker and Jenkins in production may find the early chapters too introductory, but the advanced sections on parallel pipelines, zero-downtime deployments, and Swarm clustering may still offer value.</p>



<h2 class="wp-block-heading">Verdict</h2>



<p class="wp-block-paragraph"><em>Continuous Delivery with Docker and Jenkins</em> is a well-structured, practical resource for teams adopting or maturing their CI/CD practices. Its hands-on approach, clear writing, and progression from basics to advanced topics make it accessible without being superficial. The main caveats are its narrow configuration management coverage and the fact that its orchestration content predates Kubernetes becoming the industry standard. If your stack aligns with Docker Swarm and Jenkins, this book delivers a thorough, actionable foundation.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/is-continuous-delivery-with-docker-and-jenkins-right-for-you/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>A Simple Chef Configuration Tutorial: From Installation to Your First Recipe</title>
		<link>https://www.bestdevops.com/try-this-simple-chef-configuration-tutorial/</link>
					<comments>https://www.bestdevops.com/try-this-simple-chef-configuration-tutorial/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Wed, 14 Jun 2017 05:47:32 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[DevOps Tools]]></category>
		<category><![CDATA[Chef]]></category>
		<category><![CDATA[Chef configuration]]></category>
		<category><![CDATA[Chef Development Kit]]></category>
		<category><![CDATA[configuration management]]></category>
		<category><![CDATA[tutorial]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=1826</guid>

					<description><![CDATA[Learn how to install Chef Development Kit, write your first recipe, and run chef-client in local mode on CentOS Linux 7 — a step-by-step guide for ops engineers getting started with Chef configuration management.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Chef is a powerful infrastructure-as-code tool for configuration management. Because it offers so many potential configuration options, ops engineers can struggle to know where to begin. This tutorial walks through a minimal but functional Chef setup — installing the Chef Development Kit (Chef DK), writing a simple recipe, and running it using Chef Zero in local mode, all on a single CentOS 7 machine.</p>




<p class="wp-block-paragraph"><strong>Note:</strong> This tutorial is based on a TechTarget walkthrough originally published in 2017, using Chef client version 12.18.31 on CentOS Linux 7. Some tooling details (such as Chef DK packaging and commands) may differ in newer Chef versions. Always consult the <a href="https://docs.chef.io/" rel="noopener noreferrer" target="_blank">official Chef documentation</a> for current installation instructions.</p>




<h2 class="wp-block-heading">Architecture Overview</h2>



<p class="wp-block-paragraph">A complete Chef environment typically consists of three components:</p>



<ul class="wp-block-list">
<li><strong>Chef Server</strong> — the central repository for cookbooks, node data, and policy</li>
<li><strong>Workstation</strong> — the machine where you write and upload cookbooks using the <code>knife</code> CLI</li>
<li><strong>Managed Nodes</strong> — target machines where the Chef client applies configuration</li>
</ul>



<p class="wp-block-paragraph">To keep this tutorial self-contained, all three roles run on a single machine. Chef Zero, a lightweight in-memory Chef server included with Chef DK, replaces a full Chef Server for local development and testing.</p>



<h2 class="wp-block-heading">Step 1: Install Chef Development Kit</h2>



<p class="wp-block-paragraph">Chef DK is a cross-platform package available from the Chef website. It bundles the Chef client, Chef Zero, the <code>knife</code> CLI, and supporting tools such as Test Kitchen and Berkshelf.</p>



<ul class="wp-block-list">
<li><strong>macOS and Windows:</strong> Chef DK ships with a graphical installer.</li>
<li><strong>Linux (CentOS/RHEL):</strong> Download the RPM package, install it with <code>rpm</code> or <code>yum</code>, then verify the installation.</li>
</ul>



<p class="wp-block-paragraph">After installation, confirm that Chef is available by checking the version:</p>


<pre class="wp-block-code"><span><code class="hljs">chef -v</code></span></pre>


<h3 class="wp-block-heading">Configure the Shell Environment</h3>



<p class="wp-block-paragraph">Chef DK installs its own Ruby runtime and tools into an isolated directory. To make them visible in your shell session, initialise the Chef shell environment:</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-built_in">eval</span> <span class="hljs-string">"$(chef shell-init bash)"</span></code></span></pre>


<p class="wp-block-paragraph">On RHEL/CentOS 7 with Bash, the command above sets the correct <code>PATH</code> and environment variables for the duration of your session. Add it to your <code>~/.bashrc</code> to make it persistent.</p>



<h3 class="wp-block-heading">Install Git</h3>



<p class="wp-block-paragraph">Chef repositories are typically managed with Git. Install it with:</p>


<pre class="wp-block-code"><span><code class="hljs">yum install git-all -y</code></span></pre>


<p class="wp-block-paragraph">No additional Git configuration is required for this tutorial.</p>



<h2 class="wp-block-heading">Step 2: Generate a Chef Repository and Cookbook</h2>



<p class="wp-block-paragraph">Chef organises configuration instructions into <strong>cookbooks</strong>, which contain <strong>recipes</strong>. The <code>chef generate</code> command scaffolds the directory structure for you.</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">chef generate app myapp --email <span class="hljs-string">"yourmail@example.com"</span></code></span></pre>


<p class="wp-block-paragraph">This creates a <code>myapp/</code> directory tree. The default recipe is located at:</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">myapp/cookbooks/myapp/recipes/<span class="hljs-keyword">default</span>.rb</code></span></pre>


<h3 class="wp-block-heading">Listing 1: Initial default.rb Content</h3>



<p class="wp-block-paragraph">After generation, the file contains only a header comment block:</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#</span>
<span class="hljs-comment"># Cookbook:: myapp</span>
<span class="hljs-comment"># Recipe:: default</span>
<span class="hljs-comment">#</span>
<span class="hljs-comment"># Copyright:: 2017, The Authors, All Rights Reserved.</span></code></span></pre>


<h2 class="wp-block-heading">Step 3: Write Your First Recipe</h2>



<p class="wp-block-paragraph">Chef recipes use a Ruby-based DSL built around <strong>resources</strong> — declarative descriptions of the desired state of a system component. Add the following resource declaration to the end of <code>default.rb</code>:</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">file <span class="hljs-string">'/tmp/cheffile.txt'</span> <span class="hljs-keyword">do</span>
  <span class="hljs-attr">action</span> :create
  content <span class="hljs-string">'Chef example file'</span>
end</code></span></pre>


<p class="wp-block-paragraph">This tells Chef to ensure that the file <code>/tmp/cheffile.txt</code> exists and contains the text <code>Chef example file</code>. If the file does not exist, Chef creates it. If it exists with different content, Chef updates it. This idempotent behaviour is a core principle of Chef configuration management.</p>



<h2 class="wp-block-heading">Step 4: Run the Recipe with chef-client in Local Mode</h2>



<p class="wp-block-paragraph">From the directory containing <code>default.rb</code>, run:</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">chef-client --local-mode $(pwd)/<span class="hljs-keyword">default</span>.rb</code></span></pre>


<p class="wp-block-paragraph">The <code>--local-mode</code> flag tells the Chef client to use Chef Zero as an in-process server rather than connecting to a remote Chef Server. This is ideal for development and testing.</p>



<h3 class="wp-block-heading">Listing 2: chef-client Output</h3>



<p class="wp-block-paragraph">The output is verbose by design — Chef logs each action it takes. A successful run on CentOS 7 with Chef 12.18.31 produces output similar to the following:</p>


<pre class="wp-block-code"><span><code class="hljs language-php">&#91;root@sander recipes]<span class="hljs-comment"># chef-client --local-mode $(pwd)/default.rb</span>
&#91;<span class="hljs-number">2017</span><span class="hljs-number">-04</span><span class="hljs-number">-05</span>T12:<span class="hljs-number">47</span>:<span class="hljs-number">57</span>+<span class="hljs-number">02</span>:<span class="hljs-number">00</span>] WARN: No config file found <span class="hljs-keyword">or</span> specified on command line, using command line options.
&#91;<span class="hljs-number">2017</span><span class="hljs-number">-04</span><span class="hljs-number">-05</span>T12:<span class="hljs-number">47</span>:<span class="hljs-number">57</span>+<span class="hljs-number">02</span>:<span class="hljs-number">00</span>] INFO: Forking chef instance to converge...
Starting Chef Client, version <span class="hljs-number">12.18</span><span class="hljs-number">.31</span>
&#91;<span class="hljs-number">2017</span><span class="hljs-number">-04</span><span class="hljs-number">-05</span>T12:<span class="hljs-number">47</span>:<span class="hljs-number">57</span>+<span class="hljs-number">02</span>:<span class="hljs-number">00</span>] INFO: *** Chef <span class="hljs-number">12.18</span><span class="hljs-number">.31</span> ***
&#91;<span class="hljs-number">2017</span><span class="hljs-number">-04</span><span class="hljs-number">-05</span>T12:<span class="hljs-number">47</span>:<span class="hljs-number">57</span>+<span class="hljs-number">02</span>:<span class="hljs-number">00</span>] INFO: Platform: x86_64-linux
&#91;<span class="hljs-number">2017</span><span class="hljs-number">-04</span><span class="hljs-number">-05</span>T12:<span class="hljs-number">47</span>:<span class="hljs-number">57</span>+<span class="hljs-number">02</span>:<span class="hljs-number">00</span>] INFO: Chef-client pid: <span class="hljs-number">24793</span>
&#91;<span class="hljs-number">2017</span><span class="hljs-number">-04</span><span class="hljs-number">-05</span>T12:<span class="hljs-number">48</span>:<span class="hljs-number">15</span>+<span class="hljs-number">02</span>:<span class="hljs-number">00</span>] INFO: Run <span class="hljs-keyword">List</span> is &#91;]
&#91;<span class="hljs-number">2017</span><span class="hljs-number">-04</span><span class="hljs-number">-05</span>T12:<span class="hljs-number">48</span>:<span class="hljs-number">15</span>+<span class="hljs-number">02</span>:<span class="hljs-number">00</span>] INFO: Run <span class="hljs-keyword">List</span> expands to &#91;]
&#91;<span class="hljs-number">2017</span><span class="hljs-number">-04</span><span class="hljs-number">-05</span>T12:<span class="hljs-number">48</span>:<span class="hljs-number">15</span>+<span class="hljs-number">02</span>:<span class="hljs-number">00</span>] INFO: Starting Chef Run <span class="hljs-keyword">for</span> sander.example.com
...
Converging <span class="hljs-number">1</span> resources
Recipe: @recipe_files::/home/user/Downloads/myapp/cookbooks/myapp/recipes/<span class="hljs-keyword">default</span>.rb
  * file&#91;/tmp/cheffile.txt] action create
    - create <span class="hljs-keyword">new</span> file /tmp/cheffile.txt
    - update content in file /tmp/cheffile.txt from none to <span class="hljs-number">2</span>ccbda
    --- /tmp/cheffile.txt    <span class="hljs-number">2017</span><span class="hljs-number">-04</span><span class="hljs-number">-05</span> <span class="hljs-number">12</span>:<span class="hljs-number">48</span>:<span class="hljs-number">15.657202657</span> +<span class="hljs-number">0200</span>
    +++ /tmp/.chef-cheffile20170405<span class="hljs-number">-24793</span>-wufglh.txt <span class="hljs-number">2017</span><span class="hljs-number">-04</span><span class="hljs-number">-05</span> <span class="hljs-number">12</span>:<span class="hljs-number">48</span>:<span class="hljs-number">15.655202665</span> +<span class="hljs-number">0200</span>
    @@ <span class="hljs-number">-1</span> +<span class="hljs-number">1</span>,<span class="hljs-number">2</span> @@
    +Chef example file
    - restore selinux security context
&#91;<span class="hljs-number">2017</span><span class="hljs-number">-04</span><span class="hljs-number">-05</span>T12:<span class="hljs-number">48</span>:<span class="hljs-number">15</span>+<span class="hljs-number">02</span>:<span class="hljs-number">00</span>] INFO: Chef Run complete in <span class="hljs-number">0.194898281</span> seconds
Chef Client finished, <span class="hljs-number">1</span>/<span class="hljs-number">1</span> resources updated in <span class="hljs-number">18</span> seconds</code></span></pre>


<p class="wp-block-paragraph">Key lines to note:</p>



<ul class="wp-block-list">
<li><strong>&#8220;Converging 1 resources&#8221;</strong> — Chef found one resource to evaluate (the <code>file</code> resource).</li>
<li><strong>&#8220;create new file /tmp/cheffile.txt&#8221;</strong> — Chef created the file because it did not previously exist.</li>
<li><strong>&#8220;restore selinux security context&#8221;</strong> — On SELinux-enabled systems (like CentOS 7), Chef automatically restores the correct SELinux context after creating or modifying files.</li>
<li><strong>&#8220;1/1 resources updated&#8221;</strong> — All resources were successfully converged.</li>
</ul>



<h2 class="wp-block-heading">Step 5: Extend the Recipe — Installing and Starting a Service</h2>



<p class="wp-block-paragraph">Once you are comfortable with the basic workflow, you can manage packages and services. The following recipe snippet installs NGINX and ensures it is enabled and running:</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">package <span class="hljs-string">'nginx'</span> <span class="hljs-keyword">do</span>
  <span class="hljs-attr">action</span> :install
end

service <span class="hljs-string">'nginx'</span> <span class="hljs-keyword">do</span>
  action &#91;:enable, :start]
end</code></span></pre>


<p class="wp-block-paragraph">Add these blocks to <code>default.rb</code> after the <code>file</code> resource and re-run <code>chef-client --local-mode</code>. Chef will install NGINX via <code>yum</code> on CentOS 7, enable the systemd unit, and start the service — in a single idempotent run.</p>



<h2 class="wp-block-heading">Moving to a Production Chef Environment</h2>



<p class="wp-block-paragraph">Local mode with Chef Zero is intended for development and learning. A production Chef environment requires a Chef Server to manage multiple nodes, store cookbooks centrally, and handle authentication via SSL certificates. You have two primary options:</p>



<ul class="wp-block-list">
<li><strong>Self-hosted Chef Server:</strong> Install and operate a Chef Server on your own infrastructure (on-premises or in a private cloud).</li>
<li><strong>Chef SaaS / Hosted Chef:</strong> Use Progress Chef&#8217;s hosted offering, where you create an account, upload cookbooks with <code>knife cookbook upload</code>, and register nodes against the hosted endpoint.</li>
</ul>



<p class="wp-block-paragraph">Major public cloud providers, including AWS and Microsoft Azure, also offer marketplace integrations and managed Chef Server options to simplify infrastructure management at scale.</p>



<h2 class="wp-block-heading">Summary</h2>



<p class="wp-block-paragraph">This tutorial covered the essential steps to get started with Chef configuration management on a single CentOS 7 machine:</p>



<ol class="wp-block-list">
<li>Install Chef DK and configure the shell environment.</li>
<li>Install Git and generate a Chef repository with <code>chef generate app</code>.</li>
<li>Write a simple <code>file</code> resource in a recipe&#8217;s <code>default.rb</code>.</li>
<li>Execute the recipe with <code>chef-client --local-mode</code> and validate the output.</li>
<li>Extend the recipe to manage packages and services (NGINX example).</li>
</ol>



<p class="wp-block-paragraph">From here, explore <strong>attributes</strong>, <strong>templates</strong>, <strong>data bags</strong>, and <strong>roles</strong> to build production-grade cookbooks. The <a href="https://docs.chef.io/" rel="noopener noreferrer" target="_blank">Chef documentation</a> is the authoritative reference for all these concepts.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/try-this-simple-chef-configuration-tutorial/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Roll DevOps tools into your AWS migration plan</title>
		<link>https://www.bestdevops.com/roll-devops-tools-into-your-aws-migration-plan/</link>
					<comments>https://www.bestdevops.com/roll-devops-tools-into-your-aws-migration-plan/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Tue, 23 May 2017 06:54:30 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[DevOps Tools]]></category>
		<category><![CDATA[(CI/CD)]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[AWS migration]]></category>
		<category><![CDATA[BestDevOps]]></category>
		<category><![CDATA[configuration management]]></category>
		<category><![CDATA[infrastructure as code]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=1600</guid>

					<description><![CDATA[Source &#8211; techtarget.com accelerated dePublic cloud platforms such as AWS have changed how many businesses develop applications. Cloud affords development times &#8212; [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Source &#8211; techtarget.com</p>
<p>accelerated dePublic cloud platforms such as AWS have changed how many businesses develop applications. Cloud affords development times &#8212; and enables some dev teams to release new features and app updates multiple times a day. But none of this would be possible without a vast array of DevOps tools and services.</p>
<p>After an AWS migration, businesses can model their infrastructure as code (IaC), build and test code with managed services and automate deployments using continuous integration (CI) and continuous delivery (CD) orchestration services. Enterprises that haven&#8217;t yet embraced cloud, however, have a long wait before they can see the benefits of using AWS DevOps tools. But before IT teams become technically proficient with AWS tools and services, they must make a cultural shift and change the way they think about traditional deployments.</p>
<p>Businesses should devise a strategy to take advantage of the new capabilities that are available after moving to AWS. Businesses can reach improved levels of operational maturity post-AWS migration, but it takes commitment and know-how from all lines of business.</p>
<section class="section main-article-chapter" data-menu-title="Define infrastructure as code for resiliency">
<h3 class="section-title">Define infrastructure as code for resiliency</h3>
<p>Operations engineers who work in on-premises data centers spend a lot of time writing server build documents that ensure other IT staff members follow the steps to properly deploy businesses workloads. But this approach has potential problems. Step-by-step documents go out of date quickly. And humans make mistakes, especially when they get tired and are reading through a long build document.</p>
<section class="section main-article-chapter" data-menu-title="Define infrastructure as code for resiliency">Using IaC during an AWS deployment means replacing old server build documents with a declarative template that can provision any AWS resource as needed. IaC templates become executable versions of those documents.</p>
<p>Administrators can author IaC templates with AWS CloudFormation and then store them in a version control service, such as AWS CodeCommit or GitHub. Once the admin defines IaC, the IT team can build a replica of the production environment for testing; this provides an exact infrastructure blueprint in case teams ever need to rebuild the infrastructure.</p>
</section>
<section class="section main-article-chapter" data-menu-title="Embrace configuration management early in an AWS migration">
<h3 class="section-title">Embrace configuration management early in an AWS migration</h3>
<p>While admins can use IaC templates to provision AWS infrastructure, they will likely have to run multiple server operating systems on various Elastic Compute Cloud (EC2) instances. Before automating deployments with code, developers and admins need to be up to speed with the concept of configuration management (CM). Many IT teams already use CM tools, which provide a way to automate the configuration of applications and the OS. In addition, CM tools can prevent configuration drift &#8212; server or application settings changing over time on a system because of a mistake or the installation of another application.</p>
<section class="section main-article-chapter" data-menu-title="Embrace configuration management early in an AWS migration">AWS integrates with all CM tools as well as OpsWorks, the configuration management service based on Chef. Amazon EC2 Systems Manager works as a Chef alternative to automate system patching, build and query inventories and automate the execution of any command with its Run Command feature. This enables admins to use existing CM assets or EC2 Systems Manager with Run Command and a State Manager feature to consistently configure applications and eliminate configuration drift.</p>
</section>
<section class="section main-article-chapter" data-menu-title="Enforce compliance through policy as code">
<h3 class="section-title">Enforce compliance through policy as code</h3>
<p>Beware of unexpected server or application settings that can take down an application. Automated compliance controls in AWS can prevent these problems, and enterprises should implement them shortly after an AWS migration.</p>
<p>One such service, AWS Config, takes inventory on AWS resources. In addition, AWS Config Rules ensures that resources comply with a desired state. AWS records state changes and alerts an IT team whenever a user creates, deletes or modifies any AWS resource.</p>
</section>
<section class="section main-article-chapter" data-menu-title="Implement monitoring and logging">
<h3 class="section-title">Implement monitoring and logging</h3>
<p>It&#8217;s important to collect and monitor application performance information and log files. Amazon CloudWatch collects performance metrics from all types of systems and monitors log files. IT teams receive alerts when system performance lags or when errors occur in log files. CloudWatch metrics and alarms also play key roles in Auto Scaling servers based on resource utilization. For example, admins can create a CloudWatch Alarm that triggers a scale-out action to deploy additional EC2 instances when CPU use on existing servers rises above a certain threshold. Alternatively, configure a scale-in action to delete additional capacity when the resource demand drops back down.</p>
<p>IT teams can also tap into event-based automation capabilities. Admins can configure CloudWatch Events with rules that trigger custom logic when changes are made to resources. Use state-changes data from various services as the source of these rules; this includes activity, such as launching EC2 instances or signing into the AWS Management Console. Configure rules with targets that can take an action on these events. Common actions use AWS Lambda functions with custom logic or Simple Notification Service topics that send an IT team a notification about the event.</p>
</section>
</section>
</section>
<h3 class="section-title"></h3>
<h3 class="section-title">Use CI and CD</h3>
<p>CI is useful when merging small changes to code into a central repository. Admins then can run automated builds and unit tests to compile applications and ensure the code works as expected. This process helps to quickly identify bugs and improve software quality.</p>
<p>CD takes CI a step further. The CD process ensures that the code is ready to move to development or staging for further testing. Once all tests have passed, the latest version of the application is deployable to production.</p>
<p>Businesses can implement CI and CD with AWS-native services. AWS CodeCommit works as a secure version-control repository; AWS CodeBuild automatically performs builds when code enters the repository. AWS CodePipeline makes sure committed code is automatically built, tested and deployed into testing or staging environments, which ties together the various CI and CD services.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/roll-devops-tools-into-your-aws-migration-plan/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Automating Configuration Management for DevOps Test Environments</title>
		<link>https://www.bestdevops.com/automating-configuration-management-for-devops-test-environments/</link>
					<comments>https://www.bestdevops.com/automating-configuration-management-for-devops-test-environments/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Tue, 31 Jan 2017 07:49:04 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[DevOps Best Practices]]></category>
		<category><![CDATA[DevOps Process]]></category>
		<category><![CDATA[Test Driven DevOps]]></category>
		<category><![CDATA[Automating]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[configuration management]]></category>
		<category><![CDATA[Environment Management]]></category>
		<category><![CDATA[Test Environments]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=472</guid>

					<description><![CDATA[Manual configuration management is a bottleneck in cloud-based DevOps pipelines. Learn how automated CM tools like Puppet, Chef, Ansible, and Salt help teams provision consistent test environments on demand and accelerate delivery.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>This article is based on a white paper originally published by Capgemini covering configuration management challenges in cloud-based DevOps test environments.</em></p>



<h2 class="wp-block-heading">Background: Why Configuration Management Matters in Modern DevOps</h2>



<p class="wp-block-paragraph">The shift toward customer-centric digital businesses, combined with the adoption of agile and DevOps practices, has accelerated enterprise migration to cloud platforms. Moving legacy IT systems to the cloud offers clear advantages: global development reach, shorter deployment cycles, and faster time to market for new features.</p>



<p class="wp-block-paragraph">From a quality assurance perspective, this shift places new demands on test environment management. Testers need environments that spin up quickly, match production configurations accurately, and remain consistent across iterations. In traditional software development, configuration management (CM) was largely a manual discipline focused on maintaining the consistency of a platform&#8217;s functional and physical attributes. In a cloud-native DevOps context, that manual approach becomes a significant bottleneck.</p>



<p class="wp-block-paragraph">Modern projects require automated environment provisioning that is both instantaneous and repeatable — ensuring that each new environment mirrors its predecessors exactly. Configuration management is therefore a foundational challenge when building a robust test environment management framework on cloud infrastructure.</p>



<h2 class="wp-block-heading">Types of Test Environments</h2>



<p class="wp-block-paragraph">Test environments in cloud-based DevOps pipelines generally fall into several categories. According to the World Quality Report 2016, testing typically occurs across the following environment types:</p>



<ul class="wp-block-list">
<li><strong>Permanent, cloud-based environments:</strong> Long-lived environments hosted on cloud infrastructure, used for sustained integration or regression testing.</li>
<li><strong>Temporary, cloud-based environments:</strong> On-demand environments that are provisioned for a specific test run and then decommissioned to reduce cost.</li>
<li><strong>Virtualized test environments:</strong> Environments running on virtual machines or containers, enabling rapid cloning and parallel test execution.</li>
<li><strong>Temporary, non-cloud environments:</strong> Short-lived environments built on on-premises infrastructure for isolated or compliance-driven testing scenarios.</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter"><img decoding="async" src="https://www.bestdevops.com/wp-content/uploads/2017/01/test-environment-types.jpg" alt="Diagram illustrating the different types of test environments used in DevOps projects" /></figure>
</div>


<h2 class="wp-block-heading">Configuration and Environment Management on Cloud: Scope and Challenges</h2>



<p class="wp-block-paragraph">A well-defined configuration management policy is central to determining whether test environments are genuinely ready to operate in the cloud. The scope of CM services for test environments covers three core activities:</p>



<ol class="wp-block-list">
<li>Defining and implementing configuration management policies</li>
<li>Establishing reference configurations for each environment type</li>
<li>Developing and maintaining a configuration management plan</li>
</ol>



<p class="wp-block-paragraph">Beyond these strategic activities, day-to-day CM operations for test environments typically include:</p>



<ul class="wp-block-list">
<li>Administering the configuration management toolset</li>
<li>Monitoring and continuously improving CM processes and assets</li>
<li>Validating and deploying software releases</li>
<li>Promoting configuration changes across development, testing, staging, and production environments</li>
<li>Automating configuration deployment and compliance reporting tasks</li>
<li>Validating and publishing release notes</li>
</ul>



<p class="wp-block-paragraph">The primary objective of test environment management is fast setup time combined with on-demand availability. Meeting this objective requires accelerating the deployment pipeline and stabilising environments at each stage. Delays in promoting code from development through testing to staging must be eliminated through automation.</p>



<p class="wp-block-paragraph">The World Quality Report 2016 identified managing multiple versions of ERP test environments as a persistent challenge, attributing much of the difficulty to the absence of automated CM tooling for cloud-hosted test environments.</p>



<h2 class="wp-block-heading">Building an Automated Configuration Management Toolset</h2>



<p class="wp-block-paragraph">The foundation of automated CM for test environments is a toolset capable of discovering system state, generating compliance reports, and executing configuration changes consistently across environments. The following step-by-step approach provides a practical implementation path:</p>



<ol class="wp-block-list">
<li><strong>Identify configuration items (CIs):</strong> Catalogue the OS-level items (firewall rules, hostnames, network settings) and application-level items that need to be managed and tracked.</li>
<li><strong>Select and install a CM tool:</strong> Choose a configuration management engine suited to your stack and team skill set. Common options include <a href="https://www.puppet.com/">Puppet</a>, <a href="https://www.chef.io/">Chef</a>, <a href="https://www.ansible.com/">Ansible</a>, and <a href="https://saltproject.io/">Salt</a>. Each uses a different paradigm (agent-based vs. agentless, declarative vs. procedural), so evaluate them against your environment constraints.</li>
<li><strong>Integrate supporting tooling:</strong> Connect your CM tool to version control (Git), a CI server (Jenkins), and a build tool (Maven or equivalent) to create a fully automated pipeline from code commit to environment deployment.</li>
<li><strong>Generate baseline reports:</strong> Produce &#8220;as-is&#8221; configuration reports to document the current state of all managed environments before making changes.</li>
<li><strong>Write deployment scripts:</strong> Build CM scripts (Puppet manifests, Chef cookbooks, Ansible playbooks, or Salt states) that codify desired environment configurations.</li>
<li><strong>Establish an automated deployment workflow:</strong> Define the promotion workflow so that tested configurations move automatically from development to test to staging environments with minimal manual intervention.</li>
<li><strong>Document procedures:</strong> Record deployment procedures, rollback plans, and environment specifications so the process is repeatable by any team member.</li>
<li><strong>Release for operational use:</strong> Publish the validated CM scripts and workflows for use by development, QA, and operations teams.</li>
</ol>


<div class="wp-block-image">
<figure class="aligncenter"><img decoding="async" src="https://www.bestdevops.com/wp-content/uploads/2017/01/configuration-management-tools.jpg" alt="Diagram showing common tools used for configuration management automation in DevOps pipelines" /></figure>
</div>


<h2 class="wp-block-heading">Choosing the Right Configuration Management Tool</h2>



<p class="wp-block-paragraph">The four most widely adopted open-source CM tools each have distinct characteristics worth understanding before committing to one:</p>



<figure class="wp-block-table"><table><thead><tr><th>Tool</th><th>Architecture</th><th>Language</th><th>Best suited for</th></tr></thead><tbody><tr><td>Puppet</td><td>Agent/master</td><td>Puppet DSL (Ruby-based)</td><td>Large, heterogeneous infrastructure with strong compliance requirements</td></tr><tr><td>Chef</td><td>Agent/server</td><td>Ruby</td><td>Teams comfortable with Ruby and needing fine-grained control</td></tr><tr><td>Ansible</td><td>Agentless (SSH)</td><td>YAML</td><td>Rapid adoption, simpler environments, no agent overhead</td></tr><tr><td>Salt</td><td>Agent/master or agentless</td><td>Python/YAML</td><td>High-speed execution at scale, event-driven automation</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">In practice, many teams combine tools: for example, using Terraform for infrastructure provisioning, Ansible for configuration management, and Jenkins for orchestrating the end-to-end pipeline.</p>



<h2 class="wp-block-heading">Benefits of Automating Configuration Management</h2>



<p class="wp-block-paragraph">Automating configuration management across test environments delivers measurable improvements to DevOps delivery pipelines:</p>



<ul class="wp-block-list">
<li><strong>Consistency and repeatability:</strong> Codified configurations eliminate environment drift, ensuring that every provisioned environment is identical to its predecessors.</li>
<li><strong>Faster environment provisioning:</strong> On-demand spin-up and teardown reduces idle environment costs and unblocks testers waiting for environments.</li>
<li><strong>Better pipeline control and asset utilisation:</strong> Automated management improves visibility into environment state, enabling smarter scheduling and reducing total cost of ownership (TCO).</li>
<li><strong>Improved productivity:</strong> Integrating health checks and smoke tests (shakedowns) into automated build and deployment workflows means teams spend less time diagnosing environment issues and more time testing product functionality.</li>
<li><strong>Audit and compliance:</strong> Automated CM reports provide an auditable record of configuration state at every stage of the pipeline.</li>
</ul>



<h2 class="wp-block-heading">Conclusion</h2>



<p class="wp-block-paragraph">As cloud adoption accelerates and DevOps pipelines grow in complexity, manual configuration management can no longer keep pace. Automating CM across test environments — using tools like Puppet, Chef, Ansible, or Salt, integrated with Git, Jenkins, and complementary tooling — enables teams to provision consistent, on-demand environments at the speed the business demands. The result is a more focused development and testing practice with lower operational overhead and higher confidence in release quality.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/automating-configuration-management-for-devops-test-environments/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Habitat Application Portability and Understanding Dynamic Linking of ELF Binaries</title>
		<link>https://www.bestdevops.com/habitat-application-portability-and-understanding-dynamic-linking-of-elf-binaries/</link>
					<comments>https://www.bestdevops.com/habitat-application-portability-and-understanding-dynamic-linking-of-elf-binaries/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Fri, 13 Jan 2017 16:51:07 +0000</pubDate>
				<category><![CDATA[Continuous Delivery]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[DevOps Updates]]></category>
		<category><![CDATA[application]]></category>
		<category><![CDATA[binaries]]></category>
		<category><![CDATA[Chef]]></category>
		<category><![CDATA[configuration management]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[linking]]></category>
		<category><![CDATA[portability]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=335</guid>

					<description><![CDATA[Learn how Chef Habitat uses dynamic linking and ELF binary metadata to guarantee that the exact dependencies linked at build time are loaded at runtime, enabling true application portability across Linux environments.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>This article is based on a post originally published on blog.chef.io and expanded for a DevOps engineering audience.</em></p>



<h2 class="wp-block-heading">Background: Why Native Binary Dependencies Are Complicated</h2>



<p class="wp-block-paragraph">If your primary experience is with managed-runtime languages — Java, C#, Ruby — or with Windows development, you may never have had to think deeply about how a compiled binary finds its dependencies at runtime on Linux. On Windows, finding a missing low-level dependency usually means downloading an MSI and moving on. The situation on Linux is meaningfully different, and understanding it is essential for anyone building software with <a href="https://www.habitat.sh/">Chef Habitat</a>.</p>



<p class="wp-block-paragraph">This article explains the fundamentals of ELF binaries, static versus dynamic linking, and how Habitat exploits dynamic linking to deliver genuine, dependency-complete application portability.</p>



<h2 class="wp-block-heading">What Is an ELF Binary?</h2>



<p class="wp-block-paragraph"><strong>ELF</strong> stands for <strong>Executable and Linkable Format</strong>. It is the standard binary format used for executables, shared libraries, and object files on Linux and most Unix-like systems. An ELF file is structured as a set of headers followed by named sections (commonly <code>.text</code> for machine instructions, <code>.data</code> for initialised data, and so on).</p>



<p class="wp-block-paragraph">One of the most important jobs of an ELF binary is to tell the operating system how to load the program into memory and which external symbols (functions, variables) must be resolved before the program can run. That information lives in dedicated ELF sections and is read by the dynamic linker — typically <code>ld-linux.so</code> — every time the binary is executed.</p>



<h2 class="wp-block-heading">Compiling vs. Linking: Two Distinct Steps</h2>



<p class="wp-block-paragraph">Developers often use the word &#8220;compiling&#8221; to mean the whole build process, but there are actually two separate operations:</p>



<ul class="wp-block-list">
<li><strong>Compiling</strong> — The compiler reads source code files and translates them into machine-language <em>object files</em> (<code>.o</code> files). Object files on their own cannot be executed.</li>
<li><strong>Linking</strong> — The linker (<code>ld</code> on Linux) takes one or more object files, resolves references to external libraries, and produces a final executable or shared library. If your code calls a function from an external library and that function cannot be found, the linker — not the compiler — reports the error.</li>
</ul>



<h2 class="wp-block-heading">Static vs. Dynamic Linking</h2>



<h3 class="wp-block-heading">Static Linking</h3>



<p class="wp-block-paragraph">In static linking, the machine code from every external library is copied directly into the final executable. The result is a single, self-contained binary with no runtime dependency on external shared object files. Static binaries are easy to deploy, but they are larger and must be recompiled and redeployed whenever a dependency is updated (for example, to patch a security vulnerability).</p>



<h3 class="wp-block-heading">Dynamic Linking</h3>



<p class="wp-block-paragraph">Dynamic linking keeps external code outside the executable. Instead of embedding library code, the linker writes metadata into the ELF binary that names the required shared object files (<code>.so</code> on Linux, <code>.dll</code> on Windows). When the binary is executed, the operating system&#8217;s dynamic linker reads that metadata and loads the correct shared libraries into the process at runtime.</p>



<p class="wp-block-paragraph">The benefits of dynamic linking include:</p>



<ul class="wp-block-list">
<li>Smaller application binaries, because library code is not duplicated.</li>
<li>The ability to update a shared library across all applications that use it without recompiling any of them.</li>
<li>Memory efficiency, because the OS can share a single copy of a loaded library between multiple running processes.</li>
</ul>



<p class="wp-block-paragraph">The trade-off is that the correct version of every required shared library must be present on the target machine at runtime. This is the classic source of &#8220;it works on my machine&#8221; deployment failures.</p>



<h2 class="wp-block-heading">How the Linux Dynamic Linker Finds Shared Libraries</h2>



<p class="wp-block-paragraph">The linker (<code>ld</code>) and the runtime dynamic linker (<code>ld-linux.so</code>) follow a strict, ordered set of rules when searching for shared libraries. Understanding this order is critical for diagnosing dependency errors and for understanding how Habitat controls the process. The following search order is taken directly from the <code>ld</code> man page:</p>



<ol class="wp-block-list">
<li>Directories specified by <code>-rpath-link</code> options (link time only; not embedded in the binary).</li>
<li>Directories specified by <code>-rpath</code> options (embedded in the ELF binary and honoured at runtime).</li>
<li>The contents of the <code>LD_RUN_PATH</code> environment variable, if <code>-rpath</code> and <code>-rpath-link</code> were not used (ELF, native linkers only).</li>
<li>On SunOS, directories specified by <code>-L</code> options if <code>-rpath</code> was not used.</li>
<li>The contents of the <code>LD_LIBRARY_PATH</code> environment variable (native linkers).</li>
<li>The <code>DT_RUNPATH</code> or <code>DT_RPATH</code> entries inside a shared library being loaded (<code>DT_RPATH</code> is ignored if <code>DT_RUNPATH</code> is present).</li>
<li>The default system directories: normally <code>/lib</code> and <code>/usr/lib</code>.</li>
<li>Directories listed in <code>/etc/ld.so.conf</code> (ELF systems with a native linker).</li>
</ol>



<p class="wp-block-paragraph">Two entries in this list are especially important for Habitat: <strong><code>-rpath</code></strong> (step 2) and <strong><code>DT_RUNPATH</code>/<code>DT_RPATH</code></strong> (step 6). Both allow a path to be baked directly into an ELF binary so that the runtime linker knows exactly where to look — regardless of what is installed in <code>/usr/lib</code> or what <code>LD_LIBRARY_PATH</code> says.</p>



<h2 class="wp-block-heading">The Dependency Problem in Traditional Linux Deployments</h2>



<p class="wp-block-paragraph">Consider a common scenario: your application depends on the ZeroMQ library. During development you run <code>apt-get install libzmq-dev</code> and the library lands somewhere under <code>/usr</code>. Your application builds and runs. When you promote to production, you (or your configuration management tool) must ensure that the same library — ideally at the same version — is installed on every production node.</p>



<p class="wp-block-paragraph">This is fragile for several reasons:</p>



<ul class="wp-block-list">
<li>Different Linux distributions package different versions of the same library.</li>
<li>Two applications on the same node may require different, incompatible versions of the same library. Most package managers cannot install multiple versions of a library into <code>/usr/lib</code> simultaneously.</li>
<li>Configuration management tools such as Chef can enforce that a specific version is installed, but they cannot easily manage version conflicts between co-located applications.</li>
</ul>



<h2 class="wp-block-heading">How Habitat Solves the Problem with Dynamic Linking</h2>



<h3 class="wp-block-heading">Dependencies Travel with the Application</h3>



<p class="wp-block-paragraph">Habitat packages applications as <code>.hart</code> files. When a Habitat package is installed, Habitat also installs every package listed in the application&#8217;s dependency manifest. These packages are placed under Habitat&#8217;s own root directory (by default <code>/hab/pkgs/</code>), completely separate from the system&#8217;s <code>/usr</code> tree. They do not conflict with system-installed libraries or with libraries belonging to other Habitat-managed applications.</p>



<h3 class="wp-block-heading">Build-Time and Runtime Paths Are the Same</h3>



<p class="wp-block-paragraph">During the Habitat build process, the linker is configured to embed the paths to Habitat-managed dependencies directly into the resulting ELF binary using <code>RPATH</code> or <code>RUNPATH</code> entries. This means that at runtime, the dynamic linker resolves shared libraries from those same Habitat package directories — not from <code>/usr/lib</code> or whatever happens to be on <code>LD_LIBRARY_PATH</code>.</p>



<p class="wp-block-paragraph">The practical consequence: <strong>the exact binaries linked at build time are the exact binaries loaded at runtime</strong>. No separate configuration management layer is needed to enforce this guarantee.</p>



<h3 class="wp-block-heading">Side-by-Side Versioning</h3>



<p class="wp-block-paragraph">Because each Habitat application&#8217;s dependencies live under their own versioned paths within <code>/hab/pkgs/</code>, two applications on the same node can depend on different versions of the same library and run simultaneously without conflict. The RPATH baked into each binary points to its own specific dependency version.</p>



<h2 class="wp-block-heading">The Habitat Studio: Keeping Builds Clean</h2>



<p class="wp-block-paragraph">A potential weakness in this model is the build step itself. If during a build the linker silently falls through to <code>/usr/lib</code> and picks up a system library that is not listed as a Habitat dependency, the resulting binary will have a runtime dependency that Habitat does not know about and will not install. The package would break on any node that does not happen to have that exact system library version installed.</p>



<p class="wp-block-paragraph">Habitat prevents this with the <strong>Studio</strong>: a clean, minimal, isolated build environment. Inside the Studio, system library paths are not available to the linker. The only libraries the linker can find are those explicitly declared as Habitat dependencies in the build plan. If your plan is missing a dependency, the build fails loudly inside the Studio — which is exactly the right behaviour. A build failure during development is far preferable to a mysterious runtime failure in production.</p>



<h2 class="wp-block-heading">Practical Implications for Plan Authors</h2>



<p class="wp-block-paragraph">Understanding the ELF linker search order and how Habitat manipulates it helps you write better build plans and diagnose build failures faster. Key points to keep in mind:</p>



<ul class="wp-block-list">
<li><strong>Declare all dependencies explicitly.</strong> If a library your software needs is not in your plan&#8217;s dependency list, the Studio build will fail. Treat that failure as useful signal, not an annoyance.</li>
<li><strong>Be cautious with build systems that hard-code paths.</strong> CMake files, configure scripts, and downloaded pre-built binaries may expect libraries in <code>/usr/lib</code>. Inside the Habitat Studio those paths do not exist, so such build systems require patching or careful configuration.</li>
<li><strong>Understand <code>-rpath</code> vs <code>LD_LIBRARY_PATH</code>.</strong> Relying on <code>LD_LIBRARY_PATH</code> at runtime is fragile because it can be overridden or unset. Habitat favours embedding paths directly in the binary via <code>RPATH</code>/<code>RUNPATH</code>, which is more robust.</li>
<li><strong>Software that uses non-GCC toolchains adds complexity.</strong> Projects that use Clang or non-standard build systems (such as .NET Core) may download pre-compiled binaries or have build scripts that assume standard filesystem layouts. These require additional work to Habitat-ise correctly.</li>
</ul>



<h2 class="wp-block-heading">Summary</h2>



<p class="wp-block-paragraph">ELF binaries on Linux carry metadata that tells the dynamic linker exactly where to find shared library dependencies at runtime. By controlling that metadata during the Habitat build process — specifically by embedding Habitat package paths into the binary&#8217;s <code>RPATH</code>/<code>RUNPATH</code> — Habitat guarantees that an application always loads the same dependencies it was built against, regardless of what is installed on the host system. The Habitat Studio enforces this at build time by removing access to system library paths entirely. The result is genuine, reproducible application portability: install the <code>.hart</code> package and everything the application needs comes with it.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/habitat-application-portability-and-understanding-dynamic-linking-of-elf-binaries/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
