DevOps (short for Development + Operations) is a software development and operations management methodology that tries to bring agile thinking into all aspects of the application's lifecycle in the enterprise. The concept behind DevOps is to bring software development and operations management teams together, so that they can perform each other's tasks with ease. This idea is quite radical because software development and its maintenance have become compartmentalized to such an extent that concerned teams do not talk to each other.
DevOps aims to re-energize the software development and maintenance activities by co-locating and mixing the teams that are important to the success of the project. The aim is to create a mix of experts such that any person in the team is able to perform any role, as demanded by the situation. Thus, a developer can play the role of a system administrator, while a support person can develop and/or modify source code, if needed. Thus, DevOps advocates that each member of the team be multi-skilled and capable of handling any task that is needed to maintain the application and keep it operational. This view is quite different from the prevalent way of working in silos, where developers do not worry about operational issues and operational teams do not know about development challenges.
The difference between software development advocated by traditional development methodologies as compared to DevOps is depicted in Figure 1 (other methodology) and Figure 2 (DevOps methodology). One of the pillars of DevOps is for cross-functional teams to share the responsibility of ensuring application development, delivery and execution. This is a departure from other software development methodologies.
Figure 1: Traditional Development Model
Figure 2: DevOps Development Model
One of the key principles of DevOps is that the application itself should be configurable and its deployment should involve minimum human intervention. Hence automation plays an important role. In simple terms, it should be possible to configure all aspects of the application, while making it ready for deployment. Applications should not depend on specific machine configurations but should be able to detect machine capabilities and change accordingly. For example, Java applications should not depend on being deployed on Linux systems only. They should work on Windows or UNIX systems equally well. Similarly, application resources should not be hardcoded. For example, an application should not depend on hard-coded machine paths for additional information or on specific IP addresses for connectivity. It should be possible to specific such information while packaging the application or while deploying the application to the target platform.
While the examples mentioned are part of the best practices for software development, they are the key to DevOps, as it advocates that they too be automated.
DevOps Impact on IT Infrastructure
Another principle of DevOps depends is automation. DevOps advocates automation of most of the routine activities carried out by the team. Thus, in addition to the use of infrastructure monitoring tools like Nagios, Ganglia, New Relic, Icinga; tools for automated build like Jenkins, Maven, Ant and Gradle; tools for automated testing like JUnit, JUnitperf, NUnit; DevOps advocates automation of application configuration and deployment. By using tools to manage application configuration and deployment, these tasks become more well-defined, consistent, repeatable, transparent, and hence, less risky.
Given that the DevOps methodology was born out of start-ups and has been in use for some time, many commercial as well as Open Source tools have been developed for help manage configuration and deployment for applications. Some of the popular tools are:
· Puppet – server automation framework and application
· Chef – system integration framework to manage configurations across the entire infrastructure
· Salt – Infrastructure automation and management tool
· Ansible – IT automation and easy deployment platform
· Capistrano – remote server automation and deployment tool.
The Role of Cloud
For proper execution of DevOps, it should be possible to provision, deploy and manage not only applications, but the infrastructure itself using automation. Thus, it should be possible to request a new system (say, a Linux-based Tomcat server with 8GB RAM and 250GB disk space) on-the-fly and do so in a consistent, predictable manner. One of the mechanisms to ensure this flexibility is to adopt the ‘cloud deployment’ model, where applications are deployed on Cloud infrastructure, instead of demanding dedicated infrastructure and resources. With the use of cloud, large infrastructure can easily be shared amongst multiple applications and the available infrastructure can be scaled (up or down, as the case may be), depending on load. It should be noted that such cloud deployment is possible not only on public cloud infrastructure like Amazon AWS or Microsoft Azure, but also internally to an enterprise, by established a private cloud using enterprise resources.
With DevOps advocating cross-pollination of teams and demanding a lot of automation in the tasks of application development, it is important to not ignore important stumbling blocks, namely application configuration and application deployment.
Due to the observation that most applications struggle at the stage of deploying them across multiple instances, DevOps insists that application configuration and deployment also be automated as much as possible. Proper use of automation tools will not only bring consistency into software development, it will also increase the transparency and the confidence level in the deployed application. DevOps stands to benefit from cloud-enabled services like ‘Platform as a Service’ and ‘Infrastructure as a Service’, be they on the public cloud like Amazon AWS or Microsoft Azure or Google AppEngine or the internal data center of the enterprise. With the wider adoption of DevOps, use of automation and tools is set to increase along with the use of cloud-based enterprise applications.