CHAPTER 1 ■ CONFIGURATION MANAGEMENT USING CHEF
2
The Purpose and Principles of Automated Provisioning and
Configuration Management
It would be remiss of me not to mention the DevOps movement early on in this book. While there are many
definitions, I tend to go along with the definition of DevOps being a cultural and technical movement that
focuses on building organizations that are able to operate with stability at high velocity. The term itself
targets the silos that these groups have traditionally found themselves in.
Automation is one of the pillars of the DevOps movement because it can provide quality assurance,
consistency, and repeatability across the realms of both development and operations. This is especially
true in the case of infrastructure automation where manually building individual servers, configuring their
base applications, applying their updates, and patching them was not only a time-consuming task but
also complex and prone to human error. Minor deviations would occur between resources that should be
configured identically, causing unforeseen issues and brittle setups that were hard to reproduce. The term
snowflake server is often used to reflect the uniqueness of those systems.
Many large enterprises have met with challenges scaling their on-premises infrastructure, teams,
and processes to meet the demands of the high-velocity, agile development teams they now service.
Organizational structures would introduce multiple hand-offs into the process with a set of project
requirements being agreed upon up front (generally by a designated architect before the development team
is even assembled). The environments would be designed and scheduled into the pipeline of work across
a large team of disparate skillsets to complete their relevant tasks and then hand over to the development
team on the scheduled date, sometimes weeks and months after the initial requirements were agreed upon.
In the initial days and weeks of using the environment the development team, struggling to run their
application on the delivered environment, would identify new requirements or issues in configuration. After
an indisputable root cause had been established the correcting actions would be scheduled again through
the same waterfall process, elongating the feedback loop, preventing QA activities in the environments, and
often delaying the project launch.
A more incremental, automated approach to provisioning can drastically reduce the feedback loop
on configuration changes and allow development teams to operate at velocity without environment
impediments. By describing your infrastructure platform as code it can be updated frequently as the
requirements of the application evolve over time and because Chef recipes are idempotent , once the
desired state is achieved, future executions of the recipe will result in a no-op (i.e., no changes will be made).
Automation also removes the opportunity for human error to introduce unwanted deviations between
environments and “configuration drift” over time into an unknown state.
Many organizations are moving away from on-premises infrastructure into a cloud environment;
and as they do so, the opportunities to leverage Infrastructure as Code practices greatly increase. Using
a cross-platform provisioning and configuration management tool such as Chef you can now provision
an application architecture consisting of IaaS, PaaS, and SaaS services across a global distribution of data
centers using a common language and framework. Although many examples in this book will focus on IaaS
scenarios, I encourage you not to overlook the many PaaS and SaaS options available in Azure, some of
which may prevent you from reinventing the wheel.
Figure
1-1 shows the separation of Provisioning from Configuration Management from Release
Management. Often in the cloud sense, these terms are used interchangeably whereas I prefer to draw out
the separation of each area as a separate concern. This is because different tooling and artifacts are involved
for each layer of the architecture:
• Provisioning is concerned with the specification of the guest and operating system
on top of a host. The host could be a virtualization layer such as a hypervisor or
a cloud platform such as Microsoft Azure. The point is that in this layer we know
nothing about the application that is going to run on top of it.
www.it-ebooks.info