<?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 tool &#8211; Best DevOps</title>
	<atom:link href="https://www.bestdevops.com/tag/configuration-management-tool/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>Mon, 12 Oct 2026 19:13:01 +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>Where does DevOps start? Not where you think</title>
		<link>https://www.bestdevops.com/where-does-devops-start-not-where-you-think/</link>
					<comments>https://www.bestdevops.com/where-does-devops-start-not-where-you-think/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Tue, 28 Aug 2018 06:22:49 +0000</pubDate>
				<category><![CDATA[Continuous Delivery]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[DevOps Tools]]></category>
		<category><![CDATA[configuration management tool]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=4302</guid>

					<description><![CDATA[Source &#8211; zdnet.com Typically, when people think of initiating DevOps practices, they think about automating infrastructure delivery. However, organizations that have successfully [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img fetchpriority="high" decoding="async" class="alignnone size-medium wp-image-4303" src="http://www.bestdevops.com/wp-content/uploads/2018/08/devops-2-300x169.jpg" alt="" width="300" height="169" /></p>
<p>Source &#8211; zdnet.com</p>
<p>Typically, when people think of initiating DevOps practices, they think about automating infrastructure delivery. However, organizations that have successfully adopted DevOps typically go through a number of other specific steps before reaching that point, according to new research from Puppet.</p>
<p>&#8220;In a DevOps evolution, there are many paths to success but many more to failure,&#8221; Alanna Brown, Puppet&#8217;s director of product marketing, said to ZDNet. Organizations of all kinds, she said, &#8220;share the same set of challenges as they&#8217;re starting to adopt DevOps practices. If they lack the necessary support, if there are organizational roadblocks&#8230; all these things can kill early momentum and lead to cynicism.&#8221;</p>
<p>So with Puppet&#8217;s seventh annual State of DevOps report, shared before its release with <em>ZDNet</em>, Puppet decided to use its findings to develop a prescriptive path forward for organizations that may be having trouble scaling DevOps across the business.</p>
<p>The report, which will be published on Sept. 12, surveyed about 3,000 tech professionals worldwide about the specific practices they implemented on their DevOps journeys. The findings suggest there are five stages to adopting and scaling DevOps. Puppet ran a factor analysis to determine what two specific business practices represented the defining characteristics of those five stages, revealing 10 key practices along with several other contributing practices.</p>
<p>These stages and their corresponding practices help offer a linear path to scaling DevOps. Stages Two and Three could happen alternatively or simultaneously, but those steps are needed to get to Stage Four&#8211; which is where automating infrastructure delivery comes in.</p>
<p>&#8220;The key is that there is a path to success,&#8221; Brown said.</p>
<p>Here&#8217;s a look at the five stages and the defining practices of each stage:</p>
<h4>1. NORMALIZING THE TECH STACK</h4>
<p>&#8220;This is critical because enterprises are just inherently complex,&#8221; Brown said. In just the past five years, an explosion in technological development and new tools has created a &#8220;one of everything&#8221; problem, she added. Specifically, at this stage, teams are using version control and deploying on a standard set of operating systems.</p>
<h4>2. STANDARDIZE AND REDUCE VARIATION</h4>
<p>Building on Stage 1, teams at this stage typically work on deploying on a single operating system and building on a standard set of technologies, including databases, key value stores and message queues.</p>
<h4>3: EXPANDING DEVOPS PRACTICES</h4>
<p>&#8220;We start to see DevOps practices spread beyond dev and ops teams to other functional boundaries,&#8221; Brown said. &#8220;Individuals can do work without approval from outside their team, deployment patterns are being reused.&#8221;</p>
<p>Working without outside approval is more efficient but &#8220;can only happen after a certain level of trust is built,&#8221; Brown added. &#8220;Trust is built with success &#8212; showing you can deploy an application 10 times without having an incident.&#8221;</p>
<h4>4. AUTOMATING INFRASTRUCTURE DELIVERY</h4>
<p>At this crucial stage &#8212; what many organizations typically consider the beginning of a <a href="https://www.techrepublic.com/article/why-successfully-implementing-devops-requires-a-cultural-change-within-a-company/" target="_blank" rel="noopener noreferrer">DevOps initiative</a> &#8212; teams begin automating resources for broader use, not just use within their own divisions. Provisioning and automating resources across teams &#8220;highlights the need to get executive buy in,&#8221; at this stage, said Andi Mann, chief technology advocate at Splunk, a sponsor of this year&#8217;s survey.</p>
<p>Specifically, the defining practices are automating system configurations and automating provisioning.</p>
<h4>5. PROVIDING SELF-SERVICE CAPABILITIES</h4>
<p>Self service takes root once an organization has laid the groundwork with the other four stages and has established a high degree of trust internally. The defining practices of this stage are automating incident response and making resources available via self service.</p>
<p>To get to automated incident response, Brown said, &#8220;you need to address several manual chokepoints. The team that often is remediating the incident, they often don&#8217;t have access to the data they need, they need to get their access signed off&#8230;Getting to this automated point requires deep collaboration across multiple teams.&#8221;</p>
<p>That collaboration is a &#8220;really big cultural indicator,&#8221; she said, proving that the organization has cultivated the trust needed for DevOps.</p>
<h4>*FOUNDATIONAL PRACTICES*</h4>
<p>In addition to detailing these stages and defining practices, Puppet used the data to identify five &#8220;foundational practices&#8221; &#8212; practices that have a high impact across all five stages of a DevOps journey.</p>
<p>These include reusing deployment patterns when building applications or services (also highlighted in Stage 3), as well as reusing testing patterns. They also include using a configuration management tool and having teams contribute improvements to tooling provided by other teams. Lastly, successful organizations typically have monitoring and alerting configurable by the team operating the service.</p>
<p>The study refers to these as &#8220;foundational&#8221; practices because a plurality of survey respondents who successfully scaled DevOps were employing these practices early on in their journey.</p>
<p>Meanwhile, the foundational practices all reflect some of the core values of DevOps, Mann said. For example, he said, &#8220;We see things like monitoring and alerting being configurable by the team operating the service- it&#8217;s an empowerment model. Allowing them to understand their role in the system and giving them empowerment to create positive outcomes for their organization means this is a core part of what DevOps is.&#8221;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/where-does-devops-start-not-where-you-think/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Essential Salt Commands to Master Configuration Management</title>
		<link>https://www.bestdevops.com/try-these-salt-commands-to-master-the-config-management-tool/</link>
					<comments>https://www.bestdevops.com/try-these-salt-commands-to-master-the-config-management-tool/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Mon, 16 Apr 2018 05:14:52 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[configuration management tool]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[Salt commands]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=3464</guid>

					<description><![CDATA[Learn how to use SaltStack commands for ad hoc tasks, package management, custom repository configuration, and writing custom grains — with practical examples for DevOps engineers.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">The fastest way to build confidence with a new configuration management tool is to work directly with its command-line interface. This tutorial walks through practical SaltStack (Salt) commands covering ad hoc task execution, software installation and removal, custom repository configuration, and writing custom grains in Python.</p>



<p class="wp-block-paragraph">Before following along, ensure Salt is installed on at least one master and one minion, and that you have a basic understanding of core Salt concepts: minions (managed nodes), pillars (secure configuration data), and grains (system properties). The examples reference server names <em>walkerrowe.copahost.com</em> and <em>eurovps</em> — substitute these with your own server names.</p>



<h2 class="wp-block-heading">Start Salt on the Master and Minion</h2>



<p class="wp-block-paragraph">Start the Salt services on the master and minion nodes respectively:</p>


<pre class="wp-block-code"><span><code class="hljs">systemctl start salt-master
systemctl start salt-minion</code></span></pre>


<p class="wp-block-paragraph">While the examples below work with a single server, setting up at least two servers gives you a more realistic sense of how Salt behaves in production environments.</p>



<h3 class="wp-block-heading">Verify Minion Connectivity with test.ping</h3>



<p class="wp-block-paragraph">The Salt <code>test.ping</code> command confirms that a minion is reachable and responsive. Note that this is not equivalent to the Linux <code>ping</code> utility — it does not send ICMP packets. Instead, it verifies that the Salt minion process is running and can communicate with the master.</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">salt <span class="hljs-string">'*'</span> test.ping</code></span></pre>


<p class="wp-block-paragraph">A healthy minion returns <code>True</code>. The <code>'*'</code> glob targets all connected minions.</p>



<h3 class="wp-block-heading">Run Ad Hoc Commands with cmd.run</h3>



<p class="wp-block-paragraph">Salt can execute arbitrary shell commands across minions without needing a state file. Use <code>cmd.run</code> to check disk usage on all minions:</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">salt <span class="hljs-string">'*'</span> cmd.run <span class="hljs-string">'df -h'</span></code></span></pre>


<p class="wp-block-paragraph">The <code>'*'</code> wildcard targets minions by hostname. Salt also supports targeting by grain values, node groups, compound matchers, and other methods — giving you fine-grained control over which nodes receive a command.</p>



<h2 class="wp-block-heading">Install and Remove Software</h2>



<p class="wp-block-paragraph">Salt manages software installation declaratively through state files. The two key files are <code>top.sls</code> (which maps minions to state files) and individual state files such as <code>webserver.sls</code>.</p>



<h3 class="wp-block-heading">Configure the Top File</h3>



<p class="wp-block-paragraph">The top file at <code>/srv/salt/top.sls</code> defines which states apply to which minions. A basic example that applies a webserver state to all minions looks like this:</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">base:
  <span class="hljs-string">'*'</span>:
    - webserver</code></span></pre>


<h3 class="wp-block-heading">Write a State File to Install Apache</h3>



<p class="wp-block-paragraph">Create <code>/srv/salt/webserver.sls</code> to install the Apache HTTP server using Salt&#8217;s <code>pkg</code> module. Both files use YAML format with two-space indentation:</p>


<pre class="wp-block-code"><span><code class="hljs">apache2:
  pkg:
    - installed</code></span></pre>


<p class="wp-block-paragraph">These state files collectively define <strong>highstate</strong> — the desired configuration that minions should reach when <code>state.highstate</code> is applied. Apply highstate to a specific minion:</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">salt <span class="hljs-string">'walkerrowe.copahost.com'</span> state.highstate</code></span></pre>


<p class="wp-block-paragraph">Salt installs Apache and reports a summary of changes made, resources checked, and whether any failures occurred.</p>



<h3 class="wp-block-heading">Remove a Package with pkg.purged</h3>



<p class="wp-block-paragraph">To remove Apache and its configuration files, update <code>webserver.sls</code> to use the <code>purged</code> state. The dot notation <code>pkg.purged</code> is shorthand that calls the purged function — it removes both the package binary and its configuration files:</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">apache2</span>:
  <span class="hljs-selector-tag">pkg</span><span class="hljs-selector-class">.purged</span></code></span></pre>


<p class="wp-block-paragraph">Run highstate again to apply the removal:</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">salt <span class="hljs-string">'walkerrowe.copahost.com'</span> state.highstate</code></span></pre>


<h3 class="wp-block-heading">Use Jinja Templating for OS-Conditional Logic</h3>



<p class="wp-block-paragraph">Salt state files support Jinja2 templating, which you can use to apply different configurations based on grain values such as the OS distribution. The following example installs Apache on Ubuntu and Nginx on CentOS:</p>


<pre class="wp-block-code"><span><code class="hljs language-php">{% <span class="hljs-keyword">if</span> grains&#91;<span class="hljs-string">'osfinger'</span>] == <span class="hljs-string">'Ubuntu-14.04'</span> %}
apache2:
  pkg:
    - installed
{% elif grains&#91;<span class="hljs-string">'osfinger'</span>] == <span class="hljs-string">'CentOS-6'</span> %}
nginx:
  pkg:
    - installed
{% <span class="hljs-keyword">endif</span> %}</code></span></pre>


<p class="wp-block-paragraph">The <code>grains['osfinger']</code> value combines the OS name and major version (e.g., <code>Ubuntu-20.04</code>). Always verify the exact grain value on your systems using <code>salt-call grains.item osfinger</code>.</p>



<h2 class="wp-block-heading">Install a Package from a Custom Repository</h2>



<p class="wp-block-paragraph">Salt can manage package repository definitions through the <code>pkgrepo</code> state module. This example adds the Kubernetes repository on a CentOS minion, then targets by grain (OS property) rather than hostname.</p>



<p class="wp-block-paragraph">Update <code>/srv/salt/top.sls</code> to match on the <code>os</code> grain:</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">base:
  <span class="hljs-string">'os:CentOS'</span>:
    - match: grain
    - kubernetes</code></span></pre>


<p class="wp-block-paragraph">Create <code>/srv/salt/kubernetes.sls</code> to define the repository using Salt&#8217;s <code>pkgrepo.managed</code> state (this example targets yum-based systems):</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">base:
  pkgrepo.managed:
    - name: kubernetes
    - humanname: kubernetes
    - baseurl: http:<span class="hljs-comment">//yum.kubernetes.io/repos/kubernetes-el7-x86_64</span>
    - file: <span class="hljs-regexp">/etc/yum</span>.repos.d/kubernetes.repo
    - key_url: https:<span class="hljs-comment">//packages.cloud.google.com/yum/doc/yum-key.gpg</span></code></span></pre>


<p class="wp-block-paragraph">Run <code>state.highstate</code> and then verify the repository file was created on the minion:</p>


<pre class="wp-block-code"><span><code class="hljs">ls /etc/yum.repos.d/kubernetes.repo
/etc/yum.repos.d/kubernetes.repo</code></span></pre>


<p class="wp-block-paragraph">For apt-based systems such as Ubuntu or Debian, consult the <a href="https://docs.saltstack.com/en/latest/ref/states/all/salt.states.pkg.html" target="_blank" rel="noopener">Salt pkg state documentation</a> for the equivalent configuration using <code>pkgrepo.managed</code> with apt parameters.</p>



<h2 class="wp-block-heading">Write a Custom Grain</h2>



<p class="wp-block-paragraph">Grains are system properties that Salt collects automatically (OS, CPU architecture, IP addresses, etc.). You can extend grains by writing custom Python modules. This example creates a grain that exposes memory usage statistics from the <code>free</code> command.</p>



<p class="wp-block-paragraph"><strong>Note:</strong> This grain module is written for Ubuntu. The output format of <code>free</code> can differ between Linux distributions and versions, so the index positions used to parse the output may need adjustment on other systems.</p>



<h3 class="wp-block-heading">Create the Grain Module</h3>



<p class="wp-block-paragraph">Create the grains directory on the Salt master and open a new Python file:</p>


<pre class="wp-block-code"><span><code class="hljs">mkdir /srv/salt/_grains
vim /srv/salt/_grains/fmem.py</code></span></pre>


<p class="wp-block-paragraph">Add the following Python code. The function calls <code>free</code>, splits the output into tokens, and maps specific token positions to grain keys:</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">import</span> subprocess

def memf():
    x = subprocess.check_output(&#91;<span class="hljs-string">"free"</span>])
    y = x.split()
    grains = {}
    grains&#91;<span class="hljs-string">'totalmem'</span>] = y&#91;<span class="hljs-number">7</span>]
    grains&#91;<span class="hljs-string">'usedmem'</span>]  = y&#91;<span class="hljs-number">8</span>]
    grains&#91;<span class="hljs-string">'freemem'</span>]  = y&#91;<span class="hljs-number">9</span>]
    <span class="hljs-keyword">return</span> grains</code></span></pre>


<h3 class="wp-block-heading">Sync and Verify the Grain</h3>



<p class="wp-block-paragraph">Push the custom grain module to the minion using <code>saltutil.sync_grains</code>. The <code>salt-call</code> command runs Salt locally on the minion you are logged into:</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">salt-call</span> <span class="hljs-selector-tag">saltutil</span><span class="hljs-selector-class">.sync_grains</span></code></span></pre>


<p class="wp-block-paragraph">Salt should confirm the grain was synced:</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">local</span>:
    <span class="hljs-selector-tag">-</span> <span class="hljs-selector-tag">grains</span><span class="hljs-selector-class">.fmem</span></code></span></pre>


<p class="wp-block-paragraph">You can then retrieve the custom grain values:</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">salt-call</span> <span class="hljs-selector-tag">grains</span><span class="hljs-selector-class">.item</span> <span class="hljs-selector-tag">totalmem</span> <span class="hljs-selector-tag">usedmem</span> <span class="hljs-selector-tag">freemem</span></code></span></pre>


<p class="wp-block-paragraph">The output will include the three custom memory grain keys alongside Salt&#8217;s standard grain output.</p>



<h2 class="wp-block-heading">Next Steps</h2>



<p class="wp-block-paragraph">The commands covered here represent a cross-section of what Salt can do: executing ad hoc remote commands, applying declarative state management, managing package repositories by grain targeting, and extending Salt&#8217;s inventory system with custom grains. As you grow more comfortable with these primitives, explore Salt&#8217;s pillar system for secure data management, Salt orchestration for multi-node workflows, and the Salt event bus for reactive automation.</p>



<p class="wp-block-paragraph">Teams evaluating Salt should also compare the open-source and enterprise (Salt, formerly SaltStack Enterprise) editions, and benchmark Salt&#8217;s approach against alternatives such as Ansible, Chef, and Puppet to determine the best fit for their infrastructure scale and workflow requirements.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/try-these-salt-commands-to-master-the-config-management-tool/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
